diff --git a/ SDPose-Wholebody/README.md b/ SDPose-Wholebody/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..e376a63f46becfd4ac7005225a69fbb1b07f2dbd
--- /dev/null
+++ b/ SDPose-Wholebody/README.md
@@ -0,0 +1,137 @@
+---
+language: en
+license: mit
+tags:
+- pose-estimation
+- computer-vision
+- keypoint-detection
+- diffusion-models
+- stable-diffusion
+- out-of-distribution
+- human-pose
+- top-down-pose-estimation
+- coco
+- mmpose
+library_name: pytorch
+---
+
+# SDPose: Exploiting Diffusion Priors for Out-of-Domain and Robust Pose Estimation (WholeBody - 133 Keypoints)
+
+
+
+[](https://arxiv.org/abs/2509.24980)
+[](https://t-s-liang.github.io/SDPose)
+[](https://huggingface.co/spaces/teemosliang/SDPose-Body)
+[](https://opensource.org/licenses/MIT)
+
+
+
+## Model Description
+
+**SDPose** is a state-of-the-art human pose estimation model that leverages the powerful visual priors from **Stable Diffusion** to achieve exceptional performance on out-of-distribution (OOD) scenarios. This model variant estimates **133 wholebody keypoints,** including body, hands, face, feet.
+
+### Model Architecture
+
+SDPose employs a **U-Net backbone** initialized with Stable Diffusion v2 weights, combined with a specialized heatmap head for keypoint prediction. The model operates in a top-down manner:
+
+1. **Person Detection**: Detect human bounding boxes using an object detector (e.g., YOLO11-x)
+2. **Pose Estimation**: Crop and estimate 17 body keypoints for each detected person
+3. **Heatmap Generation**: Produce confidence heatmaps for precise keypoint estimation
+
+**Model Specifications:**
+- **Backbone**: Stable Diffusion v2 U-Net (fine-tuned; minimal architectural changes)
+- **Head**: Custom heatmap prediction head
+- **Input Resolution**: 1024×768 (H×W)
+- **Output**: 133 keypoint heatmaps + coordinates with confidence scores
+- **Framework**: MMPose
+
+## Supported Keypoints (COCO Wholebody Format)
+
+The model predicts 133 body keypoints following the COCO Wholebody keypoint format.
+
+
+
+
+
+## Intended Use
+
+- Human pose estimation in natural images
+- Pose estimation in artistic and stylized domains (paintings, anime, sketches)
+- Animation and video pose tracking
+- Cross-domain pose analysis and research
+- Applications requiring robust pose estimation under distribution shifts
+
+## How to Use
+
+### Installation
+
+```bash
+# Clone the repository
+git clone https://github.com/t-s-liang/SDPose-OOD.git
+cd SDPose-OOD
+
+# Install dependencies
+pip install -r requirements.txt
+# Download YOLO11-x for human detection
+wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11x.pt -P models/
+
+# Launch Gradio interface
+cd gradio_app
+bash launch_gradio.sh
+```
+
+## Training Data
+
+### Datasets
+
+Trained exclusively on COCO-2017 train2017 (no extra data).
+
+- **COCO-Wholebody (Common Objects in Context)**: 200K+ images with 133 wholebody keypoints
+
+### Preprocessing
+
+- Images are resized and cropped to 1024×768 resolution
+- Augmentation: random horizontal flip, half-body & bbox transforms, UDP affine; Albumentations (Gaussian/Median blur, coarse dropout).
+- Heatmaps: UDP codec (MMPose style).
+
+### Comparison with Baselines
+
+SDPose significantly outperforms traditional pose estimation models (e.g., Sapiens) on out-of-distribution benchmarks while maintaining competitive performance on in-domain data.
+
+See our [paper](https://arxiv.org/abs/2509.24980) for comprehensive evaluation results.
+
+## Citation
+
+If you use SDPose in your research, please cite our paper:
+
+```bibtex
+@misc{liang2025sdposeexploitingdiffusionpriors,
+ title={SDPose: Exploiting Diffusion Priors for Out-of-Domain and Robust Pose Estimation},
+ author={Shuang Liang and Jing He and Chuanmeizhi Wang and Lejun Liao and Guo Zhang and Yingcong Chen and Yuan Yuan},
+ year={2025},
+ eprint={2509.24980},
+ archivePrefix={arXiv},
+ primaryClass={cs.CV},
+ url={https://arxiv.org/abs/2509.24980},
+}
+```
+
+## License
+
+This model is released under the [MIT License](https://opensource.org/licenses/MIT).
+
+## Additional Resources
+
+- 🌐 **Project Website**: [https://t-s-liang.github.io/SDPose](https://t-s-liang.github.io/SDPose)
+- 📄 **Paper**: [arXiv:2509.24980](https://arxiv.org/abs/2509.24980)
+- 💻 **Code Repository**: [GitHub](https://github.com/t-s-liang/SDPose-OOD)
+- 🤗 **Demo**: [HuggingFace Space](https://huggingface.co/spaces/teemosliang/SDPose-Body)
+- 📧 **Contact**: tsliang2001@gmail.com
+
+---
+
+
+
+**⭐ Star us on GitHub — it motivates us a lot!**
+
+
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/LICENSE b/ SDPose-Wholebody/SDPose-OOD-main/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..ba41c82c463ce32d81497e59f953b08ebcbe162c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 S. Liang
+
+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.
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/README.md b/ SDPose-Wholebody/SDPose-OOD-main/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..f064a74678f08198ea0e3d3f342765f04d60ae5d
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/README.md
@@ -0,0 +1,319 @@
+
+
+

+
+# SDPose: Exploiting Diffusion Priors for Out-of-Domain and Robust Pose Estimation
+
+[](https://t-s-liang.github.io/SDPose)
+[](https://arxiv.org/pdf/2509.24980v2)
+[](https://huggingface.co/teemosliang/SDPose-Body)
+[](https://huggingface.co/teemosliang/SDPose-Wholebody)
+[](https://huggingface.co/spaces/teemosliang/SDPose)
+[](https://github.com/judian17/ComfyUI-SDPose-OOD)
+[](https://opensource.org/licenses/MIT)
+
+[Shuang Liang](https://t-s-liang.github.io)
1,4*,
+[Jing He](https://scholar.google.com/citations?hl=en&user=RsLS11MAAAAJ)
3,
+Chuanmeizhi Wang
1,
+Lejun Liao
2,
+Guo Zhang
1,
+[Ying-Cong Chen](https://www.yingcong.me/)
3,5
+[Yuan Yuan](https://yyuanad.github.io/)
2†
+
+
1Rama Alpaca Technology Company,
2Boston College,
3HKUST(GZ),
4The University of Hong Kong,
5HKUST
+
+
*Work done during an internship at Rama Alpaca Technology.
†Corresponding author.
+
+
+
+---
+
+## 📢 News
+- **[2025-Dec-03]** 📄 Revised version of our paper released on [arXiv](https://arxiv.org/pdf/2509.24980v2).
+- **[2025-Oct-28]** 🧩 **ComfyUI node of SDPose-OOD** is now available! We sincerely thank [@judian17](https://github.com/judian17) and [@Piscesbody](https://github.com/Piscesbody) for their excellent contribution in developing this ComfyUI node, which enables downstream ComfyUI workflows and helps more people explore and apply our work. 🔗 Check it out here: [**ComfyUI-SDPose-OOD**](https://github.com/judian17/ComfyUI-SDPose-OOD)
+- **[2025-Oct-14]** 🚀 **Wholebody model** and **Huggingface Space Demo** released! You can now run SDPose demos in our Huggingface space! Check out our [🤗 SDPose Huggingface Space](https://huggingface.co/spaces/teemosliang/SDPose) and [🤗 SDPose-Wholebody Model Repository](https://huggingface.co/teemosliang/SDPose-Wholebody).
+- **[2025-Oct-13]** 🚀 **Gradio local deployment script** released! You can now run SDPose demos locally on your machine.
+- **[2025-Oct-12]** 🎉 **Body model**, **COCO-OOD validation Benchmark** and **inference code** released! Check out our [🤗 SDPose-Body Model Repository](https://huggingface.co/teemosliang/SDPose-Body).
+- **[2025-Sep-29]** 📄 Paper released on [arXiv](https://arxiv.org/abs/2509.24980).
+
+### 🚀 Coming Soon
+- [ ] We plan to release the training scripts upon the acceptance of the paper.
+- [x] **HuggingFace space demo** release
+- [x] **WholeBody model** release
+- [x] **Gradio local deployment script** release
+- [x] **Body model** and **Inference code** release
+- [x] **COCO-OOD Validation Benchmark** release
+---
+
+## 🔥 Highlights
+
+**SDPose** leverages the powerful visual priors from **Stable Diffusion** to achieve state-of-the-art performance in:
+
+- ✅ **Out-of-Domain (OOD) Generalization**: Superior performance on unseen domains without fine-tuning
+- ✅ **Robust Pose Estimation**: Handles challenging scenarios including occlusions, rare poses, and artistic styles
+- ✅ **Body & Wholebody Support**: Supports both body keypoints (17) and wholebody keypoints (133)
+
+---
+
+## 🎬 Demo: Animation Video Pose Estimation in the Wild
+
+**SDPose** demonstrates robust performance on animation videos.
+
+
+
+
+ 
+
+ |
+
+
+ 
+
+ |
+
+
+ 
+
+ |
+
+
+ 
+
+ |
+
+
+
+
+
+> 💡 **Tip**: For more interactive demos and real-time inference, check out our [🤗 HuggingFace Spaces](https://huggingface.co/spaces/teemosliang/SDPose-Body)!
+
+---
+
+## 🎨 Visualization
+
+### Body Pose Estimation (17 Keypoints)
+
+
+

+
+
+### Wholebody Pose Estimation (133 Keypoints)
+
+
+

+
+
+---
+
+## 🛠️ Setup
+
+### Installation
+
+1. **Clone the repository**
+
+```bash
+git clone https://github.com/t-s-liang/SDPose-OOD.git
+cd SDPose-OOD
+```
+
+2. **Create a conda environment**
+
+```bash
+conda create -n SDPose python=3.10
+conda activate SDPose
+```
+
+3. **Install dependencies**
+
+```bash
+pip install -r requirements.txt
+```
+
+### Download Pre-trained Models
+
+Download the pre-trained **Body model** checkpoint from our HuggingFace Model repository:
+
+**🤗 [SDPose-Body Model](https://huggingface.co/teemosliang/SDPose-Body)**
+**🤗 [SDPose-Wholebody Model](https://huggingface.co/teemosliang/SDPose-Wholebody)**
+The model repository contains the checkpoint files and detailed usage instructions.
+
+## 🤗 Gradio Demo
+
+We provide interactive **Gradio demos** on HuggingFace Spaces:
+
+- 🤗 **[SDPose Huggingface Space Demo](https://huggingface.co/spaces/teemosliang/SDPose)**
+
+### Run Gradio Demo Locally
+
+You can now run the Gradio demo on your local machine!
+
+#### Prerequisites
+
+Since SDPose is a **top-down pose estimation** method, it requires an object detection model to detect humans in the image first. We recommend using **YOLO11-x** for robust human detection:
+
+**Download YOLO11-x model:**
+```bash
+# Download the YOLO11-x pretrained model
+wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11x.pt -P models/
+```
+
+#### Launch Gradio App
+
+```bash
+cd gradio_app
+bash launch_gradio.sh
+```
+
+The Gradio interface will be available at `http://localhost:7860` (or the port specified in the launch script).
+
+---
+
+## 🕹️ Inference
+
+### Evaluation
+
+Use the provided evaluation script to run inference on standard pose estimation benchmarks.
+
+#### Configuration
+
+Edit `scripts/eval.sh` to configure the evaluation parameters:
+
+```bash
+# Dataset settings
+dataset_name='COCO' # Dataset name: COCO, HumanArt, etc.
+keypoint_scheme='body' # 'body' (17 keypoints) or 'wholebody' (133 keypoints)
+dataset_root='/path/to/datasets' # Root directory of datasets
+ann_file='/path/to/annotation.json' # Annotation file path
+
+# Model settings
+checkpoint_path='/path/to/checkpoint' # Path to SDPose checkpoint
+
+# Inference settings
+eval_batch_size=16 # Batch size per GPU
+dataloader_num_workers=16 # Number of data loading workers
+```
+#### Dataset Preparation and Evaluation
+
+For COCO evaluation, please download the precomputed person detection bounding boxes from:
+https://huggingface.co/noahcao/sapiens-pose-coco/tree/main/sapiens_host/pose/person_detection_results
+
+These detection results are required for evaluation under the top-down protocol on COCO, COCO-OOD, and COCO-WholeBody.
+
+The expected directory structure is:
+```bash
+${DATASET_ROOT}/
+│
+├── COCO/
+│ ├── annotations/
+│ │ ├── person_keypoints_train2017.json
+│ │ ├── person_keypoints_val2017.json
+│ │ ├── coco_wholebody_train_v1.0.json
+│ │ └── coco_wholebody_val_v1.0.json
+│ │
+│ ├── train2017/
+│ ├── val2017/
+│ ├── val2017oil/
+│ └── person_detection_results/
+│ └── COCO_val2017_detections_AP_H_70_person.json
+│
+└── HumanArt/
+ ├── annotations/
+ │ └── validation_humanart.json
+ └── images/
+
+When running evaluation, the dataloader will automatically locate the correct annotation and bounding box files based on the specified dataset name:
+- COCO → standard COCO validation
+- COCO_OOD → COCO stylized (val2017oil)
+- COCOWholebody → COCO-WholeBody validation
+- COCO-OOD_Wholebody → COCO-WholeBody OOD validation
+- HumanArt → HumanArt validation set
+```
+
+#### Run Evaluation
+
+```bash
+cd scripts
+bash eval.sh
+```
+
+This will:
+1. Load the SDPose model from the checkpoint
+2. Run inference on the specified dataset
+3. Compute evaluation metrics (AP, AR, etc.)
+4. Print results to console
+
+---
+
+## 📊 COCO-OOD Dataset
+
+
+

+
+
+To complement the HumanArt dataset and enable OOD evaluation under matched content and labels, we constructed **COCO-OOD** by applying artistic style transfer to the original COCO images.
+
+### Dataset Construction
+
+We adopt the official [CycleGAN](https://github.com/junyanz/CycleGAN) and [StyTR2](https://github.com/diyiiyiii/StyTR-2) framework to perform image-to-image translation from the COCO domain (natural photographs) to the target domain of Ukiyo-e and Monet-style paintings. During conversion, all validation images in COCO are processed to produce style-transferred counterparts, while preserving their original human annotations (bounding boxes, keypoints). This yields an OOD variant of COCO in which the underlying scene structure is unchanged, but the texture, color palette, and brushstroke patterns are consistent with oil/ukiyo-e artistic style. We also utilize Nano-banana as a style transfer tool to produce color sketch versions of COCO-OOD.
+
+Importantly, for fair comparison and to avoid introducing priors from large-scale pretrained diffusion models, we intentionally adopt the earlier StyTR2 and CycleGAN framework rather than more recent style transfer methods. Such stylization introduces a significant appearance shift while keeping pose-related geometric information intact, making it suitable for robust pose estimation evaluation.
+
+### Download
+
+📥 **[Download COCO-OOD Dataset](https://drive.google.com/file/d/1T38S8gP406FGAoDmYv7eeThMWRLi3DkR/view)** from Google Drive
+
+---
+
+## 🎓 Citation
+
+If you find SDPose useful in your research, please consider citing:
+
+```bibtex
+@misc{liang2025sdposeexploitingdiffusionpriors,
+ title={SDPose: Exploiting Diffusion Priors for Out-of-Domain and Robust Pose Estimation},
+ author={Shuang Liang and Jing He and Chuanmeizhi Wang and Lejun Liao and Guo Zhang and Yingcong Chen and Yuan Yuan},
+ year={2025},
+ eprint={2509.24980},
+ archivePrefix={arXiv},
+ primaryClass={cs.CV},
+ url={https://arxiv.org/abs/2509.24980},
+}
+```
+
+---
+
+## 📄 License
+
+This project is released under the [MIT License](LICENSE).
+
+---
+
+## 🙏 Acknowledgements
+
+This project is built upon the following excellent open-source projects:
+
+- [MMPose](https://github.com/open-mmlab/mmpose): OpenMMLab pose estimation toolbox
+- [Diffusers](https://github.com/huggingface/diffusers): HuggingFace diffusion models library
+- [Marigold](https://github.com/prs-eth/marigold): Diffusion-based depth estimation
+- [Lotus](https://github.com/EnVision-Research/Lotus): Diffusion-based dense prediction
+- [Stable Diffusion](https://github.com/Stability-AI/stablediffusion): Latent diffusion models
+- [CycleGAN](https://github.com/junyanz/CycleGAN): Style Transfer for the COCO-OOD Ukiyo-e variant.
+- [StyTR2](https://github.com/diyiiyiii/StyTR-2): Style Transfer for the COCO-OOD Monet-oil variant.
+---
+
+## 📧 Contact
+
+For questions, suggestions, or collaboration inquiries:
+
+- **Shuang Liang**: [tsliang2001@gmail.com](mailto:tsliang2001@gmail.com)
+- **Project Page**: [https://t-s-liang.github.io/SDPose](https://t-s-liang.github.io/SDPose)
+
+---
+
+
+
+**⭐ Star us on GitHub - it motivates us a lot!**
+
+[🌐 Website](https://t-s-liang.github.io/SDPose) | [📄 Paper](https://arxiv.org/abs/2509.24980) | [🤗 Model-Body](https://huggingface.co/teemosliang/SDPose-Body) | [🤗 Model-Wholebody](https://huggingface.co/teemosliang/SDPose-Wholebody) | [🤗 Demo](https://huggingface.co/spaces/teemosliang/SDPose)
+
+
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/assets/examples/Anime.png b/ SDPose-Wholebody/SDPose-OOD-main/assets/examples/Anime.png
new file mode 100644
index 0000000000000000000000000000000000000000..531e1d593f46be5a7036d63a2b839fe0b648b9e4
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/assets/examples/Anime.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:12f672bc5f76ecf51b4d6fc3a6501abc997dea77b53f3e1268575bb0da6478ba
+size 6280853
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/assets/examples/COCOOOD_Dataset.png b/ SDPose-Wholebody/SDPose-OOD-main/assets/examples/COCOOOD_Dataset.png
new file mode 100644
index 0000000000000000000000000000000000000000..96ecfad282058ce46b24f2d59985a130c7716860
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/assets/examples/COCOOOD_Dataset.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b660ef06b5f39f724e59bc31788b77df9f92193a756c6063f54646735286b522
+size 1092146
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/assets/examples/Teaser.png b/ SDPose-Wholebody/SDPose-OOD-main/assets/examples/Teaser.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a37c1042f625e9f37823125e6b34ba896af87be
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/assets/examples/Teaser.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5aa192f8fe638e3a4b4ca46878d3f9425a00e0c0373a97f87c2ca553074e1f51
+size 4969318
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/assets/logo/logo.png b/ SDPose-Wholebody/SDPose-OOD-main/assets/logo/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..15ef38156fe9dc83fffa7fd14af3b76c3464b798
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/assets/logo/logo.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:736d4218e353cfe716d6c3d89c7f613abbedb4c28cf8f691f987a09b7269ceec
+size 1000555
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/hongxia.gif b/ SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/hongxia.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6168e82ad6f110eaa76c8428cfbd57157d894d35
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/hongxia.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e0eaea0f881c8cdaf677bac0b421e9213cbe311d1f845b39c4b9144f7e2f9240
+size 4757720
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/laoba.gif b/ SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/laoba.gif
new file mode 100644
index 0000000000000000000000000000000000000000..b5a2bbca29a78874fd8641db4ea7947c84b90fed
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/laoba.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1a7919a5833cb3c4374a00a50d0e8f8450735a4ead1d8b7d9c5c475713d7bc95
+size 8743822
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/nina.gif b/ SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/nina.gif
new file mode 100644
index 0000000000000000000000000000000000000000..88d02339f2acb2e50e5f7fce6cd49d59b10182d5
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/nina.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eee3529c38802c66c477c4e670e2ee0109588d94db46f254f28f6c1cd29a627c
+size 8049679
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/xiduo.gif b/ SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/xiduo.gif
new file mode 100644
index 0000000000000000000000000000000000000000..1ab5003172d76244549fa7cf132262f16c6b4cbe
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/xiduo.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9865d73e6345dd74dee0beb1d1ccf3185cd43fb0d318db1d0efc2a13c5c6cb74
+size 5091093
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/300w.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/300w.py
new file mode 100644
index 0000000000000000000000000000000000000000..304100ce87c06f9025c9117cc07afe6a4434f9fe
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/300w.py
@@ -0,0 +1,140 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='300w',
+ paper_info=dict(
+ author='Sagonas, Christos and Antonakos, Epameinondas '
+ 'and Tzimiropoulos, Georgios and Zafeiriou, Stefanos '
+ 'and Pantic, Maja',
+ title='300 faces in-the-wild challenge: '
+ 'Database and results',
+ container='Image and vision computing',
+ year='2016',
+ homepage='https://ibug.doc.ic.ac.uk/resources/300-W/',
+ ),
+ keypoint_info={
+ 0: dict(name='kpt-0', id=0, color=[255, 0, 0], type='', swap='kpt-16'),
+ 1: dict(name='kpt-1', id=1, color=[255, 0, 0], type='', swap='kpt-15'),
+ 2: dict(name='kpt-2', id=2, color=[255, 0, 0], type='', swap='kpt-14'),
+ 3: dict(name='kpt-3', id=3, color=[255, 0, 0], type='', swap='kpt-13'),
+ 4: dict(name='kpt-4', id=4, color=[255, 0, 0], type='', swap='kpt-12'),
+ 5: dict(name='kpt-5', id=5, color=[255, 0, 0], type='', swap='kpt-11'),
+ 6: dict(name='kpt-6', id=6, color=[255, 0, 0], type='', swap='kpt-10'),
+ 7: dict(name='kpt-7', id=7, color=[255, 0, 0], type='', swap='kpt-9'),
+ 8: dict(name='kpt-8', id=8, color=[255, 0, 0], type='', swap=''),
+ 9: dict(name='kpt-9', id=9, color=[255, 0, 0], type='', swap='kpt-7'),
+ 10:
+ dict(name='kpt-10', id=10, color=[255, 0, 0], type='', swap='kpt-6'),
+ 11:
+ dict(name='kpt-11', id=11, color=[255, 0, 0], type='', swap='kpt-5'),
+ 12:
+ dict(name='kpt-12', id=12, color=[255, 0, 0], type='', swap='kpt-4'),
+ 13:
+ dict(name='kpt-13', id=13, color=[255, 0, 0], type='', swap='kpt-3'),
+ 14:
+ dict(name='kpt-14', id=14, color=[255, 0, 0], type='', swap='kpt-2'),
+ 15:
+ dict(name='kpt-15', id=15, color=[255, 0, 0], type='', swap='kpt-1'),
+ 16:
+ dict(name='kpt-16', id=16, color=[255, 0, 0], type='', swap='kpt-0'),
+ 17:
+ dict(name='kpt-17', id=17, color=[255, 0, 0], type='', swap='kpt-26'),
+ 18:
+ dict(name='kpt-18', id=18, color=[255, 0, 0], type='', swap='kpt-25'),
+ 19:
+ dict(name='kpt-19', id=19, color=[255, 0, 0], type='', swap='kpt-24'),
+ 20:
+ dict(name='kpt-20', id=20, color=[255, 0, 0], type='', swap='kpt-23'),
+ 21:
+ dict(name='kpt-21', id=21, color=[255, 0, 0], type='', swap='kpt-22'),
+ 22:
+ dict(name='kpt-22', id=22, color=[255, 0, 0], type='', swap='kpt-21'),
+ 23:
+ dict(name='kpt-23', id=23, color=[255, 0, 0], type='', swap='kpt-20'),
+ 24:
+ dict(name='kpt-24', id=24, color=[255, 0, 0], type='', swap='kpt-19'),
+ 25:
+ dict(name='kpt-25', id=25, color=[255, 0, 0], type='', swap='kpt-18'),
+ 26:
+ dict(name='kpt-26', id=26, color=[255, 0, 0], type='', swap='kpt-17'),
+ 27: dict(name='kpt-27', id=27, color=[255, 0, 0], type='', swap=''),
+ 28: dict(name='kpt-28', id=28, color=[255, 0, 0], type='', swap=''),
+ 29: dict(name='kpt-29', id=29, color=[255, 0, 0], type='', swap=''),
+ 30: dict(name='kpt-30', id=30, color=[255, 0, 0], type='', swap=''),
+ 31:
+ dict(name='kpt-31', id=31, color=[255, 0, 0], type='', swap='kpt-35'),
+ 32:
+ dict(name='kpt-32', id=32, color=[255, 0, 0], type='', swap='kpt-34'),
+ 33: dict(name='kpt-33', id=33, color=[255, 0, 0], type='', swap=''),
+ 34:
+ dict(name='kpt-34', id=34, color=[255, 0, 0], type='', swap='kpt-32'),
+ 35:
+ dict(name='kpt-35', id=35, color=[255, 0, 0], type='', swap='kpt-31'),
+ 36:
+ dict(name='kpt-36', id=36, color=[255, 0, 0], type='', swap='kpt-45'),
+ 37:
+ dict(name='kpt-37', id=37, color=[255, 0, 0], type='', swap='kpt-44'),
+ 38:
+ dict(name='kpt-38', id=38, color=[255, 0, 0], type='', swap='kpt-43'),
+ 39:
+ dict(name='kpt-39', id=39, color=[255, 0, 0], type='', swap='kpt-42'),
+ 40:
+ dict(name='kpt-40', id=40, color=[255, 0, 0], type='', swap='kpt-47'),
+ 41: dict(
+ name='kpt-41', id=41, color=[255, 0, 0], type='', swap='kpt-46'),
+ 42: dict(
+ name='kpt-42', id=42, color=[255, 0, 0], type='', swap='kpt-39'),
+ 43: dict(
+ name='kpt-43', id=43, color=[255, 0, 0], type='', swap='kpt-38'),
+ 44: dict(
+ name='kpt-44', id=44, color=[255, 0, 0], type='', swap='kpt-37'),
+ 45: dict(
+ name='kpt-45', id=45, color=[255, 0, 0], type='', swap='kpt-36'),
+ 46: dict(
+ name='kpt-46', id=46, color=[255, 0, 0], type='', swap='kpt-41'),
+ 47: dict(
+ name='kpt-47', id=47, color=[255, 0, 0], type='', swap='kpt-40'),
+ 48: dict(
+ name='kpt-48', id=48, color=[255, 0, 0], type='', swap='kpt-54'),
+ 49: dict(
+ name='kpt-49', id=49, color=[255, 0, 0], type='', swap='kpt-53'),
+ 50: dict(
+ name='kpt-50', id=50, color=[255, 0, 0], type='', swap='kpt-52'),
+ 51: dict(name='kpt-51', id=51, color=[255, 0, 0], type='', swap=''),
+ 52: dict(
+ name='kpt-52', id=52, color=[255, 0, 0], type='', swap='kpt-50'),
+ 53: dict(
+ name='kpt-53', id=53, color=[255, 0, 0], type='', swap='kpt-49'),
+ 54: dict(
+ name='kpt-54', id=54, color=[255, 0, 0], type='', swap='kpt-48'),
+ 55: dict(
+ name='kpt-55', id=55, color=[255, 0, 0], type='', swap='kpt-59'),
+ 56: dict(
+ name='kpt-56', id=56, color=[255, 0, 0], type='', swap='kpt-58'),
+ 57: dict(name='kpt-57', id=57, color=[255, 0, 0], type='', swap=''),
+ 58: dict(
+ name='kpt-58', id=58, color=[255, 0, 0], type='', swap='kpt-56'),
+ 59: dict(
+ name='kpt-59', id=59, color=[255, 0, 0], type='', swap='kpt-55'),
+ 60: dict(
+ name='kpt-60', id=60, color=[255, 0, 0], type='', swap='kpt-64'),
+ 61: dict(
+ name='kpt-61', id=61, color=[255, 0, 0], type='', swap='kpt-63'),
+ 62: dict(name='kpt-62', id=62, color=[255, 0, 0], type='', swap=''),
+ 63: dict(
+ name='kpt-63', id=63, color=[255, 0, 0], type='', swap='kpt-61'),
+ 64: dict(
+ name='kpt-64', id=64, color=[255, 0, 0], type='', swap='kpt-60'),
+ 65: dict(
+ name='kpt-65', id=65, color=[255, 0, 0], type='', swap='kpt-67'),
+ 66: dict(name='kpt-66', id=66, color=[255, 0, 0], type='', swap=''),
+ 67: dict(
+ name='kpt-67', id=67, color=[255, 0, 0], type='', swap='kpt-65'),
+ },
+ skeleton_info={},
+ joint_weights=[1.] * 68,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/aic.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/aic.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..596f59b10a05c63986f18d7befec5b15a7f5ccbc
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/aic.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/coco.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/coco.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5c9fbc6ff3bc89ba0b419740a3b5f0b782e4d077
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/coco.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/coco_wholebody.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/coco_wholebody.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bab770d8444ba402facb5e46c83d46880f425923
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/coco_wholebody.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/crowdpose.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/crowdpose.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..18bd8e479bf57b5f6d6eec4a4986ee916072ea0b
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/crowdpose.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/goliath.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/goliath.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..04ba377ed7684446a9f366ee6f090ba41ba94b56
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/goliath.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/goliath3d.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/goliath3d.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2d12407cf66737358fc643f2c1e7dba99e98283c
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/goliath3d.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/mpii.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/mpii.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..049cdd271407e7c4eb527120d679ecad9a85013c
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/__pycache__/mpii.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/aflw.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/aflw.py
new file mode 100644
index 0000000000000000000000000000000000000000..7e90a081877214c9c36db2e6115eb55d181a0edd
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/aflw.py
@@ -0,0 +1,50 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='aflw',
+ paper_info=dict(
+ author='Koestinger, Martin and Wohlhart, Paul and '
+ 'Roth, Peter M and Bischof, Horst',
+ title='Annotated facial landmarks in the wild: '
+ 'A large-scale, real-world database for facial '
+ 'landmark localization',
+ container='2011 IEEE international conference on computer '
+ 'vision workshops (ICCV workshops)',
+ year='2011',
+ homepage='https://www.tugraz.at/institute/icg/research/'
+ 'team-bischof/lrs/downloads/aflw/',
+ ),
+ keypoint_info={
+ 0: dict(name='kpt-0', id=0, color=[255, 0, 0], type='', swap='kpt-5'),
+ 1: dict(name='kpt-1', id=1, color=[255, 0, 0], type='', swap='kpt-4'),
+ 2: dict(name='kpt-2', id=2, color=[255, 0, 0], type='', swap='kpt-3'),
+ 3: dict(name='kpt-3', id=3, color=[255, 0, 0], type='', swap='kpt-2'),
+ 4: dict(name='kpt-4', id=4, color=[255, 0, 0], type='', swap='kpt-1'),
+ 5: dict(name='kpt-5', id=5, color=[255, 0, 0], type='', swap='kpt-0'),
+ 6: dict(name='kpt-6', id=6, color=[255, 0, 0], type='', swap='kpt-11'),
+ 7: dict(name='kpt-7', id=7, color=[255, 0, 0], type='', swap='kpt-10'),
+ 8: dict(name='kpt-8', id=8, color=[255, 0, 0], type='', swap='kpt-9'),
+ 9: dict(name='kpt-9', id=9, color=[255, 0, 0], type='', swap='kpt-8'),
+ 10:
+ dict(name='kpt-10', id=10, color=[255, 0, 0], type='', swap='kpt-7'),
+ 11:
+ dict(name='kpt-11', id=11, color=[255, 0, 0], type='', swap='kpt-6'),
+ 12:
+ dict(name='kpt-12', id=12, color=[255, 0, 0], type='', swap='kpt-14'),
+ 13: dict(name='kpt-13', id=13, color=[255, 0, 0], type='', swap=''),
+ 14:
+ dict(name='kpt-14', id=14, color=[255, 0, 0], type='', swap='kpt-12'),
+ 15:
+ dict(name='kpt-15', id=15, color=[255, 0, 0], type='', swap='kpt-17'),
+ 16: dict(name='kpt-16', id=16, color=[255, 0, 0], type='', swap=''),
+ 17:
+ dict(name='kpt-17', id=17, color=[255, 0, 0], type='', swap='kpt-15'),
+ 18: dict(name='kpt-18', id=18, color=[255, 0, 0], type='', swap='')
+ },
+ skeleton_info={},
+ joint_weights=[1.] * 19,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/aic.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/aic.py
new file mode 100644
index 0000000000000000000000000000000000000000..3c5a37143d3c70d6c23474e051534e053a7dd80f
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/aic.py
@@ -0,0 +1,146 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='aic',
+ paper_info=dict(
+ author='Wu, Jiahong and Zheng, He and Zhao, Bo and '
+ 'Li, Yixin and Yan, Baoming and Liang, Rui and '
+ 'Wang, Wenjia and Zhou, Shipei and Lin, Guosen and '
+ 'Fu, Yanwei and others',
+ title='Ai challenger: A large-scale dataset for going '
+ 'deeper in image understanding',
+ container='arXiv',
+ year='2017',
+ homepage='https://github.com/AIChallenger/AI_Challenger_2017',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='right_shoulder',
+ id=0,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 1:
+ dict(
+ name='right_elbow',
+ id=1,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 2:
+ dict(
+ name='right_wrist',
+ id=2,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 3:
+ dict(
+ name='left_shoulder',
+ id=3,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 4:
+ dict(
+ name='left_elbow',
+ id=4,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 5:
+ dict(
+ name='left_wrist',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 6:
+ dict(
+ name='right_hip',
+ id=6,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 7:
+ dict(
+ name='right_knee',
+ id=7,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 8:
+ dict(
+ name='right_ankle',
+ id=8,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle'),
+ 9:
+ dict(
+ name='left_hip',
+ id=9,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 10:
+ dict(
+ name='left_knee',
+ id=10,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 11:
+ dict(
+ name='left_ankle',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 12:
+ dict(
+ name='head_top',
+ id=12,
+ color=[51, 153, 255],
+ type='upper',
+ swap=''),
+ 13:
+ dict(name='neck', id=13, color=[51, 153, 255], type='upper', swap='')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('right_wrist', 'right_elbow'), id=0, color=[255, 128, 0]),
+ 1: dict(
+ link=('right_elbow', 'right_shoulder'), id=1, color=[255, 128, 0]),
+ 2: dict(link=('right_shoulder', 'neck'), id=2, color=[51, 153, 255]),
+ 3: dict(link=('neck', 'left_shoulder'), id=3, color=[51, 153, 255]),
+ 4: dict(link=('left_shoulder', 'left_elbow'), id=4, color=[0, 255, 0]),
+ 5: dict(link=('left_elbow', 'left_wrist'), id=5, color=[0, 255, 0]),
+ 6: dict(link=('right_ankle', 'right_knee'), id=6, color=[255, 128, 0]),
+ 7: dict(link=('right_knee', 'right_hip'), id=7, color=[255, 128, 0]),
+ 8: dict(link=('right_hip', 'left_hip'), id=8, color=[51, 153, 255]),
+ 9: dict(link=('left_hip', 'left_knee'), id=9, color=[0, 255, 0]),
+ 10: dict(link=('left_knee', 'left_ankle'), id=10, color=[0, 255, 0]),
+ 11: dict(link=('head_top', 'neck'), id=11, color=[51, 153, 255]),
+ 12: dict(
+ link=('right_shoulder', 'right_hip'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('left_shoulder', 'left_hip'), id=13, color=[51, 153, 255])
+ },
+ joint_weights=[
+ 1., 1.2, 1.5, 1., 1.2, 1.5, 1., 1.2, 1.5, 1., 1.2, 1.5, 1., 1.
+ ],
+
+ # 'https://github.com/AIChallenger/AI_Challenger_2017/blob/master/'
+ # 'Evaluation/keypoint_eval/keypoint_eval.py#L50'
+ # delta = 2 x sigma
+ sigmas=[
+ 0.01388152, 0.01515228, 0.01057665, 0.01417709, 0.01497891, 0.01402144,
+ 0.03909642, 0.03686941, 0.01981803, 0.03843971, 0.03412318, 0.02415081,
+ 0.01291456, 0.01236173
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/aic2coco.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/aic2coco.py
new file mode 100644
index 0000000000000000000000000000000000000000..6656c9b8f70635edaafe144a1cbe8f1cfa39ed6d
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/aic2coco.py
@@ -0,0 +1,187 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='aic2coco',
+ paper_info=dict(
+ author='Lin, Tsung-Yi and Maire, Michael and '
+ 'Belongie, Serge and Hays, James and '
+ 'Perona, Pietro and Ramanan, Deva and '
+ r'Doll{\'a}r, Piotr and Zitnick, C Lawrence',
+ title='Microsoft coco: Common objects in context',
+ container='European conference on computer vision',
+ year='2014',
+ homepage='http://cocodataset.org/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1:
+ dict(
+ name='left_eye',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_eye'),
+ 2:
+ dict(
+ name='right_eye',
+ id=2,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_eye'),
+ 3:
+ dict(
+ name='left_ear',
+ id=3,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 4:
+ dict(
+ name='right_ear',
+ id=4,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='right_shoulder',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 7:
+ dict(
+ name='left_elbow',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 8:
+ dict(
+ name='right_elbow',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 9:
+ dict(
+ name='left_wrist',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='right_hip',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 13:
+ dict(
+ name='left_knee',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 14:
+ dict(
+ name='right_knee',
+ id=14,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 15:
+ dict(
+ name='left_ankle',
+ id=15,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 16:
+ dict(
+ name='right_ankle',
+ id=16,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+ 6:
+ dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(
+ link=('left_shoulder', 'right_shoulder'),
+ id=7,
+ color=[51, 153, 255]),
+ 8:
+ dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('left_eye', 'right_eye'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('nose', 'left_eye'), id=13, color=[51, 153, 255]),
+ 14:
+ dict(link=('nose', 'right_eye'), id=14, color=[51, 153, 255]),
+ 15:
+ dict(link=('left_eye', 'left_ear'), id=15, color=[51, 153, 255]),
+ 16:
+ dict(link=('right_eye', 'right_ear'), id=16, color=[51, 153, 255]),
+ 17:
+ dict(link=('left_ear', 'left_shoulder'), id=17, color=[51, 153, 255]),
+ 18:
+ dict(
+ link=('right_ear', 'right_shoulder'), id=18, color=[51, 153, 255])
+ },
+ joint_weights=[
+ 1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.5, 1.5, 1., 1., 1.2, 1.2, 1.5,
+ 1.5
+ ],
+ sigmas=[
+ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+ 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/aic2goliath.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/aic2goliath.py
new file mode 100644
index 0000000000000000000000000000000000000000..d7032c1f3b17e292cb0233e764b21e62b83b22e0
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/aic2goliath.py
@@ -0,0 +1,11 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from configs._base_.datasets.goliath import dataset_info as goliath_info
+
+goliath_info = goliath_info.build()
+dataset_info = goliath_info.copy()
+dataset_info['dataset_name'] = 'aic2goliath'
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/aic2goliath3d.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/aic2goliath3d.py
new file mode 100644
index 0000000000000000000000000000000000000000..8037b0d5f6c7bdff5f1a836672de600ac66116c2
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/aic2goliath3d.py
@@ -0,0 +1,11 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from configs._base_.datasets.goliath3d import dataset_info as goliath_info
+
+goliath_info = goliath_info.build()
+dataset_info = goliath_info.copy()
+dataset_info['dataset_name'] = 'aic2goliath3d'
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/ak.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/ak.py
new file mode 100644
index 0000000000000000000000000000000000000000..5adbf05dc51247a3d204d4f481f53ac19328ac76
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/ak.py
@@ -0,0 +1,273 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='Animal Kingdom',
+ paper_info=dict(
+ author='Singapore University of Technology and Design, Singapore.'
+ ' Xun Long Ng, Kian Eng Ong, Qichen Zheng,'
+ ' Yun Ni, Si Yong Yeo, Jun Liu.',
+ title='Animal Kingdom: '
+ 'A Large and Diverse Dataset for Animal Behavior Understanding',
+ container='Conference on Computer Vision '
+ 'and Pattern Recognition (CVPR)',
+ year='2022',
+ homepage='https://sutdcv.github.io/Animal-Kingdom',
+ version='1.0 (2022-06)',
+ date_created='2022-06',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='Head_Mid_Top',
+ id=0,
+ color=(225, 0, 255),
+ type='upper',
+ swap=''),
+ 1:
+ dict(
+ name='Eye_Left',
+ id=1,
+ color=[220, 20, 60],
+ type='upper',
+ swap='Eye_Right'),
+ 2:
+ dict(
+ name='Eye_Right',
+ id=2,
+ color=[0, 255, 255],
+ type='upper',
+ swap='Eye_Left'),
+ 3:
+ dict(
+ name='Mouth_Front_Top',
+ id=3,
+ color=(0, 255, 42),
+ type='upper',
+ swap=''),
+ 4:
+ dict(
+ name='Mouth_Back_Left',
+ id=4,
+ color=[221, 160, 221],
+ type='upper',
+ swap='Mouth_Back_Right'),
+ 5:
+ dict(
+ name='Mouth_Back_Right',
+ id=5,
+ color=[135, 206, 250],
+ type='upper',
+ swap='Mouth_Back_Left'),
+ 6:
+ dict(
+ name='Mouth_Front_Bottom',
+ id=6,
+ color=[50, 205, 50],
+ type='upper',
+ swap=''),
+ 7:
+ dict(
+ name='Shoulder_Left',
+ id=7,
+ color=[255, 182, 193],
+ type='upper',
+ swap='Shoulder_Right'),
+ 8:
+ dict(
+ name='Shoulder_Right',
+ id=8,
+ color=[0, 191, 255],
+ type='upper',
+ swap='Shoulder_Left'),
+ 9:
+ dict(
+ name='Elbow_Left',
+ id=9,
+ color=[255, 105, 180],
+ type='upper',
+ swap='Elbow_Right'),
+ 10:
+ dict(
+ name='Elbow_Right',
+ id=10,
+ color=[30, 144, 255],
+ type='upper',
+ swap='Elbow_Left'),
+ 11:
+ dict(
+ name='Wrist_Left',
+ id=11,
+ color=[255, 20, 147],
+ type='upper',
+ swap='Wrist_Right'),
+ 12:
+ dict(
+ name='Wrist_Right',
+ id=12,
+ color=[0, 0, 255],
+ type='upper',
+ swap='Wrist_Left'),
+ 13:
+ dict(
+ name='Torso_Mid_Back',
+ id=13,
+ color=(185, 3, 221),
+ type='upper',
+ swap=''),
+ 14:
+ dict(
+ name='Hip_Left',
+ id=14,
+ color=[255, 215, 0],
+ type='lower',
+ swap='Hip_Right'),
+ 15:
+ dict(
+ name='Hip_Right',
+ id=15,
+ color=[147, 112, 219],
+ type='lower',
+ swap='Hip_Left'),
+ 16:
+ dict(
+ name='Knee_Left',
+ id=16,
+ color=[255, 165, 0],
+ type='lower',
+ swap='Knee_Right'),
+ 17:
+ dict(
+ name='Knee_Right',
+ id=17,
+ color=[138, 43, 226],
+ type='lower',
+ swap='Knee_Left'),
+ 18:
+ dict(
+ name='Ankle_Left',
+ id=18,
+ color=[255, 140, 0],
+ type='lower',
+ swap='Ankle_Right'),
+ 19:
+ dict(
+ name='Ankle_Right',
+ id=19,
+ color=[128, 0, 128],
+ type='lower',
+ swap='Ankle_Left'),
+ 20:
+ dict(
+ name='Tail_Top_Back',
+ id=20,
+ color=(0, 251, 255),
+ type='lower',
+ swap=''),
+ 21:
+ dict(
+ name='Tail_Mid_Back',
+ id=21,
+ color=[32, 178, 170],
+ type='lower',
+ swap=''),
+ 22:
+ dict(
+ name='Tail_End_Back',
+ id=22,
+ color=(0, 102, 102),
+ type='lower',
+ swap='')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('Eye_Left', 'Head_Mid_Top'), id=0, color=[220, 20, 60]),
+ 1:
+ dict(link=('Eye_Right', 'Head_Mid_Top'), id=1, color=[0, 255, 255]),
+ 2:
+ dict(
+ link=('Mouth_Front_Top', 'Mouth_Back_Left'),
+ id=2,
+ color=[221, 160, 221]),
+ 3:
+ dict(
+ link=('Mouth_Front_Top', 'Mouth_Back_Right'),
+ id=3,
+ color=[135, 206, 250]),
+ 4:
+ dict(
+ link=('Mouth_Front_Bottom', 'Mouth_Back_Left'),
+ id=4,
+ color=[221, 160, 221]),
+ 5:
+ dict(
+ link=('Mouth_Front_Bottom', 'Mouth_Back_Right'),
+ id=5,
+ color=[135, 206, 250]),
+ 6:
+ dict(
+ link=('Head_Mid_Top', 'Torso_Mid_Back'), id=6,
+ color=(225, 0, 255)),
+ 7:
+ dict(
+ link=('Torso_Mid_Back', 'Tail_Top_Back'),
+ id=7,
+ color=(185, 3, 221)),
+ 8:
+ dict(
+ link=('Tail_Top_Back', 'Tail_Mid_Back'), id=8,
+ color=(0, 251, 255)),
+ 9:
+ dict(
+ link=('Tail_Mid_Back', 'Tail_End_Back'),
+ id=9,
+ color=[32, 178, 170]),
+ 10:
+ dict(
+ link=('Head_Mid_Top', 'Shoulder_Left'),
+ id=10,
+ color=[255, 182, 193]),
+ 11:
+ dict(
+ link=('Head_Mid_Top', 'Shoulder_Right'),
+ id=11,
+ color=[0, 191, 255]),
+ 12:
+ dict(
+ link=('Shoulder_Left', 'Elbow_Left'), id=12, color=[255, 105,
+ 180]),
+ 13:
+ dict(
+ link=('Shoulder_Right', 'Elbow_Right'),
+ id=13,
+ color=[30, 144, 255]),
+ 14:
+ dict(link=('Elbow_Left', 'Wrist_Left'), id=14, color=[255, 20, 147]),
+ 15:
+ dict(link=('Elbow_Right', 'Wrist_Right'), id=15, color=[0, 0, 255]),
+ 16:
+ dict(link=('Tail_Top_Back', 'Hip_Left'), id=16, color=[255, 215, 0]),
+ 17:
+ dict(
+ link=('Tail_Top_Back', 'Hip_Right'), id=17, color=[147, 112, 219]),
+ 18:
+ dict(link=('Hip_Left', 'Knee_Left'), id=18, color=[255, 165, 0]),
+ 19:
+ dict(link=('Hip_Right', 'Knee_Right'), id=19, color=[138, 43, 226]),
+ 20:
+ dict(link=('Knee_Left', 'Ankle_Left'), id=20, color=[255, 140, 0]),
+ 21:
+ dict(link=('Knee_Right', 'Ankle_Right'), id=21, color=[128, 0, 128])
+ },
+ joint_weights=[
+ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
+ 1., 1., 1., 1., 1.
+ ],
+ sigmas=[
+ 0.025, 0.025, 0.025, 0.025, 0.025, 0.025, 0.025, 0.025, 0.025, 0.025,
+ 0.025, 0.025, 0.025, 0.025, 0.025, 0.025, 0.025, 0.025, 0.025, 0.025,
+ 0.025, 0.025, 0.025
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/animalpose.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/animalpose.py
new file mode 100644
index 0000000000000000000000000000000000000000..8ec4bd7d82a196dd7c8dca70bc5abd4c4322eafc
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/animalpose.py
@@ -0,0 +1,172 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='animalpose',
+ paper_info=dict(
+ author='Cao, Jinkun and Tang, Hongyang and Fang, Hao-Shu and '
+ 'Shen, Xiaoyong and Lu, Cewu and Tai, Yu-Wing',
+ title='Cross-Domain Adaptation for Animal Pose Estimation',
+ container='The IEEE International Conference on '
+ 'Computer Vision (ICCV)',
+ year='2019',
+ homepage='https://sites.google.com/view/animal-pose/',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='L_Eye', id=0, color=[0, 255, 0], type='upper', swap='R_Eye'),
+ 1:
+ dict(
+ name='R_Eye',
+ id=1,
+ color=[255, 128, 0],
+ type='upper',
+ swap='L_Eye'),
+ 2:
+ dict(
+ name='L_EarBase',
+ id=2,
+ color=[0, 255, 0],
+ type='upper',
+ swap='R_EarBase'),
+ 3:
+ dict(
+ name='R_EarBase',
+ id=3,
+ color=[255, 128, 0],
+ type='upper',
+ swap='L_EarBase'),
+ 4:
+ dict(name='Nose', id=4, color=[51, 153, 255], type='upper', swap=''),
+ 5:
+ dict(name='Throat', id=5, color=[51, 153, 255], type='upper', swap=''),
+ 6:
+ dict(
+ name='TailBase', id=6, color=[51, 153, 255], type='lower',
+ swap=''),
+ 7:
+ dict(
+ name='Withers', id=7, color=[51, 153, 255], type='upper', swap=''),
+ 8:
+ dict(
+ name='L_F_Elbow',
+ id=8,
+ color=[0, 255, 0],
+ type='upper',
+ swap='R_F_Elbow'),
+ 9:
+ dict(
+ name='R_F_Elbow',
+ id=9,
+ color=[255, 128, 0],
+ type='upper',
+ swap='L_F_Elbow'),
+ 10:
+ dict(
+ name='L_B_Elbow',
+ id=10,
+ color=[0, 255, 0],
+ type='lower',
+ swap='R_B_Elbow'),
+ 11:
+ dict(
+ name='R_B_Elbow',
+ id=11,
+ color=[255, 128, 0],
+ type='lower',
+ swap='L_B_Elbow'),
+ 12:
+ dict(
+ name='L_F_Knee',
+ id=12,
+ color=[0, 255, 0],
+ type='upper',
+ swap='R_F_Knee'),
+ 13:
+ dict(
+ name='R_F_Knee',
+ id=13,
+ color=[255, 128, 0],
+ type='upper',
+ swap='L_F_Knee'),
+ 14:
+ dict(
+ name='L_B_Knee',
+ id=14,
+ color=[0, 255, 0],
+ type='lower',
+ swap='R_B_Knee'),
+ 15:
+ dict(
+ name='R_B_Knee',
+ id=15,
+ color=[255, 128, 0],
+ type='lower',
+ swap='L_B_Knee'),
+ 16:
+ dict(
+ name='L_F_Paw',
+ id=16,
+ color=[0, 255, 0],
+ type='upper',
+ swap='R_F_Paw'),
+ 17:
+ dict(
+ name='R_F_Paw',
+ id=17,
+ color=[255, 128, 0],
+ type='upper',
+ swap='L_F_Paw'),
+ 18:
+ dict(
+ name='L_B_Paw',
+ id=18,
+ color=[0, 255, 0],
+ type='lower',
+ swap='R_B_Paw'),
+ 19:
+ dict(
+ name='R_B_Paw',
+ id=19,
+ color=[255, 128, 0],
+ type='lower',
+ swap='L_B_Paw')
+ },
+ skeleton_info={
+ 0: dict(link=('L_Eye', 'R_Eye'), id=0, color=[51, 153, 255]),
+ 1: dict(link=('L_Eye', 'L_EarBase'), id=1, color=[0, 255, 0]),
+ 2: dict(link=('R_Eye', 'R_EarBase'), id=2, color=[255, 128, 0]),
+ 3: dict(link=('L_Eye', 'Nose'), id=3, color=[0, 255, 0]),
+ 4: dict(link=('R_Eye', 'Nose'), id=4, color=[255, 128, 0]),
+ 5: dict(link=('Nose', 'Throat'), id=5, color=[51, 153, 255]),
+ 6: dict(link=('Throat', 'Withers'), id=6, color=[51, 153, 255]),
+ 7: dict(link=('TailBase', 'Withers'), id=7, color=[51, 153, 255]),
+ 8: dict(link=('Throat', 'L_F_Elbow'), id=8, color=[0, 255, 0]),
+ 9: dict(link=('L_F_Elbow', 'L_F_Knee'), id=9, color=[0, 255, 0]),
+ 10: dict(link=('L_F_Knee', 'L_F_Paw'), id=10, color=[0, 255, 0]),
+ 11: dict(link=('Throat', 'R_F_Elbow'), id=11, color=[255, 128, 0]),
+ 12: dict(link=('R_F_Elbow', 'R_F_Knee'), id=12, color=[255, 128, 0]),
+ 13: dict(link=('R_F_Knee', 'R_F_Paw'), id=13, color=[255, 128, 0]),
+ 14: dict(link=('TailBase', 'L_B_Elbow'), id=14, color=[0, 255, 0]),
+ 15: dict(link=('L_B_Elbow', 'L_B_Knee'), id=15, color=[0, 255, 0]),
+ 16: dict(link=('L_B_Knee', 'L_B_Paw'), id=16, color=[0, 255, 0]),
+ 17: dict(link=('TailBase', 'R_B_Elbow'), id=17, color=[255, 128, 0]),
+ 18: dict(link=('R_B_Elbow', 'R_B_Knee'), id=18, color=[255, 128, 0]),
+ 19: dict(link=('R_B_Knee', 'R_B_Paw'), id=19, color=[255, 128, 0])
+ },
+ joint_weights=[
+ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.2, 1.2,
+ 1.5, 1.5, 1.5, 1.5
+ ],
+
+ # Note: The original paper did not provide enough information about
+ # the sigmas. We modified from 'https://github.com/cocodataset/'
+ # 'cocoapi/blob/master/PythonAPI/pycocotools/cocoeval.py#L523'
+ sigmas=[
+ 0.025, 0.025, 0.026, 0.035, 0.035, 0.10, 0.10, 0.10, 0.107, 0.107,
+ 0.107, 0.107, 0.087, 0.087, 0.087, 0.087, 0.089, 0.089, 0.089, 0.089
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/ap10k.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/ap10k.py
new file mode 100644
index 0000000000000000000000000000000000000000..ccac2568a0eaa11c361b697de695090aaf0496a8
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/ap10k.py
@@ -0,0 +1,148 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='ap10k',
+ paper_info=dict(
+ author='Yu, Hang and Xu, Yufei and Zhang, Jing and '
+ 'Zhao, Wei and Guan, Ziyu and Tao, Dacheng',
+ title='AP-10K: A Benchmark for Animal Pose Estimation in the Wild',
+ container='35th Conference on Neural Information Processing Systems '
+ '(NeurIPS 2021) Track on Datasets and Bench-marks.',
+ year='2021',
+ homepage='https://github.com/AlexTheBad/AP-10K',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='L_Eye', id=0, color=[0, 255, 0], type='upper', swap='R_Eye'),
+ 1:
+ dict(
+ name='R_Eye',
+ id=1,
+ color=[255, 128, 0],
+ type='upper',
+ swap='L_Eye'),
+ 2:
+ dict(name='Nose', id=2, color=[51, 153, 255], type='upper', swap=''),
+ 3:
+ dict(name='Neck', id=3, color=[51, 153, 255], type='upper', swap=''),
+ 4:
+ dict(
+ name='Root of tail',
+ id=4,
+ color=[51, 153, 255],
+ type='lower',
+ swap=''),
+ 5:
+ dict(
+ name='L_Shoulder',
+ id=5,
+ color=[51, 153, 255],
+ type='upper',
+ swap='R_Shoulder'),
+ 6:
+ dict(
+ name='L_Elbow',
+ id=6,
+ color=[51, 153, 255],
+ type='upper',
+ swap='R_Elbow'),
+ 7:
+ dict(
+ name='L_F_Paw',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='R_F_Paw'),
+ 8:
+ dict(
+ name='R_Shoulder',
+ id=8,
+ color=[0, 255, 0],
+ type='upper',
+ swap='L_Shoulder'),
+ 9:
+ dict(
+ name='R_Elbow',
+ id=9,
+ color=[255, 128, 0],
+ type='upper',
+ swap='L_Elbow'),
+ 10:
+ dict(
+ name='R_F_Paw',
+ id=10,
+ color=[0, 255, 0],
+ type='lower',
+ swap='L_F_Paw'),
+ 11:
+ dict(
+ name='L_Hip',
+ id=11,
+ color=[255, 128, 0],
+ type='lower',
+ swap='R_Hip'),
+ 12:
+ dict(
+ name='L_Knee',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='R_Knee'),
+ 13:
+ dict(
+ name='L_B_Paw',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='R_B_Paw'),
+ 14:
+ dict(
+ name='R_Hip', id=14, color=[0, 255, 0], type='lower',
+ swap='L_Hip'),
+ 15:
+ dict(
+ name='R_Knee',
+ id=15,
+ color=[0, 255, 0],
+ type='lower',
+ swap='L_Knee'),
+ 16:
+ dict(
+ name='R_B_Paw',
+ id=16,
+ color=[0, 255, 0],
+ type='lower',
+ swap='L_B_Paw'),
+ },
+ skeleton_info={
+ 0: dict(link=('L_Eye', 'R_Eye'), id=0, color=[0, 0, 255]),
+ 1: dict(link=('L_Eye', 'Nose'), id=1, color=[0, 0, 255]),
+ 2: dict(link=('R_Eye', 'Nose'), id=2, color=[0, 0, 255]),
+ 3: dict(link=('Nose', 'Neck'), id=3, color=[0, 255, 0]),
+ 4: dict(link=('Neck', 'Root of tail'), id=4, color=[0, 255, 0]),
+ 5: dict(link=('Neck', 'L_Shoulder'), id=5, color=[0, 255, 255]),
+ 6: dict(link=('L_Shoulder', 'L_Elbow'), id=6, color=[0, 255, 255]),
+ 7: dict(link=('L_Elbow', 'L_F_Paw'), id=6, color=[0, 255, 255]),
+ 8: dict(link=('Neck', 'R_Shoulder'), id=7, color=[6, 156, 250]),
+ 9: dict(link=('R_Shoulder', 'R_Elbow'), id=8, color=[6, 156, 250]),
+ 10: dict(link=('R_Elbow', 'R_F_Paw'), id=9, color=[6, 156, 250]),
+ 11: dict(link=('Root of tail', 'L_Hip'), id=10, color=[0, 255, 255]),
+ 12: dict(link=('L_Hip', 'L_Knee'), id=11, color=[0, 255, 255]),
+ 13: dict(link=('L_Knee', 'L_B_Paw'), id=12, color=[0, 255, 255]),
+ 14: dict(link=('Root of tail', 'R_Hip'), id=13, color=[6, 156, 250]),
+ 15: dict(link=('R_Hip', 'R_Knee'), id=14, color=[6, 156, 250]),
+ 16: dict(link=('R_Knee', 'R_B_Paw'), id=15, color=[6, 156, 250]),
+ },
+ joint_weights=[
+ 1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.5, 1.5, 1., 1., 1.2, 1.2, 1.5,
+ 1.5
+ ],
+ sigmas=[
+ 0.025, 0.025, 0.026, 0.035, 0.035, 0.079, 0.072, 0.062, 0.079, 0.072,
+ 0.062, 0.107, 0.087, 0.089, 0.107, 0.087, 0.089
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/atrw.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/atrw.py
new file mode 100644
index 0000000000000000000000000000000000000000..98c78299e1bba22e1b6ec62dd9570b60a50552d1
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/atrw.py
@@ -0,0 +1,150 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='atrw',
+ paper_info=dict(
+ author='Li, Shuyuan and Li, Jianguo and Tang, Hanlin '
+ 'and Qian, Rui and Lin, Weiyao',
+ title='ATRW: A Benchmark for Amur Tiger '
+ 'Re-identification in the Wild',
+ container='Proceedings of the 28th ACM '
+ 'International Conference on Multimedia',
+ year='2020',
+ homepage='https://cvwc2019.github.io/challenge.html',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='left_ear',
+ id=0,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 1:
+ dict(
+ name='right_ear',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear'),
+ 2:
+ dict(name='nose', id=2, color=[51, 153, 255], type='upper', swap=''),
+ 3:
+ dict(
+ name='right_shoulder',
+ id=3,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 4:
+ dict(
+ name='right_front_paw',
+ id=4,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_front_paw'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='left_front_paw',
+ id=6,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_front_paw'),
+ 7:
+ dict(
+ name='right_hip',
+ id=7,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 8:
+ dict(
+ name='right_knee',
+ id=8,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 9:
+ dict(
+ name='right_back_paw',
+ id=9,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_back_paw'),
+ 10:
+ dict(
+ name='left_hip',
+ id=10,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 11:
+ dict(
+ name='left_knee',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 12:
+ dict(
+ name='left_back_paw',
+ id=12,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_back_paw'),
+ 13:
+ dict(name='tail', id=13, color=[51, 153, 255], type='lower', swap=''),
+ 14:
+ dict(
+ name='center', id=14, color=[51, 153, 255], type='lower', swap=''),
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ear', 'nose'), id=0, color=[51, 153, 255]),
+ 1:
+ dict(link=('right_ear', 'nose'), id=1, color=[51, 153, 255]),
+ 2:
+ dict(link=('nose', 'center'), id=2, color=[51, 153, 255]),
+ 3:
+ dict(
+ link=('left_shoulder', 'left_front_paw'), id=3, color=[0, 255, 0]),
+ 4:
+ dict(link=('left_shoulder', 'center'), id=4, color=[0, 255, 0]),
+ 5:
+ dict(
+ link=('right_shoulder', 'right_front_paw'),
+ id=5,
+ color=[255, 128, 0]),
+ 6:
+ dict(link=('right_shoulder', 'center'), id=6, color=[255, 128, 0]),
+ 7:
+ dict(link=('tail', 'center'), id=7, color=[51, 153, 255]),
+ 8:
+ dict(link=('right_back_paw', 'right_knee'), id=8, color=[255, 128, 0]),
+ 9:
+ dict(link=('right_knee', 'right_hip'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('right_hip', 'tail'), id=10, color=[255, 128, 0]),
+ 11:
+ dict(link=('left_back_paw', 'left_knee'), id=11, color=[0, 255, 0]),
+ 12:
+ dict(link=('left_knee', 'left_hip'), id=12, color=[0, 255, 0]),
+ 13:
+ dict(link=('left_hip', 'tail'), id=13, color=[0, 255, 0]),
+ },
+ joint_weights=[1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
+ sigmas=[
+ 0.0277, 0.0823, 0.0831, 0.0202, 0.0716, 0.0263, 0.0646, 0.0302, 0.0440,
+ 0.0316, 0.0333, 0.0547, 0.0263, 0.0683, 0.0539
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/campus.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/campus.py
new file mode 100644
index 0000000000000000000000000000000000000000..ef124e10482e5963a0e82879a4aa82a08690e13a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/campus.py
@@ -0,0 +1,157 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='campus',
+ paper_info=dict(
+ author='Belagiannis, Vasileios and Amin, Sikandar and Andriluka, '
+ 'Mykhaylo and Schiele, Bernt and Navab, Nassir and Ilic, Slobodan',
+ title='3D Pictorial Structures for Multiple Human Pose Estimation',
+ container='IEEE Computer Society Conference on Computer Vision and '
+ 'Pattern Recognition (CVPR)',
+ year='2014',
+ homepage='http://campar.in.tum.de/Chair/MultiHumanPose',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='right_ankle',
+ id=0,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle'),
+ 1:
+ dict(
+ name='right_knee',
+ id=1,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 2:
+ dict(
+ name='right_hip',
+ id=2,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 3:
+ dict(
+ name='left_hip',
+ id=3,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 4:
+ dict(
+ name='left_knee',
+ id=4,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 5:
+ dict(
+ name='left_ankle',
+ id=5,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 6:
+ dict(
+ name='right_wrist',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 7:
+ dict(
+ name='right_elbow',
+ id=7,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 8:
+ dict(
+ name='right_shoulder',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 9:
+ dict(
+ name='left_shoulder',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 10:
+ dict(
+ name='left_elbow',
+ id=10,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 11:
+ dict(
+ name='left_wrist',
+ id=11,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 12:
+ dict(
+ name='bottom_head',
+ id=12,
+ color=[51, 153, 255],
+ type='upper',
+ swap=''),
+ 13:
+ dict(
+ name='top_head',
+ id=13,
+ color=[51, 153, 255],
+ type='upper',
+ swap=''),
+ },
+ skeleton_info={
+ 0:
+ dict(link=('right_ankle', 'right_knee'), id=0, color=[255, 128, 0]),
+ 1:
+ dict(link=('right_knee', 'right_hip'), id=1, color=[255, 128, 0]),
+ 2:
+ dict(link=('left_hip', 'left_knee'), id=2, color=[0, 255, 0]),
+ 3:
+ dict(link=('left_knee', 'left_ankle'), id=3, color=[0, 255, 0]),
+ 4:
+ dict(link=('right_hip', 'left_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('right_wrist', 'right_elbow'), id=5, color=[255, 128, 0]),
+ 6:
+ dict(
+ link=('right_elbow', 'right_shoulder'), id=6, color=[255, 128, 0]),
+ 7:
+ dict(link=('left_shoulder', 'left_elbow'), id=7, color=[0, 255, 0]),
+ 8:
+ dict(link=('left_elbow', 'left_wrist'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(link=('right_hip', 'right_shoulder'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_hip', 'left_shoulder'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(
+ link=('right_shoulder', 'bottom_head'), id=11, color=[255, 128,
+ 0]),
+ 12:
+ dict(link=('left_shoulder', 'bottom_head'), id=12, color=[0, 255, 0]),
+ 13:
+ dict(link=('bottom_head', 'top_head'), id=13, color=[51, 153, 255]),
+ },
+ joint_weights=[
+ 1.5, 1.2, 1.0, 1.0, 1.2, 1.5, 1.5, 1.2, 1.0, 1.0, 1.2, 1.5, 1.0, 1.0
+ ],
+ sigmas=[
+ 0.089, 0.087, 0.107, 0.107, 0.087, 0.089, 0.062, 0.072, 0.079, 0.079,
+ 0.072, 0.062, 0.026, 0.026
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco.py
new file mode 100644
index 0000000000000000000000000000000000000000..a51dc4215cc9ea1e9304999c2e22b9092b9506ec
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco.py
@@ -0,0 +1,187 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='coco',
+ paper_info=dict(
+ author='Lin, Tsung-Yi and Maire, Michael and '
+ 'Belongie, Serge and Hays, James and '
+ 'Perona, Pietro and Ramanan, Deva and '
+ r'Doll{\'a}r, Piotr and Zitnick, C Lawrence',
+ title='Microsoft coco: Common objects in context',
+ container='European conference on computer vision',
+ year='2014',
+ homepage='http://cocodataset.org/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1:
+ dict(
+ name='left_eye',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_eye'),
+ 2:
+ dict(
+ name='right_eye',
+ id=2,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_eye'),
+ 3:
+ dict(
+ name='left_ear',
+ id=3,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 4:
+ dict(
+ name='right_ear',
+ id=4,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='right_shoulder',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 7:
+ dict(
+ name='left_elbow',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 8:
+ dict(
+ name='right_elbow',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 9:
+ dict(
+ name='left_wrist',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='right_hip',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 13:
+ dict(
+ name='left_knee',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 14:
+ dict(
+ name='right_knee',
+ id=14,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 15:
+ dict(
+ name='left_ankle',
+ id=15,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 16:
+ dict(
+ name='right_ankle',
+ id=16,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+ 6:
+ dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(
+ link=('left_shoulder', 'right_shoulder'),
+ id=7,
+ color=[51, 153, 255]),
+ 8:
+ dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('left_eye', 'right_eye'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('nose', 'left_eye'), id=13, color=[51, 153, 255]),
+ 14:
+ dict(link=('nose', 'right_eye'), id=14, color=[51, 153, 255]),
+ 15:
+ dict(link=('left_eye', 'left_ear'), id=15, color=[51, 153, 255]),
+ 16:
+ dict(link=('right_eye', 'right_ear'), id=16, color=[51, 153, 255]),
+ 17:
+ dict(link=('left_ear', 'left_shoulder'), id=17, color=[51, 153, 255]),
+ 18:
+ dict(
+ link=('right_ear', 'right_shoulder'), id=18, color=[51, 153, 255])
+ },
+ joint_weights=[
+ 1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.5, 1.5, 1., 1., 1.2, 1.2, 1.5,
+ 1.5
+ ],
+ sigmas=[
+ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+ 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_openpose.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_openpose.py
new file mode 100644
index 0000000000000000000000000000000000000000..1b12b2156cd956a36898fe21708d570ca7c25455
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_openpose.py
@@ -0,0 +1,163 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='coco_openpose',
+ paper_info=dict(
+ author='Zhe, Cao and Tomas, Simon and '
+ 'Shih-En, Wei and Yaser, Sheikh',
+ title='OpenPose: Realtime Multi-Person 2D Pose '
+ 'Estimation using Part Affinity Fields',
+ container='IEEE Transactions on Pattern Analysis '
+ 'and Machine Intelligence',
+ year='2019',
+ homepage='https://github.com/CMU-Perceptual-Computing-Lab/openpose/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[255, 0, 0], type='upper', swap=''),
+ 1:
+ dict(name='neck', id=1, color=[255, 85, 0], type='upper', swap=''),
+ 2:
+ dict(
+ name='right_shoulder',
+ id=2,
+ color=[255, 170, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 3:
+ dict(
+ name='right_elbow',
+ id=3,
+ color=[255, 255, 0],
+ type='upper',
+ swap='left_elbow'),
+ 4:
+ dict(
+ name='right_wrist',
+ id=4,
+ color=[170, 255, 0],
+ type='upper',
+ swap='left_wrist'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[85, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='left_elbow',
+ id=6,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 7:
+ dict(
+ name='left_wrist',
+ id=7,
+ color=[0, 255, 85],
+ type='upper',
+ swap='right_wrist'),
+ 8:
+ dict(
+ name='right_hip',
+ id=8,
+ color=[0, 255, 170],
+ type='lower',
+ swap='left_hip'),
+ 9:
+ dict(
+ name='right_knee',
+ id=9,
+ color=[0, 255, 255],
+ type='lower',
+ swap='left_knee'),
+ 10:
+ dict(
+ name='right_ankle',
+ id=10,
+ color=[0, 170, 255],
+ type='lower',
+ swap='left_ankle'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 85, 255],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='left_knee',
+ id=12,
+ color=[0, 0, 255],
+ type='lower',
+ swap='right_knee'),
+ 13:
+ dict(
+ name='left_ankle',
+ id=13,
+ color=[85, 0, 255],
+ type='lower',
+ swap='right_ankle'),
+ 14:
+ dict(
+ name='right_eye',
+ id=14,
+ color=[170, 0, 255],
+ type='upper',
+ swap='left_eye'),
+ 15:
+ dict(
+ name='left_eye',
+ id=15,
+ color=[255, 0, 255],
+ type='upper',
+ swap='right_eye'),
+ 16:
+ dict(
+ name='right_ear',
+ id=16,
+ color=[255, 0, 170],
+ type='upper',
+ swap='left_ear'),
+ 17:
+ dict(
+ name='left_ear',
+ id=17,
+ color=[255, 0, 85],
+ type='upper',
+ swap='right_ear'),
+ },
+ skeleton_info={
+ 0: dict(link=('neck', 'right_shoulder'), id=0, color=[255, 0, 0]),
+ 1: dict(link=('neck', 'left_shoulder'), id=1, color=[255, 85, 0]),
+ 2: dict(
+ link=('right_shoulder', 'right_elbow'), id=2, color=[255, 170, 0]),
+ 3:
+ dict(link=('right_elbow', 'right_wrist'), id=3, color=[255, 255, 0]),
+ 4:
+ dict(link=('left_shoulder', 'left_elbow'), id=4, color=[170, 255, 0]),
+ 5: dict(link=('left_elbow', 'left_wrist'), id=5, color=[85, 255, 0]),
+ 6: dict(link=('neck', 'right_hip'), id=6, color=[0, 255, 0]),
+ 7: dict(link=('right_hip', 'right_knee'), id=7, color=[0, 255, 85]),
+ 8: dict(link=('right_knee', 'right_ankle'), id=8, color=[0, 255, 170]),
+ 9: dict(link=('neck', 'left_hip'), id=9, color=[0, 255, 225]),
+ 10: dict(link=('left_hip', 'left_knee'), id=10, color=[0, 170, 255]),
+ 11: dict(link=('left_knee', 'left_ankle'), id=11, color=[0, 85, 255]),
+ 12: dict(link=('neck', 'nose'), id=12, color=[0, 0, 255]),
+ 13: dict(link=('nose', 'right_eye'), id=13, color=[255, 0, 170]),
+ 14: dict(link=('right_eye', 'right_ear'), id=14, color=[170, 0, 255]),
+ 15: dict(link=('nose', 'left_eye'), id=15, color=[255, 0, 255]),
+ 16: dict(link=('left_eye', 'left_ear'), id=16, color=[255, 0, 170]),
+ },
+ joint_weights=[1.] * 18,
+ sigmas=[
+ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+ 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089, 0.082
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody.py
new file mode 100644
index 0000000000000000000000000000000000000000..ae459804bb55ea2faa81fd3cdb6a06226065d7b8
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody.py
@@ -0,0 +1,1160 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='coco_wholebody',
+ paper_info=dict(
+ author='Jin, Sheng and Xu, Lumin and Xu, Jin and '
+ 'Wang, Can and Liu, Wentao and '
+ 'Qian, Chen and Ouyang, Wanli and Luo, Ping',
+ title='Whole-Body Human Pose Estimation in the Wild',
+ container='Proceedings of the European '
+ 'Conference on Computer Vision (ECCV)',
+ year='2020',
+ homepage='https://github.com/jin-s13/COCO-WholeBody/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1:
+ dict(
+ name='left_eye',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_eye'),
+ 2:
+ dict(
+ name='right_eye',
+ id=2,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_eye'),
+ 3:
+ dict(
+ name='left_ear',
+ id=3,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 4:
+ dict(
+ name='right_ear',
+ id=4,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='right_shoulder',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 7:
+ dict(
+ name='left_elbow',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 8:
+ dict(
+ name='right_elbow',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 9:
+ dict(
+ name='left_wrist',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='right_hip',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 13:
+ dict(
+ name='left_knee',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 14:
+ dict(
+ name='right_knee',
+ id=14,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 15:
+ dict(
+ name='left_ankle',
+ id=15,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 16:
+ dict(
+ name='right_ankle',
+ id=16,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle'),
+ 17:
+ dict(
+ name='left_big_toe',
+ id=17,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_big_toe'),
+ 18:
+ dict(
+ name='left_small_toe',
+ id=18,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_small_toe'),
+ 19:
+ dict(
+ name='left_heel',
+ id=19,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_heel'),
+ 20:
+ dict(
+ name='right_big_toe',
+ id=20,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_big_toe'),
+ 21:
+ dict(
+ name='right_small_toe',
+ id=21,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_small_toe'),
+ 22:
+ dict(
+ name='right_heel',
+ id=22,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_heel'),
+ 23:
+ dict(
+ name='face-0',
+ id=23,
+ color=[255, 255, 255],
+ type='',
+ swap='face-16'),
+ 24:
+ dict(
+ name='face-1',
+ id=24,
+ color=[255, 255, 255],
+ type='',
+ swap='face-15'),
+ 25:
+ dict(
+ name='face-2',
+ id=25,
+ color=[255, 255, 255],
+ type='',
+ swap='face-14'),
+ 26:
+ dict(
+ name='face-3',
+ id=26,
+ color=[255, 255, 255],
+ type='',
+ swap='face-13'),
+ 27:
+ dict(
+ name='face-4',
+ id=27,
+ color=[255, 255, 255],
+ type='',
+ swap='face-12'),
+ 28:
+ dict(
+ name='face-5',
+ id=28,
+ color=[255, 255, 255],
+ type='',
+ swap='face-11'),
+ 29:
+ dict(
+ name='face-6',
+ id=29,
+ color=[255, 255, 255],
+ type='',
+ swap='face-10'),
+ 30:
+ dict(
+ name='face-7',
+ id=30,
+ color=[255, 255, 255],
+ type='',
+ swap='face-9'),
+ 31:
+ dict(name='face-8', id=31, color=[255, 255, 255], type='', swap=''),
+ 32:
+ dict(
+ name='face-9',
+ id=32,
+ color=[255, 255, 255],
+ type='',
+ swap='face-7'),
+ 33:
+ dict(
+ name='face-10',
+ id=33,
+ color=[255, 255, 255],
+ type='',
+ swap='face-6'),
+ 34:
+ dict(
+ name='face-11',
+ id=34,
+ color=[255, 255, 255],
+ type='',
+ swap='face-5'),
+ 35:
+ dict(
+ name='face-12',
+ id=35,
+ color=[255, 255, 255],
+ type='',
+ swap='face-4'),
+ 36:
+ dict(
+ name='face-13',
+ id=36,
+ color=[255, 255, 255],
+ type='',
+ swap='face-3'),
+ 37:
+ dict(
+ name='face-14',
+ id=37,
+ color=[255, 255, 255],
+ type='',
+ swap='face-2'),
+ 38:
+ dict(
+ name='face-15',
+ id=38,
+ color=[255, 255, 255],
+ type='',
+ swap='face-1'),
+ 39:
+ dict(
+ name='face-16',
+ id=39,
+ color=[255, 255, 255],
+ type='',
+ swap='face-0'),
+ 40:
+ dict(
+ name='face-17',
+ id=40,
+ color=[255, 255, 255],
+ type='',
+ swap='face-26'),
+ 41:
+ dict(
+ name='face-18',
+ id=41,
+ color=[255, 255, 255],
+ type='',
+ swap='face-25'),
+ 42:
+ dict(
+ name='face-19',
+ id=42,
+ color=[255, 255, 255],
+ type='',
+ swap='face-24'),
+ 43:
+ dict(
+ name='face-20',
+ id=43,
+ color=[255, 255, 255],
+ type='',
+ swap='face-23'),
+ 44:
+ dict(
+ name='face-21',
+ id=44,
+ color=[255, 255, 255],
+ type='',
+ swap='face-22'),
+ 45:
+ dict(
+ name='face-22',
+ id=45,
+ color=[255, 255, 255],
+ type='',
+ swap='face-21'),
+ 46:
+ dict(
+ name='face-23',
+ id=46,
+ color=[255, 255, 255],
+ type='',
+ swap='face-20'),
+ 47:
+ dict(
+ name='face-24',
+ id=47,
+ color=[255, 255, 255],
+ type='',
+ swap='face-19'),
+ 48:
+ dict(
+ name='face-25',
+ id=48,
+ color=[255, 255, 255],
+ type='',
+ swap='face-18'),
+ 49:
+ dict(
+ name='face-26',
+ id=49,
+ color=[255, 255, 255],
+ type='',
+ swap='face-17'),
+ 50:
+ dict(name='face-27', id=50, color=[255, 255, 255], type='', swap=''),
+ 51:
+ dict(name='face-28', id=51, color=[255, 255, 255], type='', swap=''),
+ 52:
+ dict(name='face-29', id=52, color=[255, 255, 255], type='', swap=''),
+ 53:
+ dict(name='face-30', id=53, color=[255, 255, 255], type='', swap=''),
+ 54:
+ dict(
+ name='face-31',
+ id=54,
+ color=[255, 255, 255],
+ type='',
+ swap='face-35'),
+ 55:
+ dict(
+ name='face-32',
+ id=55,
+ color=[255, 255, 255],
+ type='',
+ swap='face-34'),
+ 56:
+ dict(name='face-33', id=56, color=[255, 255, 255], type='', swap=''),
+ 57:
+ dict(
+ name='face-34',
+ id=57,
+ color=[255, 255, 255],
+ type='',
+ swap='face-32'),
+ 58:
+ dict(
+ name='face-35',
+ id=58,
+ color=[255, 255, 255],
+ type='',
+ swap='face-31'),
+ 59:
+ dict(
+ name='face-36',
+ id=59,
+ color=[255, 255, 255],
+ type='',
+ swap='face-45'),
+ 60:
+ dict(
+ name='face-37',
+ id=60,
+ color=[255, 255, 255],
+ type='',
+ swap='face-44'),
+ 61:
+ dict(
+ name='face-38',
+ id=61,
+ color=[255, 255, 255],
+ type='',
+ swap='face-43'),
+ 62:
+ dict(
+ name='face-39',
+ id=62,
+ color=[255, 255, 255],
+ type='',
+ swap='face-42'),
+ 63:
+ dict(
+ name='face-40',
+ id=63,
+ color=[255, 255, 255],
+ type='',
+ swap='face-47'),
+ 64:
+ dict(
+ name='face-41',
+ id=64,
+ color=[255, 255, 255],
+ type='',
+ swap='face-46'),
+ 65:
+ dict(
+ name='face-42',
+ id=65,
+ color=[255, 255, 255],
+ type='',
+ swap='face-39'),
+ 66:
+ dict(
+ name='face-43',
+ id=66,
+ color=[255, 255, 255],
+ type='',
+ swap='face-38'),
+ 67:
+ dict(
+ name='face-44',
+ id=67,
+ color=[255, 255, 255],
+ type='',
+ swap='face-37'),
+ 68:
+ dict(
+ name='face-45',
+ id=68,
+ color=[255, 255, 255],
+ type='',
+ swap='face-36'),
+ 69:
+ dict(
+ name='face-46',
+ id=69,
+ color=[255, 255, 255],
+ type='',
+ swap='face-41'),
+ 70:
+ dict(
+ name='face-47',
+ id=70,
+ color=[255, 255, 255],
+ type='',
+ swap='face-40'),
+ 71:
+ dict(
+ name='face-48',
+ id=71,
+ color=[255, 255, 255],
+ type='',
+ swap='face-54'),
+ 72:
+ dict(
+ name='face-49',
+ id=72,
+ color=[255, 255, 255],
+ type='',
+ swap='face-53'),
+ 73:
+ dict(
+ name='face-50',
+ id=73,
+ color=[255, 255, 255],
+ type='',
+ swap='face-52'),
+ 74:
+ dict(name='face-51', id=74, color=[255, 255, 255], type='', swap=''),
+ 75:
+ dict(
+ name='face-52',
+ id=75,
+ color=[255, 255, 255],
+ type='',
+ swap='face-50'),
+ 76:
+ dict(
+ name='face-53',
+ id=76,
+ color=[255, 255, 255],
+ type='',
+ swap='face-49'),
+ 77:
+ dict(
+ name='face-54',
+ id=77,
+ color=[255, 255, 255],
+ type='',
+ swap='face-48'),
+ 78:
+ dict(
+ name='face-55',
+ id=78,
+ color=[255, 255, 255],
+ type='',
+ swap='face-59'),
+ 79:
+ dict(
+ name='face-56',
+ id=79,
+ color=[255, 255, 255],
+ type='',
+ swap='face-58'),
+ 80:
+ dict(name='face-57', id=80, color=[255, 255, 255], type='', swap=''),
+ 81:
+ dict(
+ name='face-58',
+ id=81,
+ color=[255, 255, 255],
+ type='',
+ swap='face-56'),
+ 82:
+ dict(
+ name='face-59',
+ id=82,
+ color=[255, 255, 255],
+ type='',
+ swap='face-55'),
+ 83:
+ dict(
+ name='face-60',
+ id=83,
+ color=[255, 255, 255],
+ type='',
+ swap='face-64'),
+ 84:
+ dict(
+ name='face-61',
+ id=84,
+ color=[255, 255, 255],
+ type='',
+ swap='face-63'),
+ 85:
+ dict(name='face-62', id=85, color=[255, 255, 255], type='', swap=''),
+ 86:
+ dict(
+ name='face-63',
+ id=86,
+ color=[255, 255, 255],
+ type='',
+ swap='face-61'),
+ 87:
+ dict(
+ name='face-64',
+ id=87,
+ color=[255, 255, 255],
+ type='',
+ swap='face-60'),
+ 88:
+ dict(
+ name='face-65',
+ id=88,
+ color=[255, 255, 255],
+ type='',
+ swap='face-67'),
+ 89:
+ dict(name='face-66', id=89, color=[255, 255, 255], type='', swap=''),
+ 90:
+ dict(
+ name='face-67',
+ id=90,
+ color=[255, 255, 255],
+ type='',
+ swap='face-65'),
+ 91:
+ dict(
+ name='left_hand_root',
+ id=91,
+ color=[255, 255, 255],
+ type='',
+ swap='right_hand_root'),
+ 92:
+ dict(
+ name='left_thumb1',
+ id=92,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb1'),
+ 93:
+ dict(
+ name='left_thumb2',
+ id=93,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb2'),
+ 94:
+ dict(
+ name='left_thumb3',
+ id=94,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb3'),
+ 95:
+ dict(
+ name='left_thumb4',
+ id=95,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb4'),
+ 96:
+ dict(
+ name='left_forefinger1',
+ id=96,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger1'),
+ 97:
+ dict(
+ name='left_forefinger2',
+ id=97,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger2'),
+ 98:
+ dict(
+ name='left_forefinger3',
+ id=98,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger3'),
+ 99:
+ dict(
+ name='left_forefinger4',
+ id=99,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger4'),
+ 100:
+ dict(
+ name='left_middle_finger1',
+ id=100,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger1'),
+ 101:
+ dict(
+ name='left_middle_finger2',
+ id=101,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger2'),
+ 102:
+ dict(
+ name='left_middle_finger3',
+ id=102,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger3'),
+ 103:
+ dict(
+ name='left_middle_finger4',
+ id=103,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger4'),
+ 104:
+ dict(
+ name='left_ring_finger1',
+ id=104,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger1'),
+ 105:
+ dict(
+ name='left_ring_finger2',
+ id=105,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger2'),
+ 106:
+ dict(
+ name='left_ring_finger3',
+ id=106,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger3'),
+ 107:
+ dict(
+ name='left_ring_finger4',
+ id=107,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger4'),
+ 108:
+ dict(
+ name='left_pinky_finger1',
+ id=108,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger1'),
+ 109:
+ dict(
+ name='left_pinky_finger2',
+ id=109,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger2'),
+ 110:
+ dict(
+ name='left_pinky_finger3',
+ id=110,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger3'),
+ 111:
+ dict(
+ name='left_pinky_finger4',
+ id=111,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger4'),
+ 112:
+ dict(
+ name='right_hand_root',
+ id=112,
+ color=[255, 255, 255],
+ type='',
+ swap='left_hand_root'),
+ 113:
+ dict(
+ name='right_thumb1',
+ id=113,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb1'),
+ 114:
+ dict(
+ name='right_thumb2',
+ id=114,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb2'),
+ 115:
+ dict(
+ name='right_thumb3',
+ id=115,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb3'),
+ 116:
+ dict(
+ name='right_thumb4',
+ id=116,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb4'),
+ 117:
+ dict(
+ name='right_forefinger1',
+ id=117,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger1'),
+ 118:
+ dict(
+ name='right_forefinger2',
+ id=118,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger2'),
+ 119:
+ dict(
+ name='right_forefinger3',
+ id=119,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger3'),
+ 120:
+ dict(
+ name='right_forefinger4',
+ id=120,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger4'),
+ 121:
+ dict(
+ name='right_middle_finger1',
+ id=121,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger1'),
+ 122:
+ dict(
+ name='right_middle_finger2',
+ id=122,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger2'),
+ 123:
+ dict(
+ name='right_middle_finger3',
+ id=123,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger3'),
+ 124:
+ dict(
+ name='right_middle_finger4',
+ id=124,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger4'),
+ 125:
+ dict(
+ name='right_ring_finger1',
+ id=125,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger1'),
+ 126:
+ dict(
+ name='right_ring_finger2',
+ id=126,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger2'),
+ 127:
+ dict(
+ name='right_ring_finger3',
+ id=127,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger3'),
+ 128:
+ dict(
+ name='right_ring_finger4',
+ id=128,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger4'),
+ 129:
+ dict(
+ name='right_pinky_finger1',
+ id=129,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger1'),
+ 130:
+ dict(
+ name='right_pinky_finger2',
+ id=130,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger2'),
+ 131:
+ dict(
+ name='right_pinky_finger3',
+ id=131,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger3'),
+ 132:
+ dict(
+ name='right_pinky_finger4',
+ id=132,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger4')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+ 6:
+ dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(
+ link=('left_shoulder', 'right_shoulder'),
+ id=7,
+ color=[51, 153, 255]),
+ 8:
+ dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('left_eye', 'right_eye'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('nose', 'left_eye'), id=13, color=[51, 153, 255]),
+ 14:
+ dict(link=('nose', 'right_eye'), id=14, color=[51, 153, 255]),
+ 15:
+ dict(link=('left_eye', 'left_ear'), id=15, color=[51, 153, 255]),
+ 16:
+ dict(link=('right_eye', 'right_ear'), id=16, color=[51, 153, 255]),
+ 17:
+ dict(link=('left_ear', 'left_shoulder'), id=17, color=[51, 153, 255]),
+ 18:
+ dict(
+ link=('right_ear', 'right_shoulder'), id=18, color=[51, 153, 255]),
+ 19:
+ dict(link=('left_ankle', 'left_big_toe'), id=19, color=[0, 255, 0]),
+ 20:
+ dict(link=('left_ankle', 'left_small_toe'), id=20, color=[0, 255, 0]),
+ 21:
+ dict(link=('left_ankle', 'left_heel'), id=21, color=[0, 255, 0]),
+ 22:
+ dict(
+ link=('right_ankle', 'right_big_toe'), id=22, color=[255, 128, 0]),
+ 23:
+ dict(
+ link=('right_ankle', 'right_small_toe'),
+ id=23,
+ color=[255, 128, 0]),
+ 24:
+ dict(link=('right_ankle', 'right_heel'), id=24, color=[255, 128, 0]),
+ 25:
+ dict(
+ link=('left_hand_root', 'left_thumb1'), id=25, color=[255, 128,
+ 0]),
+ 26:
+ dict(link=('left_thumb1', 'left_thumb2'), id=26, color=[255, 128, 0]),
+ 27:
+ dict(link=('left_thumb2', 'left_thumb3'), id=27, color=[255, 128, 0]),
+ 28:
+ dict(link=('left_thumb3', 'left_thumb4'), id=28, color=[255, 128, 0]),
+ 29:
+ dict(
+ link=('left_hand_root', 'left_forefinger1'),
+ id=29,
+ color=[255, 153, 255]),
+ 30:
+ dict(
+ link=('left_forefinger1', 'left_forefinger2'),
+ id=30,
+ color=[255, 153, 255]),
+ 31:
+ dict(
+ link=('left_forefinger2', 'left_forefinger3'),
+ id=31,
+ color=[255, 153, 255]),
+ 32:
+ dict(
+ link=('left_forefinger3', 'left_forefinger4'),
+ id=32,
+ color=[255, 153, 255]),
+ 33:
+ dict(
+ link=('left_hand_root', 'left_middle_finger1'),
+ id=33,
+ color=[102, 178, 255]),
+ 34:
+ dict(
+ link=('left_middle_finger1', 'left_middle_finger2'),
+ id=34,
+ color=[102, 178, 255]),
+ 35:
+ dict(
+ link=('left_middle_finger2', 'left_middle_finger3'),
+ id=35,
+ color=[102, 178, 255]),
+ 36:
+ dict(
+ link=('left_middle_finger3', 'left_middle_finger4'),
+ id=36,
+ color=[102, 178, 255]),
+ 37:
+ dict(
+ link=('left_hand_root', 'left_ring_finger1'),
+ id=37,
+ color=[255, 51, 51]),
+ 38:
+ dict(
+ link=('left_ring_finger1', 'left_ring_finger2'),
+ id=38,
+ color=[255, 51, 51]),
+ 39:
+ dict(
+ link=('left_ring_finger2', 'left_ring_finger3'),
+ id=39,
+ color=[255, 51, 51]),
+ 40:
+ dict(
+ link=('left_ring_finger3', 'left_ring_finger4'),
+ id=40,
+ color=[255, 51, 51]),
+ 41:
+ dict(
+ link=('left_hand_root', 'left_pinky_finger1'),
+ id=41,
+ color=[0, 255, 0]),
+ 42:
+ dict(
+ link=('left_pinky_finger1', 'left_pinky_finger2'),
+ id=42,
+ color=[0, 255, 0]),
+ 43:
+ dict(
+ link=('left_pinky_finger2', 'left_pinky_finger3'),
+ id=43,
+ color=[0, 255, 0]),
+ 44:
+ dict(
+ link=('left_pinky_finger3', 'left_pinky_finger4'),
+ id=44,
+ color=[0, 255, 0]),
+ 45:
+ dict(
+ link=('right_hand_root', 'right_thumb1'),
+ id=45,
+ color=[255, 128, 0]),
+ 46:
+ dict(
+ link=('right_thumb1', 'right_thumb2'), id=46, color=[255, 128, 0]),
+ 47:
+ dict(
+ link=('right_thumb2', 'right_thumb3'), id=47, color=[255, 128, 0]),
+ 48:
+ dict(
+ link=('right_thumb3', 'right_thumb4'), id=48, color=[255, 128, 0]),
+ 49:
+ dict(
+ link=('right_hand_root', 'right_forefinger1'),
+ id=49,
+ color=[255, 153, 255]),
+ 50:
+ dict(
+ link=('right_forefinger1', 'right_forefinger2'),
+ id=50,
+ color=[255, 153, 255]),
+ 51:
+ dict(
+ link=('right_forefinger2', 'right_forefinger3'),
+ id=51,
+ color=[255, 153, 255]),
+ 52:
+ dict(
+ link=('right_forefinger3', 'right_forefinger4'),
+ id=52,
+ color=[255, 153, 255]),
+ 53:
+ dict(
+ link=('right_hand_root', 'right_middle_finger1'),
+ id=53,
+ color=[102, 178, 255]),
+ 54:
+ dict(
+ link=('right_middle_finger1', 'right_middle_finger2'),
+ id=54,
+ color=[102, 178, 255]),
+ 55:
+ dict(
+ link=('right_middle_finger2', 'right_middle_finger3'),
+ id=55,
+ color=[102, 178, 255]),
+ 56:
+ dict(
+ link=('right_middle_finger3', 'right_middle_finger4'),
+ id=56,
+ color=[102, 178, 255]),
+ 57:
+ dict(
+ link=('right_hand_root', 'right_ring_finger1'),
+ id=57,
+ color=[255, 51, 51]),
+ 58:
+ dict(
+ link=('right_ring_finger1', 'right_ring_finger2'),
+ id=58,
+ color=[255, 51, 51]),
+ 59:
+ dict(
+ link=('right_ring_finger2', 'right_ring_finger3'),
+ id=59,
+ color=[255, 51, 51]),
+ 60:
+ dict(
+ link=('right_ring_finger3', 'right_ring_finger4'),
+ id=60,
+ color=[255, 51, 51]),
+ 61:
+ dict(
+ link=('right_hand_root', 'right_pinky_finger1'),
+ id=61,
+ color=[0, 255, 0]),
+ 62:
+ dict(
+ link=('right_pinky_finger1', 'right_pinky_finger2'),
+ id=62,
+ color=[0, 255, 0]),
+ 63:
+ dict(
+ link=('right_pinky_finger2', 'right_pinky_finger3'),
+ id=63,
+ color=[0, 255, 0]),
+ 64:
+ dict(
+ link=('right_pinky_finger3', 'right_pinky_finger4'),
+ id=64,
+ color=[0, 255, 0])
+ },
+ joint_weights=[1.] * 133,
+ # 'https://github.com/jin-s13/COCO-WholeBody/blob/master/'
+ # 'evaluation/myeval_wholebody.py#L175'
+ sigmas=[
+ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+ 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089, 0.068, 0.066, 0.066,
+ 0.092, 0.094, 0.094, 0.042, 0.043, 0.044, 0.043, 0.040, 0.035, 0.031,
+ 0.025, 0.020, 0.023, 0.029, 0.032, 0.037, 0.038, 0.043, 0.041, 0.045,
+ 0.013, 0.012, 0.011, 0.011, 0.012, 0.012, 0.011, 0.011, 0.013, 0.015,
+ 0.009, 0.007, 0.007, 0.007, 0.012, 0.009, 0.008, 0.016, 0.010, 0.017,
+ 0.011, 0.009, 0.011, 0.009, 0.007, 0.013, 0.008, 0.011, 0.012, 0.010,
+ 0.034, 0.008, 0.008, 0.009, 0.008, 0.008, 0.007, 0.010, 0.008, 0.009,
+ 0.009, 0.009, 0.007, 0.007, 0.008, 0.011, 0.008, 0.008, 0.008, 0.01,
+ 0.008, 0.029, 0.022, 0.035, 0.037, 0.047, 0.026, 0.025, 0.024, 0.035,
+ 0.018, 0.024, 0.022, 0.026, 0.017, 0.021, 0.021, 0.032, 0.02, 0.019,
+ 0.022, 0.031, 0.029, 0.022, 0.035, 0.037, 0.047, 0.026, 0.025, 0.024,
+ 0.035, 0.018, 0.024, 0.022, 0.026, 0.017, 0.021, 0.021, 0.032, 0.02,
+ 0.019, 0.022, 0.031
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody2goliath.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody2goliath.py
new file mode 100644
index 0000000000000000000000000000000000000000..4f05e4f9ceb563f2ef6c6dc22a7cb926d44a5330
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody2goliath.py
@@ -0,0 +1,11 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from configs._base_.datasets.goliath import dataset_info as goliath_info
+
+goliath_info = goliath_info.build()
+dataset_info = goliath_info.copy()
+dataset_info['dataset_name'] = 'coco_wholebody2goliath'
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody2goliath3d.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody2goliath3d.py
new file mode 100644
index 0000000000000000000000000000000000000000..517fa23d2af51c56a231dd9da2a26f32e792749c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody2goliath3d.py
@@ -0,0 +1,11 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from configs._base_.datasets.goliath3d import dataset_info as goliath_info
+
+goliath_info = goliath_info.build()
+dataset_info = goliath_info.copy()
+dataset_info['dataset_name'] = 'coco_wholebody2goliath3d'
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody_face.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody_face.py
new file mode 100644
index 0000000000000000000000000000000000000000..55c204ec982fce6d1c204fb986e7088ede1a08b2
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody_face.py
@@ -0,0 +1,160 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='coco_wholebody_face',
+ paper_info=dict(
+ author='Jin, Sheng and Xu, Lumin and Xu, Jin and '
+ 'Wang, Can and Liu, Wentao and '
+ 'Qian, Chen and Ouyang, Wanli and Luo, Ping',
+ title='Whole-Body Human Pose Estimation in the Wild',
+ container='Proceedings of the European '
+ 'Conference on Computer Vision (ECCV)',
+ year='2020',
+ homepage='https://github.com/jin-s13/COCO-WholeBody/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='face-0', id=0, color=[255, 0, 0], type='', swap='face-16'),
+ 1:
+ dict(name='face-1', id=1, color=[255, 0, 0], type='', swap='face-15'),
+ 2:
+ dict(name='face-2', id=2, color=[255, 0, 0], type='', swap='face-14'),
+ 3:
+ dict(name='face-3', id=3, color=[255, 0, 0], type='', swap='face-13'),
+ 4:
+ dict(name='face-4', id=4, color=[255, 0, 0], type='', swap='face-12'),
+ 5:
+ dict(name='face-5', id=5, color=[255, 0, 0], type='', swap='face-11'),
+ 6:
+ dict(name='face-6', id=6, color=[255, 0, 0], type='', swap='face-10'),
+ 7:
+ dict(name='face-7', id=7, color=[255, 0, 0], type='', swap='face-9'),
+ 8: dict(name='face-8', id=8, color=[255, 0, 0], type='', swap=''),
+ 9:
+ dict(name='face-9', id=9, color=[255, 0, 0], type='', swap='face-7'),
+ 10:
+ dict(name='face-10', id=10, color=[255, 0, 0], type='', swap='face-6'),
+ 11:
+ dict(name='face-11', id=11, color=[255, 0, 0], type='', swap='face-5'),
+ 12:
+ dict(name='face-12', id=12, color=[255, 0, 0], type='', swap='face-4'),
+ 13:
+ dict(name='face-13', id=13, color=[255, 0, 0], type='', swap='face-3'),
+ 14:
+ dict(name='face-14', id=14, color=[255, 0, 0], type='', swap='face-2'),
+ 15:
+ dict(name='face-15', id=15, color=[255, 0, 0], type='', swap='face-1'),
+ 16:
+ dict(name='face-16', id=16, color=[255, 0, 0], type='', swap='face-0'),
+ 17: dict(
+ name='face-17', id=17, color=[255, 0, 0], type='', swap='face-26'),
+ 18: dict(
+ name='face-18', id=18, color=[255, 0, 0], type='', swap='face-25'),
+ 19: dict(
+ name='face-19', id=19, color=[255, 0, 0], type='', swap='face-24'),
+ 20: dict(
+ name='face-20', id=20, color=[255, 0, 0], type='', swap='face-23'),
+ 21: dict(
+ name='face-21', id=21, color=[255, 0, 0], type='', swap='face-22'),
+ 22: dict(
+ name='face-22', id=22, color=[255, 0, 0], type='', swap='face-21'),
+ 23: dict(
+ name='face-23', id=23, color=[255, 0, 0], type='', swap='face-20'),
+ 24: dict(
+ name='face-24', id=24, color=[255, 0, 0], type='', swap='face-19'),
+ 25: dict(
+ name='face-25', id=25, color=[255, 0, 0], type='', swap='face-18'),
+ 26: dict(
+ name='face-26', id=26, color=[255, 0, 0], type='', swap='face-17'),
+ 27: dict(name='face-27', id=27, color=[255, 0, 0], type='', swap=''),
+ 28: dict(name='face-28', id=28, color=[255, 0, 0], type='', swap=''),
+ 29: dict(name='face-29', id=29, color=[255, 0, 0], type='', swap=''),
+ 30: dict(name='face-30', id=30, color=[255, 0, 0], type='', swap=''),
+ 31: dict(
+ name='face-31', id=31, color=[255, 0, 0], type='', swap='face-35'),
+ 32: dict(
+ name='face-32', id=32, color=[255, 0, 0], type='', swap='face-34'),
+ 33: dict(name='face-33', id=33, color=[255, 0, 0], type='', swap=''),
+ 34: dict(
+ name='face-34', id=34, color=[255, 0, 0], type='', swap='face-32'),
+ 35: dict(
+ name='face-35', id=35, color=[255, 0, 0], type='', swap='face-31'),
+ 36: dict(
+ name='face-36', id=36, color=[255, 0, 0], type='', swap='face-45'),
+ 37: dict(
+ name='face-37', id=37, color=[255, 0, 0], type='', swap='face-44'),
+ 38: dict(
+ name='face-38', id=38, color=[255, 0, 0], type='', swap='face-43'),
+ 39: dict(
+ name='face-39', id=39, color=[255, 0, 0], type='', swap='face-42'),
+ 40: dict(
+ name='face-40', id=40, color=[255, 0, 0], type='', swap='face-47'),
+ 41: dict(
+ name='face-41', id=41, color=[255, 0, 0], type='', swap='face-46'),
+ 42: dict(
+ name='face-42', id=42, color=[255, 0, 0], type='', swap='face-39'),
+ 43: dict(
+ name='face-43', id=43, color=[255, 0, 0], type='', swap='face-38'),
+ 44: dict(
+ name='face-44', id=44, color=[255, 0, 0], type='', swap='face-37'),
+ 45: dict(
+ name='face-45', id=45, color=[255, 0, 0], type='', swap='face-36'),
+ 46: dict(
+ name='face-46', id=46, color=[255, 0, 0], type='', swap='face-41'),
+ 47: dict(
+ name='face-47', id=47, color=[255, 0, 0], type='', swap='face-40'),
+ 48: dict(
+ name='face-48', id=48, color=[255, 0, 0], type='', swap='face-54'),
+ 49: dict(
+ name='face-49', id=49, color=[255, 0, 0], type='', swap='face-53'),
+ 50: dict(
+ name='face-50', id=50, color=[255, 0, 0], type='', swap='face-52'),
+ 51: dict(name='face-51', id=52, color=[255, 0, 0], type='', swap=''),
+ 52: dict(
+ name='face-52', id=52, color=[255, 0, 0], type='', swap='face-50'),
+ 53: dict(
+ name='face-53', id=53, color=[255, 0, 0], type='', swap='face-49'),
+ 54: dict(
+ name='face-54', id=54, color=[255, 0, 0], type='', swap='face-48'),
+ 55: dict(
+ name='face-55', id=55, color=[255, 0, 0], type='', swap='face-59'),
+ 56: dict(
+ name='face-56', id=56, color=[255, 0, 0], type='', swap='face-58'),
+ 57: dict(name='face-57', id=57, color=[255, 0, 0], type='', swap=''),
+ 58: dict(
+ name='face-58', id=58, color=[255, 0, 0], type='', swap='face-56'),
+ 59: dict(
+ name='face-59', id=59, color=[255, 0, 0], type='', swap='face-55'),
+ 60: dict(
+ name='face-60', id=60, color=[255, 0, 0], type='', swap='face-64'),
+ 61: dict(
+ name='face-61', id=61, color=[255, 0, 0], type='', swap='face-63'),
+ 62: dict(name='face-62', id=62, color=[255, 0, 0], type='', swap=''),
+ 63: dict(
+ name='face-63', id=63, color=[255, 0, 0], type='', swap='face-61'),
+ 64: dict(
+ name='face-64', id=64, color=[255, 0, 0], type='', swap='face-60'),
+ 65: dict(
+ name='face-65', id=65, color=[255, 0, 0], type='', swap='face-67'),
+ 66: dict(name='face-66', id=66, color=[255, 0, 0], type='', swap=''),
+ 67: dict(
+ name='face-67', id=67, color=[255, 0, 0], type='', swap='face-65')
+ },
+ skeleton_info={},
+ joint_weights=[1.] * 68,
+
+ # 'https://github.com/jin-s13/COCO-WholeBody/blob/master/'
+ # 'evaluation/myeval_wholebody.py#L177'
+ sigmas=[
+ 0.042, 0.043, 0.044, 0.043, 0.040, 0.035, 0.031, 0.025, 0.020, 0.023,
+ 0.029, 0.032, 0.037, 0.038, 0.043, 0.041, 0.045, 0.013, 0.012, 0.011,
+ 0.011, 0.012, 0.012, 0.011, 0.011, 0.013, 0.015, 0.009, 0.007, 0.007,
+ 0.007, 0.012, 0.009, 0.008, 0.016, 0.010, 0.017, 0.011, 0.009, 0.011,
+ 0.009, 0.007, 0.013, 0.008, 0.011, 0.012, 0.010, 0.034, 0.008, 0.008,
+ 0.009, 0.008, 0.008, 0.007, 0.010, 0.008, 0.009, 0.009, 0.009, 0.007,
+ 0.007, 0.008, 0.011, 0.008, 0.008, 0.008, 0.01, 0.008
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody_hand.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody_hand.py
new file mode 100644
index 0000000000000000000000000000000000000000..06f6efec089a388257a6ecb03d98152e126955f8
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody_hand.py
@@ -0,0 +1,153 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='coco_wholebody_hand',
+ paper_info=dict(
+ author='Jin, Sheng and Xu, Lumin and Xu, Jin and '
+ 'Wang, Can and Liu, Wentao and '
+ 'Qian, Chen and Ouyang, Wanli and Luo, Ping',
+ title='Whole-Body Human Pose Estimation in the Wild',
+ container='Proceedings of the European '
+ 'Conference on Computer Vision (ECCV)',
+ year='2020',
+ homepage='https://github.com/jin-s13/COCO-WholeBody/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='wrist', id=0, color=[255, 255, 255], type='', swap=''),
+ 1:
+ dict(name='thumb1', id=1, color=[255, 128, 0], type='', swap=''),
+ 2:
+ dict(name='thumb2', id=2, color=[255, 128, 0], type='', swap=''),
+ 3:
+ dict(name='thumb3', id=3, color=[255, 128, 0], type='', swap=''),
+ 4:
+ dict(name='thumb4', id=4, color=[255, 128, 0], type='', swap=''),
+ 5:
+ dict(
+ name='forefinger1', id=5, color=[255, 153, 255], type='', swap=''),
+ 6:
+ dict(
+ name='forefinger2', id=6, color=[255, 153, 255], type='', swap=''),
+ 7:
+ dict(
+ name='forefinger3', id=7, color=[255, 153, 255], type='', swap=''),
+ 8:
+ dict(
+ name='forefinger4', id=8, color=[255, 153, 255], type='', swap=''),
+ 9:
+ dict(
+ name='middle_finger1',
+ id=9,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 10:
+ dict(
+ name='middle_finger2',
+ id=10,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 11:
+ dict(
+ name='middle_finger3',
+ id=11,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 12:
+ dict(
+ name='middle_finger4',
+ id=12,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 13:
+ dict(
+ name='ring_finger1', id=13, color=[255, 51, 51], type='', swap=''),
+ 14:
+ dict(
+ name='ring_finger2', id=14, color=[255, 51, 51], type='', swap=''),
+ 15:
+ dict(
+ name='ring_finger3', id=15, color=[255, 51, 51], type='', swap=''),
+ 16:
+ dict(
+ name='ring_finger4', id=16, color=[255, 51, 51], type='', swap=''),
+ 17:
+ dict(name='pinky_finger1', id=17, color=[0, 255, 0], type='', swap=''),
+ 18:
+ dict(name='pinky_finger2', id=18, color=[0, 255, 0], type='', swap=''),
+ 19:
+ dict(name='pinky_finger3', id=19, color=[0, 255, 0], type='', swap=''),
+ 20:
+ dict(name='pinky_finger4', id=20, color=[0, 255, 0], type='', swap='')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('wrist', 'thumb1'), id=0, color=[255, 128, 0]),
+ 1:
+ dict(link=('thumb1', 'thumb2'), id=1, color=[255, 128, 0]),
+ 2:
+ dict(link=('thumb2', 'thumb3'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('thumb3', 'thumb4'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('wrist', 'forefinger1'), id=4, color=[255, 153, 255]),
+ 5:
+ dict(link=('forefinger1', 'forefinger2'), id=5, color=[255, 153, 255]),
+ 6:
+ dict(link=('forefinger2', 'forefinger3'), id=6, color=[255, 153, 255]),
+ 7:
+ dict(link=('forefinger3', 'forefinger4'), id=7, color=[255, 153, 255]),
+ 8:
+ dict(link=('wrist', 'middle_finger1'), id=8, color=[102, 178, 255]),
+ 9:
+ dict(
+ link=('middle_finger1', 'middle_finger2'),
+ id=9,
+ color=[102, 178, 255]),
+ 10:
+ dict(
+ link=('middle_finger2', 'middle_finger3'),
+ id=10,
+ color=[102, 178, 255]),
+ 11:
+ dict(
+ link=('middle_finger3', 'middle_finger4'),
+ id=11,
+ color=[102, 178, 255]),
+ 12:
+ dict(link=('wrist', 'ring_finger1'), id=12, color=[255, 51, 51]),
+ 13:
+ dict(
+ link=('ring_finger1', 'ring_finger2'), id=13, color=[255, 51, 51]),
+ 14:
+ dict(
+ link=('ring_finger2', 'ring_finger3'), id=14, color=[255, 51, 51]),
+ 15:
+ dict(
+ link=('ring_finger3', 'ring_finger4'), id=15, color=[255, 51, 51]),
+ 16:
+ dict(link=('wrist', 'pinky_finger1'), id=16, color=[0, 255, 0]),
+ 17:
+ dict(
+ link=('pinky_finger1', 'pinky_finger2'), id=17, color=[0, 255, 0]),
+ 18:
+ dict(
+ link=('pinky_finger2', 'pinky_finger3'), id=18, color=[0, 255, 0]),
+ 19:
+ dict(
+ link=('pinky_finger3', 'pinky_finger4'), id=19, color=[0, 255, 0])
+ },
+ joint_weights=[1.] * 21,
+ sigmas=[
+ 0.029, 0.022, 0.035, 0.037, 0.047, 0.026, 0.025, 0.024, 0.035, 0.018,
+ 0.024, 0.022, 0.026, 0.017, 0.021, 0.021, 0.032, 0.02, 0.019, 0.022,
+ 0.031
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody_openpose.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody_openpose.py
new file mode 100644
index 0000000000000000000000000000000000000000..2e07a6f0bd516203b6a351d611ce9461fd5e0993
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/coco_wholebody_openpose.py
@@ -0,0 +1,1034 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='coco_wholebody_openpose',
+ paper_info=dict(
+ author='Jin, Sheng and Xu, Lumin and Xu, Jin and '
+ 'Wang, Can and Liu, Wentao and '
+ 'Qian, Chen and Ouyang, Wanli and Luo, Ping',
+ title='Whole-Body Human Pose Estimation in the Wild',
+ container='Proceedings of the European '
+ 'Conference on Computer Vision (ECCV)',
+ year='2020',
+ homepage='https://github.com/jin-s13/COCO-WholeBody/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[255, 0, 0], type='upper', swap=''),
+ 1:
+ dict(name='neck', id=1, color=[255, 85, 0], type='upper', swap=''),
+ 2:
+ dict(
+ name='right_shoulder',
+ id=2,
+ color=[255, 170, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 3:
+ dict(
+ name='right_elbow',
+ id=3,
+ color=[255, 255, 0],
+ type='upper',
+ swap='left_elbow'),
+ 4:
+ dict(
+ name='right_wrist',
+ id=4,
+ color=[170, 255, 0],
+ type='upper',
+ swap='left_wrist'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[85, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='left_elbow',
+ id=6,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 7:
+ dict(
+ name='left_wrist',
+ id=7,
+ color=[0, 255, 85],
+ type='upper',
+ swap='right_wrist'),
+ 8:
+ dict(
+ name='right_hip',
+ id=8,
+ color=[0, 255, 170],
+ type='lower',
+ swap='left_hip'),
+ 9:
+ dict(
+ name='right_knee',
+ id=9,
+ color=[0, 255, 255],
+ type='lower',
+ swap='left_knee'),
+ 10:
+ dict(
+ name='right_ankle',
+ id=10,
+ color=[0, 170, 255],
+ type='lower',
+ swap='left_ankle'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 85, 255],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='left_knee',
+ id=12,
+ color=[0, 0, 255],
+ type='lower',
+ swap='right_knee'),
+ 13:
+ dict(
+ name='left_ankle',
+ id=13,
+ color=[85, 0, 255],
+ type='lower',
+ swap='right_ankle'),
+ 14:
+ dict(
+ name='right_eye',
+ id=14,
+ color=[170, 0, 255],
+ type='upper',
+ swap='left_eye'),
+ 15:
+ dict(
+ name='left_eye',
+ id=15,
+ color=[255, 0, 255],
+ type='upper',
+ swap='right_eye'),
+ 16:
+ dict(
+ name='right_ear',
+ id=16,
+ color=[255, 0, 170],
+ type='upper',
+ swap='left_ear'),
+ 17:
+ dict(
+ name='left_ear',
+ id=17,
+ color=[255, 0, 85],
+ type='upper',
+ swap='right_ear'),
+ 18:
+ dict(
+ name='left_big_toe',
+ id=18,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_big_toe'),
+ 19:
+ dict(
+ name='left_small_toe',
+ id=19,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_small_toe'),
+ 20:
+ dict(
+ name='left_heel',
+ id=20,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_heel'),
+ 21:
+ dict(
+ name='right_big_toe',
+ id=21,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_big_toe'),
+ 22:
+ dict(
+ name='right_small_toe',
+ id=22,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_small_toe'),
+ 23:
+ dict(
+ name='right_heel',
+ id=23,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_heel'),
+ 24:
+ dict(
+ name='face-0',
+ id=24,
+ color=[255, 255, 255],
+ type='',
+ swap='face-16'),
+ 25:
+ dict(
+ name='face-1',
+ id=25,
+ color=[255, 255, 255],
+ type='',
+ swap='face-15'),
+ 26:
+ dict(
+ name='face-2',
+ id=26,
+ color=[255, 255, 255],
+ type='',
+ swap='face-14'),
+ 27:
+ dict(
+ name='face-3',
+ id=27,
+ color=[255, 255, 255],
+ type='',
+ swap='face-13'),
+ 28:
+ dict(
+ name='face-4',
+ id=28,
+ color=[255, 255, 255],
+ type='',
+ swap='face-12'),
+ 29:
+ dict(
+ name='face-5',
+ id=29,
+ color=[255, 255, 255],
+ type='',
+ swap='face-11'),
+ 30:
+ dict(
+ name='face-6',
+ id=30,
+ color=[255, 255, 255],
+ type='',
+ swap='face-10'),
+ 31:
+ dict(
+ name='face-7',
+ id=31,
+ color=[255, 255, 255],
+ type='',
+ swap='face-9'),
+ 32:
+ dict(name='face-8', id=32, color=[255, 255, 255], type='', swap=''),
+ 33:
+ dict(
+ name='face-9',
+ id=33,
+ color=[255, 255, 255],
+ type='',
+ swap='face-7'),
+ 34:
+ dict(
+ name='face-10',
+ id=34,
+ color=[255, 255, 255],
+ type='',
+ swap='face-6'),
+ 35:
+ dict(
+ name='face-11',
+ id=35,
+ color=[255, 255, 255],
+ type='',
+ swap='face-5'),
+ 36:
+ dict(
+ name='face-12',
+ id=36,
+ color=[255, 255, 255],
+ type='',
+ swap='face-4'),
+ 37:
+ dict(
+ name='face-13',
+ id=37,
+ color=[255, 255, 255],
+ type='',
+ swap='face-3'),
+ 38:
+ dict(
+ name='face-14',
+ id=38,
+ color=[255, 255, 255],
+ type='',
+ swap='face-2'),
+ 39:
+ dict(
+ name='face-15',
+ id=39,
+ color=[255, 255, 255],
+ type='',
+ swap='face-1'),
+ 40:
+ dict(
+ name='face-16',
+ id=40,
+ color=[255, 255, 255],
+ type='',
+ swap='face-0'),
+ 41:
+ dict(
+ name='face-17',
+ id=41,
+ color=[255, 255, 255],
+ type='',
+ swap='face-26'),
+ 42:
+ dict(
+ name='face-18',
+ id=42,
+ color=[255, 255, 255],
+ type='',
+ swap='face-25'),
+ 43:
+ dict(
+ name='face-19',
+ id=43,
+ color=[255, 255, 255],
+ type='',
+ swap='face-24'),
+ 44:
+ dict(
+ name='face-20',
+ id=44,
+ color=[255, 255, 255],
+ type='',
+ swap='face-23'),
+ 45:
+ dict(
+ name='face-21',
+ id=45,
+ color=[255, 255, 255],
+ type='',
+ swap='face-22'),
+ 46:
+ dict(
+ name='face-22',
+ id=46,
+ color=[255, 255, 255],
+ type='',
+ swap='face-21'),
+ 47:
+ dict(
+ name='face-23',
+ id=47,
+ color=[255, 255, 255],
+ type='',
+ swap='face-20'),
+ 48:
+ dict(
+ name='face-24',
+ id=48,
+ color=[255, 255, 255],
+ type='',
+ swap='face-19'),
+ 49:
+ dict(
+ name='face-25',
+ id=49,
+ color=[255, 255, 255],
+ type='',
+ swap='face-18'),
+ 50:
+ dict(
+ name='face-26',
+ id=50,
+ color=[255, 255, 255],
+ type='',
+ swap='face-17'),
+ 51:
+ dict(name='face-27', id=51, color=[255, 255, 255], type='', swap=''),
+ 52:
+ dict(name='face-28', id=52, color=[255, 255, 255], type='', swap=''),
+ 53:
+ dict(name='face-29', id=53, color=[255, 255, 255], type='', swap=''),
+ 54:
+ dict(name='face-30', id=54, color=[255, 255, 255], type='', swap=''),
+ 55:
+ dict(
+ name='face-31',
+ id=55,
+ color=[255, 255, 255],
+ type='',
+ swap='face-35'),
+ 56:
+ dict(
+ name='face-32',
+ id=56,
+ color=[255, 255, 255],
+ type='',
+ swap='face-34'),
+ 57:
+ dict(name='face-33', id=57, color=[255, 255, 255], type='', swap=''),
+ 58:
+ dict(
+ name='face-34',
+ id=58,
+ color=[255, 255, 255],
+ type='',
+ swap='face-32'),
+ 59:
+ dict(
+ name='face-35',
+ id=59,
+ color=[255, 255, 255],
+ type='',
+ swap='face-31'),
+ 60:
+ dict(
+ name='face-36',
+ id=60,
+ color=[255, 255, 255],
+ type='',
+ swap='face-45'),
+ 61:
+ dict(
+ name='face-37',
+ id=61,
+ color=[255, 255, 255],
+ type='',
+ swap='face-44'),
+ 62:
+ dict(
+ name='face-38',
+ id=62,
+ color=[255, 255, 255],
+ type='',
+ swap='face-43'),
+ 63:
+ dict(
+ name='face-39',
+ id=63,
+ color=[255, 255, 255],
+ type='',
+ swap='face-42'),
+ 64:
+ dict(
+ name='face-40',
+ id=64,
+ color=[255, 255, 255],
+ type='',
+ swap='face-47'),
+ 65:
+ dict(
+ name='face-41',
+ id=65,
+ color=[255, 255, 255],
+ type='',
+ swap='face-46'),
+ 66:
+ dict(
+ name='face-42',
+ id=66,
+ color=[255, 255, 255],
+ type='',
+ swap='face-39'),
+ 67:
+ dict(
+ name='face-43',
+ id=67,
+ color=[255, 255, 255],
+ type='',
+ swap='face-38'),
+ 68:
+ dict(
+ name='face-44',
+ id=68,
+ color=[255, 255, 255],
+ type='',
+ swap='face-37'),
+ 69:
+ dict(
+ name='face-45',
+ id=69,
+ color=[255, 255, 255],
+ type='',
+ swap='face-36'),
+ 70:
+ dict(
+ name='face-46',
+ id=70,
+ color=[255, 255, 255],
+ type='',
+ swap='face-41'),
+ 71:
+ dict(
+ name='face-47',
+ id=71,
+ color=[255, 255, 255],
+ type='',
+ swap='face-40'),
+ 72:
+ dict(
+ name='face-48',
+ id=72,
+ color=[255, 255, 255],
+ type='',
+ swap='face-54'),
+ 73:
+ dict(
+ name='face-49',
+ id=73,
+ color=[255, 255, 255],
+ type='',
+ swap='face-53'),
+ 74:
+ dict(
+ name='face-50',
+ id=74,
+ color=[255, 255, 255],
+ type='',
+ swap='face-52'),
+ 75:
+ dict(name='face-51', id=75, color=[255, 255, 255], type='', swap=''),
+ 76:
+ dict(
+ name='face-52',
+ id=76,
+ color=[255, 255, 255],
+ type='',
+ swap='face-50'),
+ 77:
+ dict(
+ name='face-53',
+ id=77,
+ color=[255, 255, 255],
+ type='',
+ swap='face-49'),
+ 78:
+ dict(
+ name='face-54',
+ id=78,
+ color=[255, 255, 255],
+ type='',
+ swap='face-48'),
+ 79:
+ dict(
+ name='face-55',
+ id=79,
+ color=[255, 255, 255],
+ type='',
+ swap='face-59'),
+ 80:
+ dict(
+ name='face-56',
+ id=80,
+ color=[255, 255, 255],
+ type='',
+ swap='face-58'),
+ 81:
+ dict(name='face-57', id=81, color=[255, 255, 255], type='', swap=''),
+ 82:
+ dict(
+ name='face-58',
+ id=82,
+ color=[255, 255, 255],
+ type='',
+ swap='face-56'),
+ 83:
+ dict(
+ name='face-59',
+ id=83,
+ color=[255, 255, 255],
+ type='',
+ swap='face-55'),
+ 84:
+ dict(
+ name='face-60',
+ id=84,
+ color=[255, 255, 255],
+ type='',
+ swap='face-64'),
+ 85:
+ dict(
+ name='face-61',
+ id=85,
+ color=[255, 255, 255],
+ type='',
+ swap='face-63'),
+ 86:
+ dict(name='face-62', id=86, color=[255, 255, 255], type='', swap=''),
+ 87:
+ dict(
+ name='face-63',
+ id=87,
+ color=[255, 255, 255],
+ type='',
+ swap='face-61'),
+ 88:
+ dict(
+ name='face-64',
+ id=88,
+ color=[255, 255, 255],
+ type='',
+ swap='face-60'),
+ 89:
+ dict(
+ name='face-65',
+ id=89,
+ color=[255, 255, 255],
+ type='',
+ swap='face-67'),
+ 90:
+ dict(name='face-66', id=90, color=[255, 255, 255], type='', swap=''),
+ 91:
+ dict(
+ name='face-67',
+ id=91,
+ color=[255, 255, 255],
+ type='',
+ swap='face-65'),
+ 92:
+ dict(
+ name='left_hand_root',
+ id=92,
+ color=[255, 255, 255],
+ type='',
+ swap='right_hand_root'),
+ 93:
+ dict(
+ name='left_thumb1',
+ id=93,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb1'),
+ 94:
+ dict(
+ name='left_thumb2',
+ id=94,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb2'),
+ 95:
+ dict(
+ name='left_thumb3',
+ id=95,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb3'),
+ 96:
+ dict(
+ name='left_thumb4',
+ id=96,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb4'),
+ 97:
+ dict(
+ name='left_forefinger1',
+ id=97,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger1'),
+ 98:
+ dict(
+ name='left_forefinger2',
+ id=98,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger2'),
+ 99:
+ dict(
+ name='left_forefinger3',
+ id=99,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger3'),
+ 100:
+ dict(
+ name='left_forefinger4',
+ id=100,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger4'),
+ 101:
+ dict(
+ name='left_middle_finger1',
+ id=101,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger1'),
+ 102:
+ dict(
+ name='left_middle_finger2',
+ id=102,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger2'),
+ 103:
+ dict(
+ name='left_middle_finger3',
+ id=103,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger3'),
+ 104:
+ dict(
+ name='left_middle_finger4',
+ id=104,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger4'),
+ 105:
+ dict(
+ name='left_ring_finger1',
+ id=105,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger1'),
+ 106:
+ dict(
+ name='left_ring_finger2',
+ id=106,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger2'),
+ 107:
+ dict(
+ name='left_ring_finger3',
+ id=107,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger3'),
+ 108:
+ dict(
+ name='left_ring_finger4',
+ id=108,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger4'),
+ 109:
+ dict(
+ name='left_pinky_finger1',
+ id=109,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger1'),
+ 110:
+ dict(
+ name='left_pinky_finger2',
+ id=110,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger2'),
+ 111:
+ dict(
+ name='left_pinky_finger3',
+ id=111,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger3'),
+
+ 112:
+ dict(
+ name='left_pinky_finger4',
+ id=112,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger4'),
+ 113:
+ dict(
+ name='right_hand_root',
+ id=113,
+ color=[255, 255, 255],
+ type='',
+ swap='left_hand_root'),
+ 114:
+ dict(
+ name='right_thumb1',
+ id=114,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb1'),
+ 115:
+ dict(
+ name='right_thumb2',
+ id=115,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb2'),
+ 116:
+ dict(
+ name='right_thumb3',
+ id=116,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb3'),
+ 117:
+ dict(
+ name='right_thumb4',
+ id=117,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb4'),
+ 118:
+ dict(
+ name='right_forefinger1',
+ id=118,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger1'),
+ 119:
+ dict(
+ name='right_forefinger2',
+ id=119,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger2'),
+ 120:
+ dict(
+ name='right_forefinger3',
+ id=120,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger3'),
+ 121:
+ dict(
+ name='right_forefinger4',
+ id=121,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger4'),
+ 122:
+ dict(
+ name='right_middle_finger1',
+ id=122,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger1'),
+ 123:
+ dict(
+ name='right_middle_finger2',
+ id=123,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger2'),
+ 124:
+ dict(
+ name='right_middle_finger3',
+ id=124,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger3'),
+ 125:
+ dict(
+ name='right_middle_finger4',
+ id=125,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger4'),
+ 126:
+ dict(
+ name='right_ring_finger1',
+ id=126,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger1'),
+ 127:
+ dict(
+ name='right_ring_finger2',
+ id=127,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger2'),
+ 128:
+ dict(
+ name='right_ring_finger3',
+ id=128,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger3'),
+ 129:
+ dict(
+ name='right_ring_finger4',
+ id=129,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger4'),
+ 130:
+ dict(
+ name='right_pinky_finger1',
+ id=130,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger1'),
+ 131:
+ dict(
+ name='right_pinky_finger2',
+ id=131,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger2'),
+ 132:
+ dict(
+ name='right_pinky_finger3',
+ id=132,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger3'),
+ 133:
+ dict(
+ name='right_pinky_finger4',
+ id=133,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger4'),
+ },
+ skeleton_info={
+ 0: dict(link=('neck', 'right_shoulder'), id=0, color=[255, 0, 0]),
+ 1: dict(link=('neck', 'left_shoulder'), id=1, color=[255, 85, 0]),
+ 2: dict(
+ link=('right_shoulder', 'right_elbow'), id=2, color=[255, 170, 0]),
+ 3:
+ dict(link=('right_elbow', 'right_wrist'), id=3, color=[255, 255, 0]),
+ 4:
+ dict(link=('left_shoulder', 'left_elbow'), id=4, color=[170, 255, 0]),
+ 5: dict(link=('left_elbow', 'left_wrist'), id=5, color=[85, 255, 0]),
+ 6: dict(link=('neck', 'right_hip'), id=6, color=[0, 255, 0]),
+ 7: dict(link=('right_hip', 'right_knee'), id=7, color=[0, 255, 85]),
+ 8: dict(link=('right_knee', 'right_ankle'), id=8, color=[0, 255, 170]),
+ 9: dict(link=('neck', 'left_hip'), id=9, color=[0, 255, 225]),
+ 10: dict(link=('left_hip', 'left_knee'), id=10, color=[0, 170, 255]),
+ 11: dict(link=('left_knee', 'left_ankle'), id=11, color=[0, 85, 255]),
+ 12: dict(link=('neck', 'nose'), id=12, color=[0, 0, 255]),
+ 13: dict(link=('nose', 'right_eye'), id=13, color=[255, 0, 170]),
+ 14: dict(link=('right_eye', 'right_ear'), id=14, color=[170, 0, 255]),
+ 15: dict(link=('nose', 'left_eye'), id=15, color=[255, 0, 255]),
+ 16: dict(link=('left_eye', 'left_ear'), id=16, color=[255, 0, 170]),
+ 17:
+ dict(link=('left_ankle', 'left_big_toe'), id=17, color=[0, 255, 0]),
+ 18:
+ dict(link=('left_ankle', 'left_small_toe'), id=18, color=[0, 255, 0]),
+ 19:
+ dict(link=('left_ankle', 'left_heel'), id=19, color=[0, 255, 0]),
+ 20:
+ dict(link=('right_ankle', 'right_big_toe'), id=20, color=[255, 128, 0]),
+ 21:
+ dict(link=('right_ankle', 'right_small_toe'), id=21, color=[255, 128, 0]),
+ 22:
+ dict(link=('right_ankle', 'right_heel'), id=22, color=[255, 128, 0]),
+ 23:
+ dict(link=('left_hand_root', 'left_thumb1'), id=23, color=[255, 128, 0]),
+ 24:
+ dict(link=('left_thumb1', 'left_thumb2'), id=24, color=[255, 128, 0]),
+ 25:
+ dict(link=('left_thumb2', 'left_thumb3'), id=25, color=[255, 128, 0]),
+ 26:
+ dict(link=('left_thumb3', 'left_thumb4'), id=26, color=[255, 128, 0]),
+ 27:
+ dict(link=('left_hand_root', 'left_forefinger1'), id=27, color=[255, 153, 255]),
+ 28:
+ dict(link=('left_forefinger1', 'left_forefinger2'), id=28, color=[255, 153, 255]),
+ 29:
+ dict(link=('left_forefinger2', 'left_forefinger3'), id=29, color=[255, 153, 255]),
+ 30:
+ dict(link=('left_forefinger3', 'left_forefinger4'), id=30, color=[255, 153, 255]),
+ 31:
+ dict(link=('left_hand_root', 'left_middle_finger1'), id=31, color=[102, 178, 255]),
+ 32:
+ dict(link=('left_middle_finger1', 'left_middle_finger2'), id=32, color=[102, 178, 255]),
+ 33:
+ dict(link=('left_middle_finger2', 'left_middle_finger3'), id=33, color=[102, 178, 255]),
+ 34:
+ dict(link=('left_middle_finger3', 'left_middle_finger4'), id=34, color=[102, 178, 255]),
+ 35:
+ dict(link=('left_hand_root', 'left_ring_finger1'), id=35, color=[255, 51, 51]),
+ 36:
+ dict(link=('left_ring_finger1', 'left_ring_finger2'), id=36, color=[255, 51, 51]),
+ 37:
+ dict(link=('left_ring_finger2', 'left_ring_finger3'), id=37, color=[255, 51, 51]),
+ 38:
+ dict(link=('left_ring_finger3', 'left_ring_finger4'), id=38, color=[255, 51, 51]),
+ 39:
+ dict(link=('left_hand_root', 'left_pinky_finger1'), id=39, color=[0, 255, 0]),
+ 40:
+ dict(link=('left_pinky_finger1', 'left_pinky_finger2'), id=40, color=[0, 255, 0]),
+ 41:
+ dict(link=('left_pinky_finger2', 'left_pinky_finger3'), id=41, color=[0, 255, 0]),
+ 42:
+ dict(link=('left_pinky_finger3', 'left_pinky_finger4'), id=42, color=[0, 255, 0]),
+ 43:
+ dict(link=('right_hand_root', 'right_thumb1'), id=43, color=[255, 128, 0]),
+ 44:
+ dict(link=('right_thumb1', 'right_thumb2'), id=44, color=[255, 128, 0]),
+ 45:
+ dict(link=('right_thumb2', 'right_thumb3'), id=45, color=[255, 128, 0]),
+ 46:
+ dict(link=('right_thumb3', 'right_thumb4'), id=46, color=[255, 128, 0]),
+ 47:
+ dict(link=('right_hand_root', 'right_forefinger1'), id=47, color=[255, 153, 255]),
+ 48:
+ dict(link=('right_forefinger1', 'right_forefinger2'), id=48, color=[255, 153, 255]),
+ 49:
+ dict(link=('right_forefinger2', 'right_forefinger3'), id=49, color=[255, 153, 255]),
+ 50:
+ dict(link=('right_forefinger3', 'right_forefinger4'), id=50, color=[255, 153, 255]),
+ 51:
+ dict(link=('right_hand_root', 'right_middle_finger1'), id=51, color=[102, 178, 255]),
+ 52:
+ dict(link=('right_middle_finger1', 'right_middle_finger2'), id=52, color=[102, 178, 255]),
+ 53:
+ dict(link=('right_middle_finger2', 'right_middle_finger3'), id=53, color=[102, 178, 255]),
+ 54:
+ dict(link=('right_middle_finger3', 'right_middle_finger4'), id=54, color=[102, 178, 255]),
+ 55:
+ dict(link=('right_hand_root', 'right_ring_finger1'), id=55, color=[255, 51, 51]),
+ 56:
+ dict(link=('right_ring_finger1', 'right_ring_finger2'), id=56, color=[255, 51, 51]),
+ 57:
+ dict(link=('right_ring_finger2', 'right_ring_finger3'), id=57, color=[255, 51, 51]),
+ 58:
+ dict(link=('right_ring_finger3', 'right_ring_finger4'), id=58, color=[255, 51, 51]),
+ 59:
+ dict(link=('right_hand_root', 'right_pinky_finger1'), id=59, color=[0, 255, 0]),
+ 60:
+ dict(link=('right_pinky_finger1', 'right_pinky_finger2'), id=60, color=[0, 255, 0]),
+ 61:
+ dict(link=('right_pinky_finger2', 'right_pinky_finger3'), id=61, color=[0, 255, 0]),
+ 62:
+ dict(link=('right_pinky_finger3', 'right_pinky_finger4'), id=62, color=[0, 255, 0])
+
+ },
+ joint_weights=[1.] * 134,
+ # 'https://github.com/jin-s13/COCO-WholeBody/blob/master/'
+ # 'evaluation/myeval_wholebody.py#L175'
+ sigmas=[
+ 0.025,
+ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+ 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089, 0.068, 0.066, 0.066,
+ 0.092, 0.094, 0.094, 0.042, 0.043, 0.044, 0.043, 0.040, 0.035, 0.031,
+ 0.025, 0.020, 0.023, 0.029, 0.032, 0.037, 0.038, 0.043, 0.041, 0.045,
+ 0.013, 0.012, 0.011, 0.011, 0.012, 0.012, 0.011, 0.011, 0.013, 0.015,
+ 0.009, 0.007, 0.007, 0.007, 0.012, 0.009, 0.008, 0.016, 0.010, 0.017,
+ 0.011, 0.009, 0.011, 0.009, 0.007, 0.013, 0.008, 0.011, 0.012, 0.010,
+ 0.034, 0.008, 0.008, 0.009, 0.008, 0.008, 0.007, 0.010, 0.008, 0.009,
+ 0.009, 0.009, 0.007, 0.007, 0.008, 0.011, 0.008, 0.008, 0.008, 0.01,
+ 0.008, 0.029, 0.022, 0.035, 0.037, 0.047, 0.026, 0.025, 0.024, 0.035,
+ 0.018, 0.024, 0.022, 0.026, 0.017, 0.021, 0.021, 0.032, 0.02, 0.019,
+ 0.022, 0.031, 0.029, 0.022, 0.035, 0.037, 0.047, 0.026, 0.025, 0.024,
+ 0.035, 0.018, 0.024, 0.022, 0.026, 0.017, 0.021, 0.021, 0.032, 0.02,
+ 0.019, 0.022, 0.031
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/cofw.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/cofw.py
new file mode 100644
index 0000000000000000000000000000000000000000..17eb5470d81bc1c3a9a031fda2cbb75aec12d3ce
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/cofw.py
@@ -0,0 +1,63 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='cofw',
+ paper_info=dict(
+ author='Burgos-Artizzu, Xavier P and Perona, '
+ r'Pietro and Doll{\'a}r, Piotr',
+ title='Robust face landmark estimation under occlusion',
+ container='Proceedings of the IEEE international '
+ 'conference on computer vision',
+ year='2013',
+ homepage='http://www.vision.caltech.edu/xpburgos/ICCV13/',
+ ),
+ keypoint_info={
+ 0: dict(name='kpt-0', id=0, color=[255, 0, 0], type='', swap='kpt-1'),
+ 1: dict(name='kpt-1', id=1, color=[255, 0, 0], type='', swap='kpt-0'),
+ 2: dict(name='kpt-2', id=2, color=[255, 0, 0], type='', swap='kpt-3'),
+ 3: dict(name='kpt-3', id=3, color=[255, 0, 0], type='', swap='kpt-2'),
+ 4: dict(name='kpt-4', id=4, color=[255, 0, 0], type='', swap='kpt-6'),
+ 5: dict(name='kpt-5', id=5, color=[255, 0, 0], type='', swap='kpt-7'),
+ 6: dict(name='kpt-6', id=6, color=[255, 0, 0], type='', swap='kpt-4'),
+ 7: dict(name='kpt-7', id=7, color=[255, 0, 0], type='', swap='kpt-5'),
+ 8: dict(name='kpt-8', id=8, color=[255, 0, 0], type='', swap='kpt-9'),
+ 9: dict(name='kpt-9', id=9, color=[255, 0, 0], type='', swap='kpt-8'),
+ 10:
+ dict(name='kpt-10', id=10, color=[255, 0, 0], type='', swap='kpt-11'),
+ 11:
+ dict(name='kpt-11', id=11, color=[255, 0, 0], type='', swap='kpt-10'),
+ 12:
+ dict(name='kpt-12', id=12, color=[255, 0, 0], type='', swap='kpt-14'),
+ 13:
+ dict(name='kpt-13', id=13, color=[255, 0, 0], type='', swap='kpt-15'),
+ 14:
+ dict(name='kpt-14', id=14, color=[255, 0, 0], type='', swap='kpt-12'),
+ 15:
+ dict(name='kpt-15', id=15, color=[255, 0, 0], type='', swap='kpt-13'),
+ 16:
+ dict(name='kpt-16', id=16, color=[255, 0, 0], type='', swap='kpt-17'),
+ 17:
+ dict(name='kpt-17', id=17, color=[255, 0, 0], type='', swap='kpt-16'),
+ 18:
+ dict(name='kpt-18', id=18, color=[255, 0, 0], type='', swap='kpt-19'),
+ 19:
+ dict(name='kpt-19', id=19, color=[255, 0, 0], type='', swap='kpt-18'),
+ 20: dict(name='kpt-20', id=20, color=[255, 0, 0], type='', swap=''),
+ 21: dict(name='kpt-21', id=21, color=[255, 0, 0], type='', swap=''),
+ 22:
+ dict(name='kpt-22', id=22, color=[255, 0, 0], type='', swap='kpt-23'),
+ 23:
+ dict(name='kpt-23', id=23, color=[255, 0, 0], type='', swap='kpt-22'),
+ 24: dict(name='kpt-24', id=24, color=[255, 0, 0], type='', swap=''),
+ 25: dict(name='kpt-25', id=25, color=[255, 0, 0], type='', swap=''),
+ 26: dict(name='kpt-26', id=26, color=[255, 0, 0], type='', swap=''),
+ 27: dict(name='kpt-27', id=27, color=[255, 0, 0], type='', swap=''),
+ 28: dict(name='kpt-28', id=28, color=[255, 0, 0], type='', swap='')
+ },
+ skeleton_info={},
+ joint_weights=[1.] * 29,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/crowdpose.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/crowdpose.py
new file mode 100644
index 0000000000000000000000000000000000000000..0b83709a0d7814d3968b7f631a0d6d398e62ea7d
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/crowdpose.py
@@ -0,0 +1,153 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='crowdpose',
+ paper_info=dict(
+ author='Li, Jiefeng and Wang, Can and Zhu, Hao and '
+ 'Mao, Yihuan and Fang, Hao-Shu and Lu, Cewu',
+ title='CrowdPose: Efficient Crowded Scenes Pose Estimation '
+ 'and A New Benchmark',
+ container='Proceedings of IEEE Conference on Computer '
+ 'Vision and Pattern Recognition (CVPR)',
+ year='2019',
+ homepage='https://github.com/Jeff-sjtu/CrowdPose',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='left_shoulder',
+ id=0,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_shoulder'),
+ 1:
+ dict(
+ name='right_shoulder',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_shoulder'),
+ 2:
+ dict(
+ name='left_elbow',
+ id=2,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_elbow'),
+ 3:
+ dict(
+ name='right_elbow',
+ id=3,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_elbow'),
+ 4:
+ dict(
+ name='left_wrist',
+ id=4,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_wrist'),
+ 5:
+ dict(
+ name='right_wrist',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='left_wrist'),
+ 6:
+ dict(
+ name='left_hip',
+ id=6,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_hip'),
+ 7:
+ dict(
+ name='right_hip',
+ id=7,
+ color=[0, 255, 0],
+ type='lower',
+ swap='left_hip'),
+ 8:
+ dict(
+ name='left_knee',
+ id=8,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_knee'),
+ 9:
+ dict(
+ name='right_knee',
+ id=9,
+ color=[0, 255, 0],
+ type='lower',
+ swap='left_knee'),
+ 10:
+ dict(
+ name='left_ankle',
+ id=10,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_ankle'),
+ 11:
+ dict(
+ name='right_ankle',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='left_ankle'),
+ 12:
+ dict(
+ name='top_head', id=12, color=[255, 128, 0], type='upper',
+ swap=''),
+ 13:
+ dict(name='neck', id=13, color=[0, 255, 0], type='upper', swap='')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+ 6:
+ dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(
+ link=('left_shoulder', 'right_shoulder'),
+ id=7,
+ color=[51, 153, 255]),
+ 8:
+ dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('top_head', 'neck'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('right_shoulder', 'neck'), id=13, color=[51, 153, 255]),
+ 14:
+ dict(link=('left_shoulder', 'neck'), id=14, color=[51, 153, 255])
+ },
+ joint_weights=[
+ 0.2, 0.2, 0.2, 1.3, 1.5, 0.2, 1.3, 1.5, 0.2, 0.2, 0.5, 0.2, 0.2, 0.5
+ ],
+ sigmas=[
+ 0.079, 0.079, 0.072, 0.072, 0.062, 0.062, 0.107, 0.107, 0.087, 0.087,
+ 0.089, 0.089, 0.079, 0.079
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/crowdpose2coco.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/crowdpose2coco.py
new file mode 100644
index 0000000000000000000000000000000000000000..fa3b863f5e6332cfa61785cb1775dba5ac869397
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/crowdpose2coco.py
@@ -0,0 +1,187 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='crowdpose2coco',
+ paper_info=dict(
+ author='Lin, Tsung-Yi and Maire, Michael and '
+ 'Belongie, Serge and Hays, James and '
+ 'Perona, Pietro and Ramanan, Deva and '
+ r'Doll{\'a}r, Piotr and Zitnick, C Lawrence',
+ title='Microsoft coco: Common objects in context',
+ container='European conference on computer vision',
+ year='2014',
+ homepage='http://cocodataset.org/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1:
+ dict(
+ name='left_eye',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_eye'),
+ 2:
+ dict(
+ name='right_eye',
+ id=2,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_eye'),
+ 3:
+ dict(
+ name='left_ear',
+ id=3,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 4:
+ dict(
+ name='right_ear',
+ id=4,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='right_shoulder',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 7:
+ dict(
+ name='left_elbow',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 8:
+ dict(
+ name='right_elbow',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 9:
+ dict(
+ name='left_wrist',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='right_hip',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 13:
+ dict(
+ name='left_knee',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 14:
+ dict(
+ name='right_knee',
+ id=14,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 15:
+ dict(
+ name='left_ankle',
+ id=15,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 16:
+ dict(
+ name='right_ankle',
+ id=16,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+ 6:
+ dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(
+ link=('left_shoulder', 'right_shoulder'),
+ id=7,
+ color=[51, 153, 255]),
+ 8:
+ dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('left_eye', 'right_eye'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('nose', 'left_eye'), id=13, color=[51, 153, 255]),
+ 14:
+ dict(link=('nose', 'right_eye'), id=14, color=[51, 153, 255]),
+ 15:
+ dict(link=('left_eye', 'left_ear'), id=15, color=[51, 153, 255]),
+ 16:
+ dict(link=('right_eye', 'right_ear'), id=16, color=[51, 153, 255]),
+ 17:
+ dict(link=('left_ear', 'left_shoulder'), id=17, color=[51, 153, 255]),
+ 18:
+ dict(
+ link=('right_ear', 'right_shoulder'), id=18, color=[51, 153, 255])
+ },
+ joint_weights=[
+ 1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.5, 1.5, 1., 1., 1.2, 1.2, 1.5,
+ 1.5
+ ],
+ sigmas=[
+ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+ 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/crowdpose2goliath.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/crowdpose2goliath.py
new file mode 100644
index 0000000000000000000000000000000000000000..b2f94135e5d7cbb32e19bf6cd64a6a0c698088ee
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/crowdpose2goliath.py
@@ -0,0 +1,11 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from configs._base_.datasets.goliath import dataset_info as goliath_info
+
+goliath_info = goliath_info.build()
+dataset_info = goliath_info.copy()
+dataset_info['dataset_name'] = 'crowdpose2goliath'
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/crowdpose2goliath3d.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/crowdpose2goliath3d.py
new file mode 100644
index 0000000000000000000000000000000000000000..ab23236030e54e57c57a327381465f40f5ce4786
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/crowdpose2goliath3d.py
@@ -0,0 +1,11 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from configs._base_.datasets.goliath3d import dataset_info as goliath_info
+
+goliath_info = goliath_info.build()
+dataset_info = goliath_info.copy()
+dataset_info['dataset_name'] = 'crowdpose2goliath3d'
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/deepfashion2.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/deepfashion2.py
new file mode 100644
index 0000000000000000000000000000000000000000..8ce60fc38ed6957a742930a8568fc4aed0440cf9
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/deepfashion2.py
@@ -0,0 +1,2666 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+colors = dict(
+ sss=[255, 128, 0], # short_sleeve_shirt
+ lss=[255, 0, 128], # long_sleeved_shirt
+ sso=[128, 0, 255], # short_sleeved_outwear
+ lso=[0, 128, 255], # long_sleeved_outwear
+ vest=[0, 128, 128], # vest
+ sling=[0, 0, 128], # sling
+ shorts=[128, 128, 128], # shorts
+ trousers=[128, 0, 128], # trousers
+ skirt=[64, 128, 128], # skirt
+ ssd=[64, 64, 128], # short_sleeved_dress
+ lsd=[128, 64, 0], # long_sleeved_dress
+ vd=[128, 64, 255], # vest_dress
+ sd=[128, 64, 0], # sling_dress
+)
+dataset_info = dict(
+ dataset_name='deepfashion2',
+ paper_info=dict(
+ author='Yuying Ge and Ruimao Zhang and Lingyun Wu '
+ 'and Xiaogang Wang and Xiaoou Tang and Ping Luo',
+ title='DeepFashion2: A Versatile Benchmark for '
+ 'Detection, Pose Estimation, Segmentation and '
+ 'Re-Identification of Clothing Images',
+ container='Proceedings of IEEE Conference on Computer '
+ 'Vision and Pattern Recognition (CVPR)',
+ year='2019',
+ homepage='https://github.com/switchablenorms/DeepFashion2',
+ ),
+ keypoint_info={
+ # short_sleeved_shirt
+ 0:
+ dict(name='sss_kpt1', id=0, color=colors['sss'], type='', swap=''),
+ 1:
+ dict(
+ name='sss_kpt2',
+ id=1,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt6'),
+ 2:
+ dict(
+ name='sss_kpt3',
+ id=2,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt5'),
+ 3:
+ dict(name='sss_kpt4', id=3, color=colors['sss'], type='', swap=''),
+ 4:
+ dict(
+ name='sss_kpt5',
+ id=4,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt3'),
+ 5:
+ dict(
+ name='sss_kpt6',
+ id=5,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt2'),
+ 6:
+ dict(
+ name='sss_kpt7',
+ id=6,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt25'),
+ 7:
+ dict(
+ name='sss_kpt8',
+ id=7,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt24'),
+ 8:
+ dict(
+ name='sss_kpt9',
+ id=8,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt23'),
+ 9:
+ dict(
+ name='sss_kpt10',
+ id=9,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt22'),
+ 10:
+ dict(
+ name='sss_kpt11',
+ id=10,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt21'),
+ 11:
+ dict(
+ name='sss_kpt12',
+ id=11,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt20'),
+ 12:
+ dict(
+ name='sss_kpt13',
+ id=12,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt19'),
+ 13:
+ dict(
+ name='sss_kpt14',
+ id=13,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt18'),
+ 14:
+ dict(
+ name='sss_kpt15',
+ id=14,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt17'),
+ 15:
+ dict(name='sss_kpt16', id=15, color=colors['sss'], type='', swap=''),
+ 16:
+ dict(
+ name='sss_kpt17',
+ id=16,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt15'),
+ 17:
+ dict(
+ name='sss_kpt18',
+ id=17,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt14'),
+ 18:
+ dict(
+ name='sss_kpt19',
+ id=18,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt13'),
+ 19:
+ dict(
+ name='sss_kpt20',
+ id=19,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt12'),
+ 20:
+ dict(
+ name='sss_kpt21',
+ id=20,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt11'),
+ 21:
+ dict(
+ name='sss_kpt22',
+ id=21,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt10'),
+ 22:
+ dict(
+ name='sss_kpt23',
+ id=22,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt9'),
+ 23:
+ dict(
+ name='sss_kpt24',
+ id=23,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt8'),
+ 24:
+ dict(
+ name='sss_kpt25',
+ id=24,
+ color=colors['sss'],
+ type='',
+ swap='sss_kpt7'),
+ # long_sleeved_shirt
+ 25:
+ dict(name='lss_kpt1', id=25, color=colors['lss'], type='', swap=''),
+ 26:
+ dict(
+ name='lss_kpt2',
+ id=26,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt6'),
+ 27:
+ dict(
+ name='lss_kpt3',
+ id=27,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt5'),
+ 28:
+ dict(name='lss_kpt4', id=28, color=colors['lss'], type='', swap=''),
+ 29:
+ dict(
+ name='lss_kpt5',
+ id=29,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt3'),
+ 30:
+ dict(
+ name='lss_kpt6',
+ id=30,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt2'),
+ 31:
+ dict(
+ name='lss_kpt7',
+ id=31,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt33'),
+ 32:
+ dict(
+ name='lss_kpt8',
+ id=32,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt32'),
+ 33:
+ dict(
+ name='lss_kpt9',
+ id=33,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt31'),
+ 34:
+ dict(
+ name='lss_kpt10',
+ id=34,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt30'),
+ 35:
+ dict(
+ name='lss_kpt11',
+ id=35,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt29'),
+ 36:
+ dict(
+ name='lss_kpt12',
+ id=36,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt28'),
+ 37:
+ dict(
+ name='lss_kpt13',
+ id=37,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt27'),
+ 38:
+ dict(
+ name='lss_kpt14',
+ id=38,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt26'),
+ 39:
+ dict(
+ name='lss_kpt15',
+ id=39,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt25'),
+ 40:
+ dict(
+ name='lss_kpt16',
+ id=40,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt24'),
+ 41:
+ dict(
+ name='lss_kpt17',
+ id=41,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt23'),
+ 42:
+ dict(
+ name='lss_kpt18',
+ id=42,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt22'),
+ 43:
+ dict(
+ name='lss_kpt19',
+ id=43,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt21'),
+ 44:
+ dict(name='lss_kpt20', id=44, color=colors['lss'], type='', swap=''),
+ 45:
+ dict(
+ name='lss_kpt21',
+ id=45,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt19'),
+ 46:
+ dict(
+ name='lss_kpt22',
+ id=46,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt18'),
+ 47:
+ dict(
+ name='lss_kpt23',
+ id=47,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt17'),
+ 48:
+ dict(
+ name='lss_kpt24',
+ id=48,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt16'),
+ 49:
+ dict(
+ name='lss_kpt25',
+ id=49,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt15'),
+ 50:
+ dict(
+ name='lss_kpt26',
+ id=50,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt14'),
+ 51:
+ dict(
+ name='lss_kpt27',
+ id=51,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt13'),
+ 52:
+ dict(
+ name='lss_kpt28',
+ id=52,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt12'),
+ 53:
+ dict(
+ name='lss_kpt29',
+ id=53,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt11'),
+ 54:
+ dict(
+ name='lss_kpt30',
+ id=54,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt10'),
+ 55:
+ dict(
+ name='lss_kpt31',
+ id=55,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt9'),
+ 56:
+ dict(
+ name='lss_kpt32',
+ id=56,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt8'),
+ 57:
+ dict(
+ name='lss_kpt33',
+ id=57,
+ color=colors['lss'],
+ type='',
+ swap='lss_kpt7'),
+ # short_sleeved_outwear
+ 58:
+ dict(name='sso_kpt1', id=58, color=colors['sso'], type='', swap=''),
+ 59:
+ dict(
+ name='sso_kpt2',
+ id=59,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt26'),
+ 60:
+ dict(
+ name='sso_kpt3',
+ id=60,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt5'),
+ 61:
+ dict(
+ name='sso_kpt4',
+ id=61,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt6'),
+ 62:
+ dict(
+ name='sso_kpt5',
+ id=62,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt3'),
+ 63:
+ dict(
+ name='sso_kpt6',
+ id=63,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt4'),
+ 64:
+ dict(
+ name='sso_kpt7',
+ id=64,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt25'),
+ 65:
+ dict(
+ name='sso_kpt8',
+ id=65,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt24'),
+ 66:
+ dict(
+ name='sso_kpt9',
+ id=66,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt23'),
+ 67:
+ dict(
+ name='sso_kpt10',
+ id=67,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt22'),
+ 68:
+ dict(
+ name='sso_kpt11',
+ id=68,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt21'),
+ 69:
+ dict(
+ name='sso_kpt12',
+ id=69,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt20'),
+ 70:
+ dict(
+ name='sso_kpt13',
+ id=70,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt19'),
+ 71:
+ dict(
+ name='sso_kpt14',
+ id=71,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt18'),
+ 72:
+ dict(
+ name='sso_kpt15',
+ id=72,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt17'),
+ 73:
+ dict(
+ name='sso_kpt16',
+ id=73,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt29'),
+ 74:
+ dict(
+ name='sso_kpt17',
+ id=74,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt15'),
+ 75:
+ dict(
+ name='sso_kpt18',
+ id=75,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt14'),
+ 76:
+ dict(
+ name='sso_kpt19',
+ id=76,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt13'),
+ 77:
+ dict(
+ name='sso_kpt20',
+ id=77,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt12'),
+ 78:
+ dict(
+ name='sso_kpt21',
+ id=78,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt11'),
+ 79:
+ dict(
+ name='sso_kpt22',
+ id=79,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt10'),
+ 80:
+ dict(
+ name='sso_kpt23',
+ id=80,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt9'),
+ 81:
+ dict(
+ name='sso_kpt24',
+ id=81,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt8'),
+ 82:
+ dict(
+ name='sso_kpt25',
+ id=82,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt7'),
+ 83:
+ dict(
+ name='sso_kpt26',
+ id=83,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt2'),
+ 84:
+ dict(
+ name='sso_kpt27',
+ id=84,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt30'),
+ 85:
+ dict(
+ name='sso_kpt28',
+ id=85,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt31'),
+ 86:
+ dict(
+ name='sso_kpt29',
+ id=86,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt16'),
+ 87:
+ dict(
+ name='sso_kpt30',
+ id=87,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt27'),
+ 88:
+ dict(
+ name='sso_kpt31',
+ id=88,
+ color=colors['sso'],
+ type='',
+ swap='sso_kpt28'),
+ # long_sleeved_outwear
+ 89:
+ dict(name='lso_kpt1', id=89, color=colors['lso'], type='', swap=''),
+ 90:
+ dict(
+ name='lso_kpt2',
+ id=90,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt6'),
+ 91:
+ dict(
+ name='lso_kpt3',
+ id=91,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt5'),
+ 92:
+ dict(
+ name='lso_kpt4',
+ id=92,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt34'),
+ 93:
+ dict(
+ name='lso_kpt5',
+ id=93,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt3'),
+ 94:
+ dict(
+ name='lso_kpt6',
+ id=94,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt2'),
+ 95:
+ dict(
+ name='lso_kpt7',
+ id=95,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt33'),
+ 96:
+ dict(
+ name='lso_kpt8',
+ id=96,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt32'),
+ 97:
+ dict(
+ name='lso_kpt9',
+ id=97,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt31'),
+ 98:
+ dict(
+ name='lso_kpt10',
+ id=98,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt30'),
+ 99:
+ dict(
+ name='lso_kpt11',
+ id=99,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt29'),
+ 100:
+ dict(
+ name='lso_kpt12',
+ id=100,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt28'),
+ 101:
+ dict(
+ name='lso_kpt13',
+ id=101,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt27'),
+ 102:
+ dict(
+ name='lso_kpt14',
+ id=102,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt26'),
+ 103:
+ dict(
+ name='lso_kpt15',
+ id=103,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt25'),
+ 104:
+ dict(
+ name='lso_kpt16',
+ id=104,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt24'),
+ 105:
+ dict(
+ name='lso_kpt17',
+ id=105,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt23'),
+ 106:
+ dict(
+ name='lso_kpt18',
+ id=106,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt22'),
+ 107:
+ dict(
+ name='lso_kpt19',
+ id=107,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt21'),
+ 108:
+ dict(
+ name='lso_kpt20',
+ id=108,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt37'),
+ 109:
+ dict(
+ name='lso_kpt21',
+ id=109,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt19'),
+ 110:
+ dict(
+ name='lso_kpt22',
+ id=110,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt18'),
+ 111:
+ dict(
+ name='lso_kpt23',
+ id=111,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt17'),
+ 112:
+ dict(
+ name='lso_kpt24',
+ id=112,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt16'),
+ 113:
+ dict(
+ name='lso_kpt25',
+ id=113,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt15'),
+ 114:
+ dict(
+ name='lso_kpt26',
+ id=114,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt14'),
+ 115:
+ dict(
+ name='lso_kpt27',
+ id=115,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt13'),
+ 116:
+ dict(
+ name='lso_kpt28',
+ id=116,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt12'),
+ 117:
+ dict(
+ name='lso_kpt29',
+ id=117,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt11'),
+ 118:
+ dict(
+ name='lso_kpt30',
+ id=118,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt10'),
+ 119:
+ dict(
+ name='lso_kpt31',
+ id=119,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt9'),
+ 120:
+ dict(
+ name='lso_kpt32',
+ id=120,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt8'),
+ 121:
+ dict(
+ name='lso_kpt33',
+ id=121,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt7'),
+ 122:
+ dict(
+ name='lso_kpt34',
+ id=122,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt4'),
+ 123:
+ dict(
+ name='lso_kpt35',
+ id=123,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt38'),
+ 124:
+ dict(
+ name='lso_kpt36',
+ id=124,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt39'),
+ 125:
+ dict(
+ name='lso_kpt37',
+ id=125,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt20'),
+ 126:
+ dict(
+ name='lso_kpt38',
+ id=126,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt35'),
+ 127:
+ dict(
+ name='lso_kpt39',
+ id=127,
+ color=colors['lso'],
+ type='',
+ swap='lso_kpt36'),
+ # vest
+ 128:
+ dict(name='vest_kpt1', id=128, color=colors['vest'], type='', swap=''),
+ 129:
+ dict(
+ name='vest_kpt2',
+ id=129,
+ color=colors['vest'],
+ type='',
+ swap='vest_kpt6'),
+ 130:
+ dict(
+ name='vest_kpt3',
+ id=130,
+ color=colors['vest'],
+ type='',
+ swap='vest_kpt5'),
+ 131:
+ dict(name='vest_kpt4', id=131, color=colors['vest'], type='', swap=''),
+ 132:
+ dict(
+ name='vest_kpt5',
+ id=132,
+ color=colors['vest'],
+ type='',
+ swap='vest_kpt3'),
+ 133:
+ dict(
+ name='vest_kpt6',
+ id=133,
+ color=colors['vest'],
+ type='',
+ swap='vest_kpt2'),
+ 134:
+ dict(
+ name='vest_kpt7',
+ id=134,
+ color=colors['vest'],
+ type='',
+ swap='vest_kpt15'),
+ 135:
+ dict(
+ name='vest_kpt8',
+ id=135,
+ color=colors['vest'],
+ type='',
+ swap='vest_kpt14'),
+ 136:
+ dict(
+ name='vest_kpt9',
+ id=136,
+ color=colors['vest'],
+ type='',
+ swap='vest_kpt13'),
+ 137:
+ dict(
+ name='vest_kpt10',
+ id=137,
+ color=colors['vest'],
+ type='',
+ swap='vest_kpt12'),
+ 138:
+ dict(
+ name='vest_kpt11', id=138, color=colors['vest'], type='', swap=''),
+ 139:
+ dict(
+ name='vest_kpt12',
+ id=139,
+ color=colors['vest'],
+ type='',
+ swap='vest_kpt10'),
+ 140:
+ dict(
+ name='vest_kpt13', id=140, color=colors['vest'], type='', swap=''),
+ 141:
+ dict(
+ name='vest_kpt14',
+ id=141,
+ color=colors['vest'],
+ type='',
+ swap='vest_kpt8'),
+ 142:
+ dict(
+ name='vest_kpt15',
+ id=142,
+ color=colors['vest'],
+ type='',
+ swap='vest_kpt7'),
+ # sling
+ 143:
+ dict(
+ name='sling_kpt1', id=143, color=colors['sling'], type='',
+ swap=''),
+ 144:
+ dict(
+ name='sling_kpt2',
+ id=144,
+ color=colors['sling'],
+ type='',
+ swap='sling_kpt6'),
+ 145:
+ dict(
+ name='sling_kpt3',
+ id=145,
+ color=colors['sling'],
+ type='',
+ swap='sling_kpt5'),
+ 146:
+ dict(
+ name='sling_kpt4', id=146, color=colors['sling'], type='',
+ swap=''),
+ 147:
+ dict(
+ name='sling_kpt5',
+ id=147,
+ color=colors['sling'],
+ type='',
+ swap='sling_kpt3'),
+ 148:
+ dict(
+ name='sling_kpt6',
+ id=148,
+ color=colors['sling'],
+ type='',
+ swap='sling_kpt2'),
+ 149:
+ dict(
+ name='sling_kpt7',
+ id=149,
+ color=colors['sling'],
+ type='',
+ swap='sling_kpt15'),
+ 150:
+ dict(
+ name='sling_kpt8',
+ id=150,
+ color=colors['sling'],
+ type='',
+ swap='sling_kpt14'),
+ 151:
+ dict(
+ name='sling_kpt9',
+ id=151,
+ color=colors['sling'],
+ type='',
+ swap='sling_kpt13'),
+ 152:
+ dict(
+ name='sling_kpt10',
+ id=152,
+ color=colors['sling'],
+ type='',
+ swap='sling_kpt12'),
+ 153:
+ dict(
+ name='sling_kpt11',
+ id=153,
+ color=colors['sling'],
+ type='',
+ swap=''),
+ 154:
+ dict(
+ name='sling_kpt12',
+ id=154,
+ color=colors['sling'],
+ type='',
+ swap='sling_kpt10'),
+ 155:
+ dict(
+ name='sling_kpt13',
+ id=155,
+ color=colors['sling'],
+ type='',
+ swap='sling_kpt9'),
+ 156:
+ dict(
+ name='sling_kpt14',
+ id=156,
+ color=colors['sling'],
+ type='',
+ swap='sling_kpt8'),
+ 157:
+ dict(
+ name='sling_kpt15',
+ id=157,
+ color=colors['sling'],
+ type='',
+ swap='sling_kpt7'),
+ # shorts
+ 158:
+ dict(
+ name='shorts_kpt1',
+ id=158,
+ color=colors['shorts'],
+ type='',
+ swap='shorts_kpt3'),
+ 159:
+ dict(
+ name='shorts_kpt2',
+ id=159,
+ color=colors['shorts'],
+ type='',
+ swap=''),
+ 160:
+ dict(
+ name='shorts_kpt3',
+ id=160,
+ color=colors['shorts'],
+ type='',
+ swap='shorts_kpt1'),
+ 161:
+ dict(
+ name='shorts_kpt4',
+ id=161,
+ color=colors['shorts'],
+ type='',
+ swap='shorts_kpt10'),
+ 162:
+ dict(
+ name='shorts_kpt5',
+ id=162,
+ color=colors['shorts'],
+ type='',
+ swap='shorts_kpt9'),
+ 163:
+ dict(
+ name='shorts_kpt6',
+ id=163,
+ color=colors['shorts'],
+ type='',
+ swap='shorts_kpt8'),
+ 164:
+ dict(
+ name='shorts_kpt7',
+ id=164,
+ color=colors['shorts'],
+ type='',
+ swap=''),
+ 165:
+ dict(
+ name='shorts_kpt8',
+ id=165,
+ color=colors['shorts'],
+ type='',
+ swap='shorts_kpt6'),
+ 166:
+ dict(
+ name='shorts_kpt9',
+ id=166,
+ color=colors['shorts'],
+ type='',
+ swap='shorts_kpt5'),
+ 167:
+ dict(
+ name='shorts_kpt10',
+ id=167,
+ color=colors['shorts'],
+ type='',
+ swap='shorts_kpt4'),
+ # trousers
+ 168:
+ dict(
+ name='trousers_kpt1',
+ id=168,
+ color=colors['trousers'],
+ type='',
+ swap='trousers_kpt3'),
+ 169:
+ dict(
+ name='trousers_kpt2',
+ id=169,
+ color=colors['trousers'],
+ type='',
+ swap=''),
+ 170:
+ dict(
+ name='trousers_kpt3',
+ id=170,
+ color=colors['trousers'],
+ type='',
+ swap='trousers_kpt1'),
+ 171:
+ dict(
+ name='trousers_kpt4',
+ id=171,
+ color=colors['trousers'],
+ type='',
+ swap='trousers_kpt14'),
+ 172:
+ dict(
+ name='trousers_kpt5',
+ id=172,
+ color=colors['trousers'],
+ type='',
+ swap='trousers_kpt13'),
+ 173:
+ dict(
+ name='trousers_kpt6',
+ id=173,
+ color=colors['trousers'],
+ type='',
+ swap='trousers_kpt12'),
+ 174:
+ dict(
+ name='trousers_kpt7',
+ id=174,
+ color=colors['trousers'],
+ type='',
+ swap='trousers_kpt11'),
+ 175:
+ dict(
+ name='trousers_kpt8',
+ id=175,
+ color=colors['trousers'],
+ type='',
+ swap='trousers_kpt10'),
+ 176:
+ dict(
+ name='trousers_kpt9',
+ id=176,
+ color=colors['trousers'],
+ type='',
+ swap=''),
+ 177:
+ dict(
+ name='trousers_kpt10',
+ id=177,
+ color=colors['trousers'],
+ type='',
+ swap='trousers_kpt8'),
+ 178:
+ dict(
+ name='trousers_kpt11',
+ id=178,
+ color=colors['trousers'],
+ type='',
+ swap='trousers_kpt7'),
+ 179:
+ dict(
+ name='trousers_kpt12',
+ id=179,
+ color=colors['trousers'],
+ type='',
+ swap='trousers_kpt6'),
+ 180:
+ dict(
+ name='trousers_kpt13',
+ id=180,
+ color=colors['trousers'],
+ type='',
+ swap='trousers_kpt5'),
+ 181:
+ dict(
+ name='trousers_kpt14',
+ id=181,
+ color=colors['trousers'],
+ type='',
+ swap='trousers_kpt4'),
+ # skirt
+ 182:
+ dict(
+ name='skirt_kpt1',
+ id=182,
+ color=colors['skirt'],
+ type='',
+ swap='skirt_kpt3'),
+ 183:
+ dict(
+ name='skirt_kpt2', id=183, color=colors['skirt'], type='',
+ swap=''),
+ 184:
+ dict(
+ name='skirt_kpt3',
+ id=184,
+ color=colors['skirt'],
+ type='',
+ swap='skirt_kpt1'),
+ 185:
+ dict(
+ name='skirt_kpt4',
+ id=185,
+ color=colors['skirt'],
+ type='',
+ swap='skirt_kpt8'),
+ 186:
+ dict(
+ name='skirt_kpt5',
+ id=186,
+ color=colors['skirt'],
+ type='',
+ swap='skirt_kpt7'),
+ 187:
+ dict(
+ name='skirt_kpt6', id=187, color=colors['skirt'], type='',
+ swap=''),
+ 188:
+ dict(
+ name='skirt_kpt7',
+ id=188,
+ color=colors['skirt'],
+ type='',
+ swap='skirt_kpt5'),
+ 189:
+ dict(
+ name='skirt_kpt8',
+ id=189,
+ color=colors['skirt'],
+ type='',
+ swap='skirt_kpt4'),
+ # short_sleeved_dress
+ 190:
+ dict(name='ssd_kpt1', id=190, color=colors['ssd'], type='', swap=''),
+ 191:
+ dict(
+ name='ssd_kpt2',
+ id=191,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt6'),
+ 192:
+ dict(
+ name='ssd_kpt3',
+ id=192,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt5'),
+ 193:
+ dict(name='ssd_kpt4', id=193, color=colors['ssd'], type='', swap=''),
+ 194:
+ dict(
+ name='ssd_kpt5',
+ id=194,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt3'),
+ 195:
+ dict(
+ name='ssd_kpt6',
+ id=195,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt2'),
+ 196:
+ dict(
+ name='ssd_kpt7',
+ id=196,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt29'),
+ 197:
+ dict(
+ name='ssd_kpt8',
+ id=197,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt28'),
+ 198:
+ dict(
+ name='ssd_kpt9',
+ id=198,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt27'),
+ 199:
+ dict(
+ name='ssd_kpt10',
+ id=199,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt26'),
+ 200:
+ dict(
+ name='ssd_kpt11',
+ id=200,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt25'),
+ 201:
+ dict(
+ name='ssd_kpt12',
+ id=201,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt24'),
+ 202:
+ dict(
+ name='ssd_kpt13',
+ id=202,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt23'),
+ 203:
+ dict(
+ name='ssd_kpt14',
+ id=203,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt22'),
+ 204:
+ dict(
+ name='ssd_kpt15',
+ id=204,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt21'),
+ 205:
+ dict(
+ name='ssd_kpt16',
+ id=205,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt20'),
+ 206:
+ dict(
+ name='ssd_kpt17',
+ id=206,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt19'),
+ 207:
+ dict(name='ssd_kpt18', id=207, color=colors['ssd'], type='', swap=''),
+ 208:
+ dict(
+ name='ssd_kpt19',
+ id=208,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt17'),
+ 209:
+ dict(
+ name='ssd_kpt20',
+ id=209,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt16'),
+ 210:
+ dict(
+ name='ssd_kpt21',
+ id=210,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt15'),
+ 211:
+ dict(
+ name='ssd_kpt22',
+ id=211,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt14'),
+ 212:
+ dict(
+ name='ssd_kpt23',
+ id=212,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt13'),
+ 213:
+ dict(
+ name='ssd_kpt24',
+ id=213,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt12'),
+ 214:
+ dict(
+ name='ssd_kpt25',
+ id=214,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt11'),
+ 215:
+ dict(
+ name='ssd_kpt26',
+ id=215,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt10'),
+ 216:
+ dict(
+ name='ssd_kpt27',
+ id=216,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt9'),
+ 217:
+ dict(
+ name='ssd_kpt28',
+ id=217,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt8'),
+ 218:
+ dict(
+ name='ssd_kpt29',
+ id=218,
+ color=colors['ssd'],
+ type='',
+ swap='ssd_kpt7'),
+ # long_sleeved_dress
+ 219:
+ dict(name='lsd_kpt1', id=219, color=colors['lsd'], type='', swap=''),
+ 220:
+ dict(
+ name='lsd_kpt2',
+ id=220,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt6'),
+ 221:
+ dict(
+ name='lsd_kpt3',
+ id=221,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt5'),
+ 222:
+ dict(name='lsd_kpt4', id=222, color=colors['lsd'], type='', swap=''),
+ 223:
+ dict(
+ name='lsd_kpt5',
+ id=223,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt3'),
+ 224:
+ dict(
+ name='lsd_kpt6',
+ id=224,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt2'),
+ 225:
+ dict(
+ name='lsd_kpt7',
+ id=225,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt37'),
+ 226:
+ dict(
+ name='lsd_kpt8',
+ id=226,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt36'),
+ 227:
+ dict(
+ name='lsd_kpt9',
+ id=227,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt35'),
+ 228:
+ dict(
+ name='lsd_kpt10',
+ id=228,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt34'),
+ 229:
+ dict(
+ name='lsd_kpt11',
+ id=229,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt33'),
+ 230:
+ dict(
+ name='lsd_kpt12',
+ id=230,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt32'),
+ 231:
+ dict(
+ name='lsd_kpt13',
+ id=231,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt31'),
+ 232:
+ dict(
+ name='lsd_kpt14',
+ id=232,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt30'),
+ 233:
+ dict(
+ name='lsd_kpt15',
+ id=233,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt29'),
+ 234:
+ dict(
+ name='lsd_kpt16',
+ id=234,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt28'),
+ 235:
+ dict(
+ name='lsd_kpt17',
+ id=235,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt27'),
+ 236:
+ dict(
+ name='lsd_kpt18',
+ id=236,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt26'),
+ 237:
+ dict(
+ name='lsd_kpt19',
+ id=237,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt25'),
+ 238:
+ dict(
+ name='lsd_kpt20',
+ id=238,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt24'),
+ 239:
+ dict(
+ name='lsd_kpt21',
+ id=239,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt23'),
+ 240:
+ dict(name='lsd_kpt22', id=240, color=colors['lsd'], type='', swap=''),
+ 241:
+ dict(
+ name='lsd_kpt23',
+ id=241,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt21'),
+ 242:
+ dict(
+ name='lsd_kpt24',
+ id=242,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt20'),
+ 243:
+ dict(
+ name='lsd_kpt25',
+ id=243,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt19'),
+ 244:
+ dict(
+ name='lsd_kpt26',
+ id=244,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt18'),
+ 245:
+ dict(
+ name='lsd_kpt27',
+ id=245,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt17'),
+ 246:
+ dict(
+ name='lsd_kpt28',
+ id=246,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt16'),
+ 247:
+ dict(
+ name='lsd_kpt29',
+ id=247,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt15'),
+ 248:
+ dict(
+ name='lsd_kpt30',
+ id=248,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt14'),
+ 249:
+ dict(
+ name='lsd_kpt31',
+ id=249,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt13'),
+ 250:
+ dict(
+ name='lsd_kpt32',
+ id=250,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt12'),
+ 251:
+ dict(
+ name='lsd_kpt33',
+ id=251,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt11'),
+ 252:
+ dict(
+ name='lsd_kpt34',
+ id=252,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt10'),
+ 253:
+ dict(
+ name='lsd_kpt35',
+ id=253,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt9'),
+ 254:
+ dict(
+ name='lsd_kpt36',
+ id=254,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt8'),
+ 255:
+ dict(
+ name='lsd_kpt37',
+ id=255,
+ color=colors['lsd'],
+ type='',
+ swap='lsd_kpt7'),
+ # vest_dress
+ 256:
+ dict(name='vd_kpt1', id=256, color=colors['vd'], type='', swap=''),
+ 257:
+ dict(
+ name='vd_kpt2',
+ id=257,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt6'),
+ 258:
+ dict(
+ name='vd_kpt3',
+ id=258,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt5'),
+ 259:
+ dict(name='vd_kpt4', id=259, color=colors['vd'], type='', swap=''),
+ 260:
+ dict(
+ name='vd_kpt5',
+ id=260,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt3'),
+ 261:
+ dict(
+ name='vd_kpt6',
+ id=261,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt2'),
+ 262:
+ dict(
+ name='vd_kpt7',
+ id=262,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt19'),
+ 263:
+ dict(
+ name='vd_kpt8',
+ id=263,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt18'),
+ 264:
+ dict(
+ name='vd_kpt9',
+ id=264,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt17'),
+ 265:
+ dict(
+ name='vd_kpt10',
+ id=265,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt16'),
+ 266:
+ dict(
+ name='vd_kpt11',
+ id=266,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt15'),
+ 267:
+ dict(
+ name='vd_kpt12',
+ id=267,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt14'),
+ 268:
+ dict(name='vd_kpt13', id=268, color=colors['vd'], type='', swap=''),
+ 269:
+ dict(
+ name='vd_kpt14',
+ id=269,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt12'),
+ 270:
+ dict(
+ name='vd_kpt15',
+ id=270,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt11'),
+ 271:
+ dict(
+ name='vd_kpt16',
+ id=271,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt10'),
+ 272:
+ dict(
+ name='vd_kpt17',
+ id=272,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt9'),
+ 273:
+ dict(
+ name='vd_kpt18',
+ id=273,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt8'),
+ 274:
+ dict(
+ name='vd_kpt19',
+ id=274,
+ color=colors['vd'],
+ type='',
+ swap='vd_kpt7'),
+ # sling_dress
+ 275:
+ dict(name='sd_kpt1', id=275, color=colors['sd'], type='', swap=''),
+ 276:
+ dict(
+ name='sd_kpt2',
+ id=276,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt6'),
+ 277:
+ dict(
+ name='sd_kpt3',
+ id=277,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt5'),
+ 278:
+ dict(name='sd_kpt4', id=278, color=colors['sd'], type='', swap=''),
+ 279:
+ dict(
+ name='sd_kpt5',
+ id=279,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt3'),
+ 280:
+ dict(
+ name='sd_kpt6',
+ id=280,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt2'),
+ 281:
+ dict(
+ name='sd_kpt7',
+ id=281,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt19'),
+ 282:
+ dict(
+ name='sd_kpt8',
+ id=282,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt18'),
+ 283:
+ dict(
+ name='sd_kpt9',
+ id=283,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt17'),
+ 284:
+ dict(
+ name='sd_kpt10',
+ id=284,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt16'),
+ 285:
+ dict(
+ name='sd_kpt11',
+ id=285,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt15'),
+ 286:
+ dict(
+ name='sd_kpt12',
+ id=286,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt14'),
+ 287:
+ dict(name='sd_kpt13', id=287, color=colors['sd'], type='', swap=''),
+ 288:
+ dict(
+ name='sd_kpt14',
+ id=288,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt12'),
+ 289:
+ dict(
+ name='sd_kpt15',
+ id=289,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt11'),
+ 290:
+ dict(
+ name='sd_kpt16',
+ id=290,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt10'),
+ 291:
+ dict(
+ name='sd_kpt17',
+ id=291,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt9'),
+ 292:
+ dict(
+ name='sd_kpt18',
+ id=292,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt8'),
+ 293:
+ dict(
+ name='sd_kpt19',
+ id=293,
+ color=colors['sd'],
+ type='',
+ swap='sd_kpt7'),
+ },
+ skeleton_info={
+ # short_sleeved_shirt
+ 0:
+ dict(link=('sss_kpt1', 'sss_kpt2'), id=0, color=[255, 128, 0]),
+ 1:
+ dict(link=('sss_kpt2', 'sss_kpt7'), id=1, color=[255, 128, 0]),
+ 2:
+ dict(link=('sss_kpt7', 'sss_kpt8'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('sss_kpt8', 'sss_kpt9'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('sss_kpt9', 'sss_kpt10'), id=4, color=[255, 128, 0]),
+ 5:
+ dict(link=('sss_kpt10', 'sss_kpt11'), id=5, color=[255, 128, 0]),
+ 6:
+ dict(link=('sss_kpt11', 'sss_kpt12'), id=6, color=[255, 128, 0]),
+ 7:
+ dict(link=('sss_kpt12', 'sss_kpt13'), id=7, color=[255, 128, 0]),
+ 8:
+ dict(link=('sss_kpt13', 'sss_kpt14'), id=8, color=[255, 128, 0]),
+ 9:
+ dict(link=('sss_kpt14', 'sss_kpt15'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('sss_kpt15', 'sss_kpt16'), id=10, color=[255, 128, 0]),
+ 11:
+ dict(link=('sss_kpt16', 'sss_kpt17'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('sss_kpt17', 'sss_kpt18'), id=12, color=[255, 128, 0]),
+ 13:
+ dict(link=('sss_kpt18', 'sss_kpt19'), id=13, color=[255, 128, 0]),
+ 14:
+ dict(link=('sss_kpt19', 'sss_kpt20'), id=14, color=[255, 128, 0]),
+ 15:
+ dict(link=('sss_kpt20', 'sss_kpt21'), id=15, color=[255, 128, 0]),
+ 16:
+ dict(link=('sss_kpt21', 'sss_kpt22'), id=16, color=[255, 128, 0]),
+ 17:
+ dict(link=('sss_kpt22', 'sss_kpt23'), id=17, color=[255, 128, 0]),
+ 18:
+ dict(link=('sss_kpt23', 'sss_kpt24'), id=18, color=[255, 128, 0]),
+ 19:
+ dict(link=('sss_kpt24', 'sss_kpt25'), id=19, color=[255, 128, 0]),
+ 20:
+ dict(link=('sss_kpt25', 'sss_kpt6'), id=20, color=[255, 128, 0]),
+ 21:
+ dict(link=('sss_kpt6', 'sss_kpt1'), id=21, color=[255, 128, 0]),
+ 22:
+ dict(link=('sss_kpt2', 'sss_kpt3'), id=22, color=[255, 128, 0]),
+ 23:
+ dict(link=('sss_kpt3', 'sss_kpt4'), id=23, color=[255, 128, 0]),
+ 24:
+ dict(link=('sss_kpt4', 'sss_kpt5'), id=24, color=[255, 128, 0]),
+ 25:
+ dict(link=('sss_kpt5', 'sss_kpt6'), id=25, color=[255, 128, 0]),
+ # long_sleeve_shirt
+ 26:
+ dict(link=('lss_kpt1', 'lss_kpt2'), id=26, color=[255, 0, 128]),
+ 27:
+ dict(link=('lss_kpt2', 'lss_kpt7'), id=27, color=[255, 0, 128]),
+ 28:
+ dict(link=('lss_kpt7', 'lss_kpt8'), id=28, color=[255, 0, 128]),
+ 29:
+ dict(link=('lss_kpt8', 'lss_kpt9'), id=29, color=[255, 0, 128]),
+ 30:
+ dict(link=('lss_kpt9', 'lss_kpt10'), id=30, color=[255, 0, 128]),
+ 31:
+ dict(link=('lss_kpt10', 'lss_kpt11'), id=31, color=[255, 0, 128]),
+ 32:
+ dict(link=('lss_kpt11', 'lss_kpt12'), id=32, color=[255, 0, 128]),
+ 33:
+ dict(link=('lss_kpt12', 'lss_kpt13'), id=33, color=[255, 0, 128]),
+ 34:
+ dict(link=('lss_kpt13', 'lss_kpt14'), id=34, color=[255, 0, 128]),
+ 35:
+ dict(link=('lss_kpt14', 'lss_kpt15'), id=35, color=[255, 0, 128]),
+ 36:
+ dict(link=('lss_kpt15', 'lss_kpt16'), id=36, color=[255, 0, 128]),
+ 37:
+ dict(link=('lss_kpt16', 'lss_kpt17'), id=37, color=[255, 0, 128]),
+ 38:
+ dict(link=('lss_kpt17', 'lss_kpt18'), id=38, color=[255, 0, 128]),
+ 39:
+ dict(link=('lss_kpt18', 'lss_kpt19'), id=39, color=[255, 0, 128]),
+ 40:
+ dict(link=('lss_kpt19', 'lss_kpt20'), id=40, color=[255, 0, 128]),
+ 41:
+ dict(link=('lss_kpt20', 'lss_kpt21'), id=41, color=[255, 0, 128]),
+ 42:
+ dict(link=('lss_kpt21', 'lss_kpt22'), id=42, color=[255, 0, 128]),
+ 43:
+ dict(link=('lss_kpt22', 'lss_kpt23'), id=43, color=[255, 0, 128]),
+ 44:
+ dict(link=('lss_kpt23', 'lss_kpt24'), id=44, color=[255, 0, 128]),
+ 45:
+ dict(link=('lss_kpt24', 'lss_kpt25'), id=45, color=[255, 0, 128]),
+ 46:
+ dict(link=('lss_kpt25', 'lss_kpt26'), id=46, color=[255, 0, 128]),
+ 47:
+ dict(link=('lss_kpt26', 'lss_kpt27'), id=47, color=[255, 0, 128]),
+ 48:
+ dict(link=('lss_kpt27', 'lss_kpt28'), id=48, color=[255, 0, 128]),
+ 49:
+ dict(link=('lss_kpt28', 'lss_kpt29'), id=49, color=[255, 0, 128]),
+ 50:
+ dict(link=('lss_kpt29', 'lss_kpt30'), id=50, color=[255, 0, 128]),
+ 51:
+ dict(link=('lss_kpt30', 'lss_kpt31'), id=51, color=[255, 0, 128]),
+ 52:
+ dict(link=('lss_kpt31', 'lss_kpt32'), id=52, color=[255, 0, 128]),
+ 53:
+ dict(link=('lss_kpt32', 'lss_kpt33'), id=53, color=[255, 0, 128]),
+ 54:
+ dict(link=('lss_kpt33', 'lss_kpt6'), id=54, color=[255, 0, 128]),
+ 55:
+ dict(link=('lss_kpt6', 'lss_kpt5'), id=55, color=[255, 0, 128]),
+ 56:
+ dict(link=('lss_kpt5', 'lss_kpt4'), id=56, color=[255, 0, 128]),
+ 57:
+ dict(link=('lss_kpt4', 'lss_kpt3'), id=57, color=[255, 0, 128]),
+ 58:
+ dict(link=('lss_kpt3', 'lss_kpt2'), id=58, color=[255, 0, 128]),
+ 59:
+ dict(link=('lss_kpt6', 'lss_kpt1'), id=59, color=[255, 0, 128]),
+ # short_sleeved_outwear
+ 60:
+ dict(link=('sso_kpt1', 'sso_kpt4'), id=60, color=[128, 0, 255]),
+ 61:
+ dict(link=('sso_kpt4', 'sso_kpt7'), id=61, color=[128, 0, 255]),
+ 62:
+ dict(link=('sso_kpt7', 'sso_kpt8'), id=62, color=[128, 0, 255]),
+ 63:
+ dict(link=('sso_kpt8', 'sso_kpt9'), id=63, color=[128, 0, 255]),
+ 64:
+ dict(link=('sso_kpt9', 'sso_kpt10'), id=64, color=[128, 0, 255]),
+ 65:
+ dict(link=('sso_kpt10', 'sso_kpt11'), id=65, color=[128, 0, 255]),
+ 66:
+ dict(link=('sso_kpt11', 'sso_kpt12'), id=66, color=[128, 0, 255]),
+ 67:
+ dict(link=('sso_kpt12', 'sso_kpt13'), id=67, color=[128, 0, 255]),
+ 68:
+ dict(link=('sso_kpt13', 'sso_kpt14'), id=68, color=[128, 0, 255]),
+ 69:
+ dict(link=('sso_kpt14', 'sso_kpt15'), id=69, color=[128, 0, 255]),
+ 70:
+ dict(link=('sso_kpt15', 'sso_kpt16'), id=70, color=[128, 0, 255]),
+ 71:
+ dict(link=('sso_kpt16', 'sso_kpt31'), id=71, color=[128, 0, 255]),
+ 72:
+ dict(link=('sso_kpt31', 'sso_kpt30'), id=72, color=[128, 0, 255]),
+ 73:
+ dict(link=('sso_kpt30', 'sso_kpt2'), id=73, color=[128, 0, 255]),
+ 74:
+ dict(link=('sso_kpt2', 'sso_kpt3'), id=74, color=[128, 0, 255]),
+ 75:
+ dict(link=('sso_kpt3', 'sso_kpt4'), id=75, color=[128, 0, 255]),
+ 76:
+ dict(link=('sso_kpt1', 'sso_kpt6'), id=76, color=[128, 0, 255]),
+ 77:
+ dict(link=('sso_kpt6', 'sso_kpt25'), id=77, color=[128, 0, 255]),
+ 78:
+ dict(link=('sso_kpt25', 'sso_kpt24'), id=78, color=[128, 0, 255]),
+ 79:
+ dict(link=('sso_kpt24', 'sso_kpt23'), id=79, color=[128, 0, 255]),
+ 80:
+ dict(link=('sso_kpt23', 'sso_kpt22'), id=80, color=[128, 0, 255]),
+ 81:
+ dict(link=('sso_kpt22', 'sso_kpt21'), id=81, color=[128, 0, 255]),
+ 82:
+ dict(link=('sso_kpt21', 'sso_kpt20'), id=82, color=[128, 0, 255]),
+ 83:
+ dict(link=('sso_kpt20', 'sso_kpt19'), id=83, color=[128, 0, 255]),
+ 84:
+ dict(link=('sso_kpt19', 'sso_kpt18'), id=84, color=[128, 0, 255]),
+ 85:
+ dict(link=('sso_kpt18', 'sso_kpt17'), id=85, color=[128, 0, 255]),
+ 86:
+ dict(link=('sso_kpt17', 'sso_kpt29'), id=86, color=[128, 0, 255]),
+ 87:
+ dict(link=('sso_kpt29', 'sso_kpt28'), id=87, color=[128, 0, 255]),
+ 88:
+ dict(link=('sso_kpt28', 'sso_kpt27'), id=88, color=[128, 0, 255]),
+ 89:
+ dict(link=('sso_kpt27', 'sso_kpt26'), id=89, color=[128, 0, 255]),
+ 90:
+ dict(link=('sso_kpt26', 'sso_kpt5'), id=90, color=[128, 0, 255]),
+ 91:
+ dict(link=('sso_kpt5', 'sso_kpt6'), id=91, color=[128, 0, 255]),
+ # long_sleeved_outwear
+ 92:
+ dict(link=('lso_kpt1', 'lso_kpt2'), id=92, color=[0, 128, 255]),
+ 93:
+ dict(link=('lso_kpt2', 'lso_kpt7'), id=93, color=[0, 128, 255]),
+ 94:
+ dict(link=('lso_kpt7', 'lso_kpt8'), id=94, color=[0, 128, 255]),
+ 95:
+ dict(link=('lso_kpt8', 'lso_kpt9'), id=95, color=[0, 128, 255]),
+ 96:
+ dict(link=('lso_kpt9', 'lso_kpt10'), id=96, color=[0, 128, 255]),
+ 97:
+ dict(link=('lso_kpt10', 'lso_kpt11'), id=97, color=[0, 128, 255]),
+ 98:
+ dict(link=('lso_kpt11', 'lso_kpt12'), id=98, color=[0, 128, 255]),
+ 99:
+ dict(link=('lso_kpt12', 'lso_kpt13'), id=99, color=[0, 128, 255]),
+ 100:
+ dict(link=('lso_kpt13', 'lso_kpt14'), id=100, color=[0, 128, 255]),
+ 101:
+ dict(link=('lso_kpt14', 'lso_kpt15'), id=101, color=[0, 128, 255]),
+ 102:
+ dict(link=('lso_kpt15', 'lso_kpt16'), id=102, color=[0, 128, 255]),
+ 103:
+ dict(link=('lso_kpt16', 'lso_kpt17'), id=103, color=[0, 128, 255]),
+ 104:
+ dict(link=('lso_kpt17', 'lso_kpt18'), id=104, color=[0, 128, 255]),
+ 105:
+ dict(link=('lso_kpt18', 'lso_kpt19'), id=105, color=[0, 128, 255]),
+ 106:
+ dict(link=('lso_kpt19', 'lso_kpt20'), id=106, color=[0, 128, 255]),
+ 107:
+ dict(link=('lso_kpt20', 'lso_kpt39'), id=107, color=[0, 128, 255]),
+ 108:
+ dict(link=('lso_kpt39', 'lso_kpt38'), id=108, color=[0, 128, 255]),
+ 109:
+ dict(link=('lso_kpt38', 'lso_kpt4'), id=109, color=[0, 128, 255]),
+ 110:
+ dict(link=('lso_kpt4', 'lso_kpt3'), id=110, color=[0, 128, 255]),
+ 111:
+ dict(link=('lso_kpt3', 'lso_kpt2'), id=111, color=[0, 128, 255]),
+ 112:
+ dict(link=('lso_kpt1', 'lso_kpt6'), id=112, color=[0, 128, 255]),
+ 113:
+ dict(link=('lso_kpt6', 'lso_kpt33'), id=113, color=[0, 128, 255]),
+ 114:
+ dict(link=('lso_kpt33', 'lso_kpt32'), id=114, color=[0, 128, 255]),
+ 115:
+ dict(link=('lso_kpt32', 'lso_kpt31'), id=115, color=[0, 128, 255]),
+ 116:
+ dict(link=('lso_kpt31', 'lso_kpt30'), id=116, color=[0, 128, 255]),
+ 117:
+ dict(link=('lso_kpt30', 'lso_kpt29'), id=117, color=[0, 128, 255]),
+ 118:
+ dict(link=('lso_kpt29', 'lso_kpt28'), id=118, color=[0, 128, 255]),
+ 119:
+ dict(link=('lso_kpt28', 'lso_kpt27'), id=119, color=[0, 128, 255]),
+ 120:
+ dict(link=('lso_kpt27', 'lso_kpt26'), id=120, color=[0, 128, 255]),
+ 121:
+ dict(link=('lso_kpt26', 'lso_kpt25'), id=121, color=[0, 128, 255]),
+ 122:
+ dict(link=('lso_kpt25', 'lso_kpt24'), id=122, color=[0, 128, 255]),
+ 123:
+ dict(link=('lso_kpt24', 'lso_kpt23'), id=123, color=[0, 128, 255]),
+ 124:
+ dict(link=('lso_kpt23', 'lso_kpt22'), id=124, color=[0, 128, 255]),
+ 125:
+ dict(link=('lso_kpt22', 'lso_kpt21'), id=125, color=[0, 128, 255]),
+ 126:
+ dict(link=('lso_kpt21', 'lso_kpt37'), id=126, color=[0, 128, 255]),
+ 127:
+ dict(link=('lso_kpt37', 'lso_kpt36'), id=127, color=[0, 128, 255]),
+ 128:
+ dict(link=('lso_kpt36', 'lso_kpt35'), id=128, color=[0, 128, 255]),
+ 129:
+ dict(link=('lso_kpt35', 'lso_kpt34'), id=129, color=[0, 128, 255]),
+ 130:
+ dict(link=('lso_kpt34', 'lso_kpt5'), id=130, color=[0, 128, 255]),
+ 131:
+ dict(link=('lso_kpt5', 'lso_kpt6'), id=131, color=[0, 128, 255]),
+ # vest
+ 132:
+ dict(link=('vest_kpt1', 'vest_kpt2'), id=132, color=[0, 128, 128]),
+ 133:
+ dict(link=('vest_kpt2', 'vest_kpt7'), id=133, color=[0, 128, 128]),
+ 134:
+ dict(link=('vest_kpt7', 'vest_kpt8'), id=134, color=[0, 128, 128]),
+ 135:
+ dict(link=('vest_kpt8', 'vest_kpt9'), id=135, color=[0, 128, 128]),
+ 136:
+ dict(link=('vest_kpt9', 'vest_kpt10'), id=136, color=[0, 128, 128]),
+ 137:
+ dict(link=('vest_kpt10', 'vest_kpt11'), id=137, color=[0, 128, 128]),
+ 138:
+ dict(link=('vest_kpt11', 'vest_kpt12'), id=138, color=[0, 128, 128]),
+ 139:
+ dict(link=('vest_kpt12', 'vest_kpt13'), id=139, color=[0, 128, 128]),
+ 140:
+ dict(link=('vest_kpt13', 'vest_kpt14'), id=140, color=[0, 128, 128]),
+ 141:
+ dict(link=('vest_kpt14', 'vest_kpt15'), id=141, color=[0, 128, 128]),
+ 142:
+ dict(link=('vest_kpt15', 'vest_kpt6'), id=142, color=[0, 128, 128]),
+ 143:
+ dict(link=('vest_kpt6', 'vest_kpt1'), id=143, color=[0, 128, 128]),
+ 144:
+ dict(link=('vest_kpt2', 'vest_kpt3'), id=144, color=[0, 128, 128]),
+ 145:
+ dict(link=('vest_kpt3', 'vest_kpt4'), id=145, color=[0, 128, 128]),
+ 146:
+ dict(link=('vest_kpt4', 'vest_kpt5'), id=146, color=[0, 128, 128]),
+ 147:
+ dict(link=('vest_kpt5', 'vest_kpt6'), id=147, color=[0, 128, 128]),
+ # sling
+ 148:
+ dict(link=('sling_kpt1', 'sling_kpt2'), id=148, color=[0, 0, 128]),
+ 149:
+ dict(link=('sling_kpt2', 'sling_kpt8'), id=149, color=[0, 0, 128]),
+ 150:
+ dict(link=('sling_kpt8', 'sling_kpt9'), id=150, color=[0, 0, 128]),
+ 151:
+ dict(link=('sling_kpt9', 'sling_kpt10'), id=151, color=[0, 0, 128]),
+ 152:
+ dict(link=('sling_kpt10', 'sling_kpt11'), id=152, color=[0, 0, 128]),
+ 153:
+ dict(link=('sling_kpt11', 'sling_kpt12'), id=153, color=[0, 0, 128]),
+ 154:
+ dict(link=('sling_kpt12', 'sling_kpt13'), id=154, color=[0, 0, 128]),
+ 155:
+ dict(link=('sling_kpt13', 'sling_kpt14'), id=155, color=[0, 0, 128]),
+ 156:
+ dict(link=('sling_kpt14', 'sling_kpt6'), id=156, color=[0, 0, 128]),
+ 157:
+ dict(link=('sling_kpt2', 'sling_kpt7'), id=157, color=[0, 0, 128]),
+ 158:
+ dict(link=('sling_kpt6', 'sling_kpt15'), id=158, color=[0, 0, 128]),
+ 159:
+ dict(link=('sling_kpt2', 'sling_kpt3'), id=159, color=[0, 0, 128]),
+ 160:
+ dict(link=('sling_kpt3', 'sling_kpt4'), id=160, color=[0, 0, 128]),
+ 161:
+ dict(link=('sling_kpt4', 'sling_kpt5'), id=161, color=[0, 0, 128]),
+ 162:
+ dict(link=('sling_kpt5', 'sling_kpt6'), id=162, color=[0, 0, 128]),
+ 163:
+ dict(link=('sling_kpt1', 'sling_kpt6'), id=163, color=[0, 0, 128]),
+ # shorts
+ 164:
+ dict(
+ link=('shorts_kpt1', 'shorts_kpt4'), id=164, color=[128, 128,
+ 128]),
+ 165:
+ dict(
+ link=('shorts_kpt4', 'shorts_kpt5'), id=165, color=[128, 128,
+ 128]),
+ 166:
+ dict(
+ link=('shorts_kpt5', 'shorts_kpt6'), id=166, color=[128, 128,
+ 128]),
+ 167:
+ dict(
+ link=('shorts_kpt6', 'shorts_kpt7'), id=167, color=[128, 128,
+ 128]),
+ 168:
+ dict(
+ link=('shorts_kpt7', 'shorts_kpt8'), id=168, color=[128, 128,
+ 128]),
+ 169:
+ dict(
+ link=('shorts_kpt8', 'shorts_kpt9'), id=169, color=[128, 128,
+ 128]),
+ 170:
+ dict(
+ link=('shorts_kpt9', 'shorts_kpt10'),
+ id=170,
+ color=[128, 128, 128]),
+ 171:
+ dict(
+ link=('shorts_kpt10', 'shorts_kpt3'),
+ id=171,
+ color=[128, 128, 128]),
+ 172:
+ dict(
+ link=('shorts_kpt3', 'shorts_kpt2'), id=172, color=[128, 128,
+ 128]),
+ 173:
+ dict(
+ link=('shorts_kpt2', 'shorts_kpt1'), id=173, color=[128, 128,
+ 128]),
+ # trousers
+ 174:
+ dict(
+ link=('trousers_kpt1', 'trousers_kpt4'),
+ id=174,
+ color=[128, 0, 128]),
+ 175:
+ dict(
+ link=('trousers_kpt4', 'trousers_kpt5'),
+ id=175,
+ color=[128, 0, 128]),
+ 176:
+ dict(
+ link=('trousers_kpt5', 'trousers_kpt6'),
+ id=176,
+ color=[128, 0, 128]),
+ 177:
+ dict(
+ link=('trousers_kpt6', 'trousers_kpt7'),
+ id=177,
+ color=[128, 0, 128]),
+ 178:
+ dict(
+ link=('trousers_kpt7', 'trousers_kpt8'),
+ id=178,
+ color=[128, 0, 128]),
+ 179:
+ dict(
+ link=('trousers_kpt8', 'trousers_kpt9'),
+ id=179,
+ color=[128, 0, 128]),
+ 180:
+ dict(
+ link=('trousers_kpt9', 'trousers_kpt10'),
+ id=180,
+ color=[128, 0, 128]),
+ 181:
+ dict(
+ link=('trousers_kpt10', 'trousers_kpt11'),
+ id=181,
+ color=[128, 0, 128]),
+ 182:
+ dict(
+ link=('trousers_kpt11', 'trousers_kpt12'),
+ id=182,
+ color=[128, 0, 128]),
+ 183:
+ dict(
+ link=('trousers_kpt12', 'trousers_kpt13'),
+ id=183,
+ color=[128, 0, 128]),
+ 184:
+ dict(
+ link=('trousers_kpt13', 'trousers_kpt14'),
+ id=184,
+ color=[128, 0, 128]),
+ 185:
+ dict(
+ link=('trousers_kpt14', 'trousers_kpt3'),
+ id=185,
+ color=[128, 0, 128]),
+ 186:
+ dict(
+ link=('trousers_kpt3', 'trousers_kpt2'),
+ id=186,
+ color=[128, 0, 128]),
+ 187:
+ dict(
+ link=('trousers_kpt2', 'trousers_kpt1'),
+ id=187,
+ color=[128, 0, 128]),
+ # skirt
+ 188:
+ dict(link=('skirt_kpt1', 'skirt_kpt4'), id=188, color=[64, 128, 128]),
+ 189:
+ dict(link=('skirt_kpt4', 'skirt_kpt5'), id=189, color=[64, 128, 128]),
+ 190:
+ dict(link=('skirt_kpt5', 'skirt_kpt6'), id=190, color=[64, 128, 128]),
+ 191:
+ dict(link=('skirt_kpt6', 'skirt_kpt7'), id=191, color=[64, 128, 128]),
+ 192:
+ dict(link=('skirt_kpt7', 'skirt_kpt8'), id=192, color=[64, 128, 128]),
+ 193:
+ dict(link=('skirt_kpt8', 'skirt_kpt3'), id=193, color=[64, 128, 128]),
+ 194:
+ dict(link=('skirt_kpt3', 'skirt_kpt2'), id=194, color=[64, 128, 128]),
+ 195:
+ dict(link=('skirt_kpt2', 'skirt_kpt1'), id=195, color=[64, 128, 128]),
+ # short_sleeved_dress
+ 196:
+ dict(link=('ssd_kpt1', 'ssd_kpt2'), id=196, color=[64, 64, 128]),
+ 197:
+ dict(link=('ssd_kpt2', 'ssd_kpt7'), id=197, color=[64, 64, 128]),
+ 198:
+ dict(link=('ssd_kpt7', 'ssd_kpt8'), id=198, color=[64, 64, 128]),
+ 199:
+ dict(link=('ssd_kpt8', 'ssd_kpt9'), id=199, color=[64, 64, 128]),
+ 200:
+ dict(link=('ssd_kpt9', 'ssd_kpt10'), id=200, color=[64, 64, 128]),
+ 201:
+ dict(link=('ssd_kpt10', 'ssd_kpt11'), id=201, color=[64, 64, 128]),
+ 202:
+ dict(link=('ssd_kpt11', 'ssd_kpt12'), id=202, color=[64, 64, 128]),
+ 203:
+ dict(link=('ssd_kpt12', 'ssd_kpt13'), id=203, color=[64, 64, 128]),
+ 204:
+ dict(link=('ssd_kpt13', 'ssd_kpt14'), id=204, color=[64, 64, 128]),
+ 205:
+ dict(link=('ssd_kpt14', 'ssd_kpt15'), id=205, color=[64, 64, 128]),
+ 206:
+ dict(link=('ssd_kpt15', 'ssd_kpt16'), id=206, color=[64, 64, 128]),
+ 207:
+ dict(link=('ssd_kpt16', 'ssd_kpt17'), id=207, color=[64, 64, 128]),
+ 208:
+ dict(link=('ssd_kpt17', 'ssd_kpt18'), id=208, color=[64, 64, 128]),
+ 209:
+ dict(link=('ssd_kpt18', 'ssd_kpt19'), id=209, color=[64, 64, 128]),
+ 210:
+ dict(link=('ssd_kpt19', 'ssd_kpt20'), id=210, color=[64, 64, 128]),
+ 211:
+ dict(link=('ssd_kpt20', 'ssd_kpt21'), id=211, color=[64, 64, 128]),
+ 212:
+ dict(link=('ssd_kpt21', 'ssd_kpt22'), id=212, color=[64, 64, 128]),
+ 213:
+ dict(link=('ssd_kpt22', 'ssd_kpt23'), id=213, color=[64, 64, 128]),
+ 214:
+ dict(link=('ssd_kpt23', 'ssd_kpt24'), id=214, color=[64, 64, 128]),
+ 215:
+ dict(link=('ssd_kpt24', 'ssd_kpt25'), id=215, color=[64, 64, 128]),
+ 216:
+ dict(link=('ssd_kpt25', 'ssd_kpt26'), id=216, color=[64, 64, 128]),
+ 217:
+ dict(link=('ssd_kpt26', 'ssd_kpt27'), id=217, color=[64, 64, 128]),
+ 218:
+ dict(link=('ssd_kpt27', 'ssd_kpt28'), id=218, color=[64, 64, 128]),
+ 219:
+ dict(link=('ssd_kpt28', 'ssd_kpt29'), id=219, color=[64, 64, 128]),
+ 220:
+ dict(link=('ssd_kpt29', 'ssd_kpt6'), id=220, color=[64, 64, 128]),
+ 221:
+ dict(link=('ssd_kpt6', 'ssd_kpt5'), id=221, color=[64, 64, 128]),
+ 222:
+ dict(link=('ssd_kpt5', 'ssd_kpt4'), id=222, color=[64, 64, 128]),
+ 223:
+ dict(link=('ssd_kpt4', 'ssd_kpt3'), id=223, color=[64, 64, 128]),
+ 224:
+ dict(link=('ssd_kpt3', 'ssd_kpt2'), id=224, color=[64, 64, 128]),
+ 225:
+ dict(link=('ssd_kpt6', 'ssd_kpt1'), id=225, color=[64, 64, 128]),
+ # long_sleeved_dress
+ 226:
+ dict(link=('lsd_kpt1', 'lsd_kpt2'), id=226, color=[128, 64, 0]),
+ 227:
+ dict(link=('lsd_kpt2', 'lsd_kpt7'), id=228, color=[128, 64, 0]),
+ 228:
+ dict(link=('lsd_kpt7', 'lsd_kpt8'), id=228, color=[128, 64, 0]),
+ 229:
+ dict(link=('lsd_kpt8', 'lsd_kpt9'), id=229, color=[128, 64, 0]),
+ 230:
+ dict(link=('lsd_kpt9', 'lsd_kpt10'), id=230, color=[128, 64, 0]),
+ 231:
+ dict(link=('lsd_kpt10', 'lsd_kpt11'), id=231, color=[128, 64, 0]),
+ 232:
+ dict(link=('lsd_kpt11', 'lsd_kpt12'), id=232, color=[128, 64, 0]),
+ 233:
+ dict(link=('lsd_kpt12', 'lsd_kpt13'), id=233, color=[128, 64, 0]),
+ 234:
+ dict(link=('lsd_kpt13', 'lsd_kpt14'), id=234, color=[128, 64, 0]),
+ 235:
+ dict(link=('lsd_kpt14', 'lsd_kpt15'), id=235, color=[128, 64, 0]),
+ 236:
+ dict(link=('lsd_kpt15', 'lsd_kpt16'), id=236, color=[128, 64, 0]),
+ 237:
+ dict(link=('lsd_kpt16', 'lsd_kpt17'), id=237, color=[128, 64, 0]),
+ 238:
+ dict(link=('lsd_kpt17', 'lsd_kpt18'), id=238, color=[128, 64, 0]),
+ 239:
+ dict(link=('lsd_kpt18', 'lsd_kpt19'), id=239, color=[128, 64, 0]),
+ 240:
+ dict(link=('lsd_kpt19', 'lsd_kpt20'), id=240, color=[128, 64, 0]),
+ 241:
+ dict(link=('lsd_kpt20', 'lsd_kpt21'), id=241, color=[128, 64, 0]),
+ 242:
+ dict(link=('lsd_kpt21', 'lsd_kpt22'), id=242, color=[128, 64, 0]),
+ 243:
+ dict(link=('lsd_kpt22', 'lsd_kpt23'), id=243, color=[128, 64, 0]),
+ 244:
+ dict(link=('lsd_kpt23', 'lsd_kpt24'), id=244, color=[128, 64, 0]),
+ 245:
+ dict(link=('lsd_kpt24', 'lsd_kpt25'), id=245, color=[128, 64, 0]),
+ 246:
+ dict(link=('lsd_kpt25', 'lsd_kpt26'), id=246, color=[128, 64, 0]),
+ 247:
+ dict(link=('lsd_kpt26', 'lsd_kpt27'), id=247, color=[128, 64, 0]),
+ 248:
+ dict(link=('lsd_kpt27', 'lsd_kpt28'), id=248, color=[128, 64, 0]),
+ 249:
+ dict(link=('lsd_kpt28', 'lsd_kpt29'), id=249, color=[128, 64, 0]),
+ 250:
+ dict(link=('lsd_kpt29', 'lsd_kpt30'), id=250, color=[128, 64, 0]),
+ 251:
+ dict(link=('lsd_kpt30', 'lsd_kpt31'), id=251, color=[128, 64, 0]),
+ 252:
+ dict(link=('lsd_kpt31', 'lsd_kpt32'), id=252, color=[128, 64, 0]),
+ 253:
+ dict(link=('lsd_kpt32', 'lsd_kpt33'), id=253, color=[128, 64, 0]),
+ 254:
+ dict(link=('lsd_kpt33', 'lsd_kpt34'), id=254, color=[128, 64, 0]),
+ 255:
+ dict(link=('lsd_kpt34', 'lsd_kpt35'), id=255, color=[128, 64, 0]),
+ 256:
+ dict(link=('lsd_kpt35', 'lsd_kpt36'), id=256, color=[128, 64, 0]),
+ 257:
+ dict(link=('lsd_kpt36', 'lsd_kpt37'), id=257, color=[128, 64, 0]),
+ 258:
+ dict(link=('lsd_kpt37', 'lsd_kpt6'), id=258, color=[128, 64, 0]),
+ 259:
+ dict(link=('lsd_kpt6', 'lsd_kpt5'), id=259, color=[128, 64, 0]),
+ 260:
+ dict(link=('lsd_kpt5', 'lsd_kpt4'), id=260, color=[128, 64, 0]),
+ 261:
+ dict(link=('lsd_kpt4', 'lsd_kpt3'), id=261, color=[128, 64, 0]),
+ 262:
+ dict(link=('lsd_kpt3', 'lsd_kpt2'), id=262, color=[128, 64, 0]),
+ 263:
+ dict(link=('lsd_kpt6', 'lsd_kpt1'), id=263, color=[128, 64, 0]),
+ # vest_dress
+ 264:
+ dict(link=('vd_kpt1', 'vd_kpt2'), id=264, color=[128, 64, 255]),
+ 265:
+ dict(link=('vd_kpt2', 'vd_kpt7'), id=265, color=[128, 64, 255]),
+ 266:
+ dict(link=('vd_kpt7', 'vd_kpt8'), id=266, color=[128, 64, 255]),
+ 267:
+ dict(link=('vd_kpt8', 'vd_kpt9'), id=267, color=[128, 64, 255]),
+ 268:
+ dict(link=('vd_kpt9', 'vd_kpt10'), id=268, color=[128, 64, 255]),
+ 269:
+ dict(link=('vd_kpt10', 'vd_kpt11'), id=269, color=[128, 64, 255]),
+ 270:
+ dict(link=('vd_kpt11', 'vd_kpt12'), id=270, color=[128, 64, 255]),
+ 271:
+ dict(link=('vd_kpt12', 'vd_kpt13'), id=271, color=[128, 64, 255]),
+ 272:
+ dict(link=('vd_kpt13', 'vd_kpt14'), id=272, color=[128, 64, 255]),
+ 273:
+ dict(link=('vd_kpt14', 'vd_kpt15'), id=273, color=[128, 64, 255]),
+ 274:
+ dict(link=('vd_kpt15', 'vd_kpt16'), id=274, color=[128, 64, 255]),
+ 275:
+ dict(link=('vd_kpt16', 'vd_kpt17'), id=275, color=[128, 64, 255]),
+ 276:
+ dict(link=('vd_kpt17', 'vd_kpt18'), id=276, color=[128, 64, 255]),
+ 277:
+ dict(link=('vd_kpt18', 'vd_kpt19'), id=277, color=[128, 64, 255]),
+ 278:
+ dict(link=('vd_kpt19', 'vd_kpt6'), id=278, color=[128, 64, 255]),
+ 279:
+ dict(link=('vd_kpt6', 'vd_kpt5'), id=279, color=[128, 64, 255]),
+ 280:
+ dict(link=('vd_kpt5', 'vd_kpt4'), id=280, color=[128, 64, 255]),
+ 281:
+ dict(link=('vd_kpt4', 'vd_kpt3'), id=281, color=[128, 64, 255]),
+ 282:
+ dict(link=('vd_kpt3', 'vd_kpt2'), id=282, color=[128, 64, 255]),
+ 283:
+ dict(link=('vd_kpt6', 'vd_kpt1'), id=283, color=[128, 64, 255]),
+ # sling_dress
+ 284:
+ dict(link=('sd_kpt1', 'sd_kpt2'), id=284, color=[128, 64, 0]),
+ 285:
+ dict(link=('sd_kpt2', 'sd_kpt8'), id=285, color=[128, 64, 0]),
+ 286:
+ dict(link=('sd_kpt8', 'sd_kpt9'), id=286, color=[128, 64, 0]),
+ 287:
+ dict(link=('sd_kpt9', 'sd_kpt10'), id=287, color=[128, 64, 0]),
+ 288:
+ dict(link=('sd_kpt10', 'sd_kpt11'), id=288, color=[128, 64, 0]),
+ 289:
+ dict(link=('sd_kpt11', 'sd_kpt12'), id=289, color=[128, 64, 0]),
+ 290:
+ dict(link=('sd_kpt12', 'sd_kpt13'), id=290, color=[128, 64, 0]),
+ 291:
+ dict(link=('sd_kpt13', 'sd_kpt14'), id=291, color=[128, 64, 0]),
+ 292:
+ dict(link=('sd_kpt14', 'sd_kpt15'), id=292, color=[128, 64, 0]),
+ 293:
+ dict(link=('sd_kpt15', 'sd_kpt16'), id=293, color=[128, 64, 0]),
+ 294:
+ dict(link=('sd_kpt16', 'sd_kpt17'), id=294, color=[128, 64, 0]),
+ 295:
+ dict(link=('sd_kpt17', 'sd_kpt18'), id=295, color=[128, 64, 0]),
+ 296:
+ dict(link=('sd_kpt18', 'sd_kpt6'), id=296, color=[128, 64, 0]),
+ 297:
+ dict(link=('sd_kpt6', 'sd_kpt5'), id=297, color=[128, 64, 0]),
+ 298:
+ dict(link=('sd_kpt5', 'sd_kpt4'), id=298, color=[128, 64, 0]),
+ 299:
+ dict(link=('sd_kpt4', 'sd_kpt3'), id=299, color=[128, 64, 0]),
+ 300:
+ dict(link=('sd_kpt3', 'sd_kpt2'), id=300, color=[128, 64, 0]),
+ 301:
+ dict(link=('sd_kpt2', 'sd_kpt7'), id=301, color=[128, 64, 0]),
+ 302:
+ dict(link=('sd_kpt6', 'sd_kpt19'), id=302, color=[128, 64, 0]),
+ 303:
+ dict(link=('sd_kpt6', 'sd_kpt1'), id=303, color=[128, 64, 0]),
+ },
+ joint_weights=[1.] * 294,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/deepfashion_full.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/deepfashion_full.py
new file mode 100644
index 0000000000000000000000000000000000000000..69afb2d00c99c2fe81e1589ddba186a77d1e0fae
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/deepfashion_full.py
@@ -0,0 +1,80 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='deepfashion_full',
+ paper_info=dict(
+ author='Liu, Ziwei and Luo, Ping and Qiu, Shi '
+ 'and Wang, Xiaogang and Tang, Xiaoou',
+ title='DeepFashion: Powering Robust Clothes Recognition '
+ 'and Retrieval with Rich Annotations',
+ container='Proceedings of IEEE Conference on Computer '
+ 'Vision and Pattern Recognition (CVPR)',
+ year='2016',
+ homepage='http://mmlab.ie.cuhk.edu.hk/projects/'
+ 'DeepFashion/LandmarkDetection.html',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='left collar',
+ id=0,
+ color=[255, 255, 255],
+ type='',
+ swap='right collar'),
+ 1:
+ dict(
+ name='right collar',
+ id=1,
+ color=[255, 255, 255],
+ type='',
+ swap='left collar'),
+ 2:
+ dict(
+ name='left sleeve',
+ id=2,
+ color=[255, 255, 255],
+ type='',
+ swap='right sleeve'),
+ 3:
+ dict(
+ name='right sleeve',
+ id=3,
+ color=[255, 255, 255],
+ type='',
+ swap='left sleeve'),
+ 4:
+ dict(
+ name='left waistline',
+ id=0,
+ color=[255, 255, 255],
+ type='',
+ swap='right waistline'),
+ 5:
+ dict(
+ name='right waistline',
+ id=1,
+ color=[255, 255, 255],
+ type='',
+ swap='left waistline'),
+ 6:
+ dict(
+ name='left hem',
+ id=2,
+ color=[255, 255, 255],
+ type='',
+ swap='right hem'),
+ 7:
+ dict(
+ name='right hem',
+ id=3,
+ color=[255, 255, 255],
+ type='',
+ swap='left hem'),
+ },
+ skeleton_info={},
+ joint_weights=[1.] * 8,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/deepfashion_lower.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/deepfashion_lower.py
new file mode 100644
index 0000000000000000000000000000000000000000..dbccbd25f9deaaab43ed41e5abc32f3beaad1ee6
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/deepfashion_lower.py
@@ -0,0 +1,52 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='deepfashion_lower',
+ paper_info=dict(
+ author='Liu, Ziwei and Luo, Ping and Qiu, Shi '
+ 'and Wang, Xiaogang and Tang, Xiaoou',
+ title='DeepFashion: Powering Robust Clothes Recognition '
+ 'and Retrieval with Rich Annotations',
+ container='Proceedings of IEEE Conference on Computer '
+ 'Vision and Pattern Recognition (CVPR)',
+ year='2016',
+ homepage='http://mmlab.ie.cuhk.edu.hk/projects/'
+ 'DeepFashion/LandmarkDetection.html',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='left waistline',
+ id=0,
+ color=[255, 255, 255],
+ type='',
+ swap='right waistline'),
+ 1:
+ dict(
+ name='right waistline',
+ id=1,
+ color=[255, 255, 255],
+ type='',
+ swap='left waistline'),
+ 2:
+ dict(
+ name='left hem',
+ id=2,
+ color=[255, 255, 255],
+ type='',
+ swap='right hem'),
+ 3:
+ dict(
+ name='right hem',
+ id=3,
+ color=[255, 255, 255],
+ type='',
+ swap='left hem'),
+ },
+ skeleton_info={},
+ joint_weights=[1.] * 4,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/deepfashion_upper.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/deepfashion_upper.py
new file mode 100644
index 0000000000000000000000000000000000000000..ea0e4871db1de3816340dca7206e7b57cb9cd218
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/deepfashion_upper.py
@@ -0,0 +1,66 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='deepfashion_upper',
+ paper_info=dict(
+ author='Liu, Ziwei and Luo, Ping and Qiu, Shi '
+ 'and Wang, Xiaogang and Tang, Xiaoou',
+ title='DeepFashion: Powering Robust Clothes Recognition '
+ 'and Retrieval with Rich Annotations',
+ container='Proceedings of IEEE Conference on Computer '
+ 'Vision and Pattern Recognition (CVPR)',
+ year='2016',
+ homepage='http://mmlab.ie.cuhk.edu.hk/projects/'
+ 'DeepFashion/LandmarkDetection.html',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='left collar',
+ id=0,
+ color=[255, 255, 255],
+ type='',
+ swap='right collar'),
+ 1:
+ dict(
+ name='right collar',
+ id=1,
+ color=[255, 255, 255],
+ type='',
+ swap='left collar'),
+ 2:
+ dict(
+ name='left sleeve',
+ id=2,
+ color=[255, 255, 255],
+ type='',
+ swap='right sleeve'),
+ 3:
+ dict(
+ name='right sleeve',
+ id=3,
+ color=[255, 255, 255],
+ type='',
+ swap='left sleeve'),
+ 4:
+ dict(
+ name='left hem',
+ id=4,
+ color=[255, 255, 255],
+ type='',
+ swap='right hem'),
+ 5:
+ dict(
+ name='right hem',
+ id=5,
+ color=[255, 255, 255],
+ type='',
+ swap='left hem'),
+ },
+ skeleton_info={},
+ joint_weights=[1.] * 6,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/fly.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/fly.py
new file mode 100644
index 0000000000000000000000000000000000000000..6076a35dd7faf4254c02e5bc6c81b122508c120c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/fly.py
@@ -0,0 +1,243 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='fly',
+ paper_info=dict(
+ author='Pereira, Talmo D and Aldarondo, Diego E and '
+ 'Willmore, Lindsay and Kislin, Mikhail and '
+ 'Wang, Samuel S-H and Murthy, Mala and Shaevitz, Joshua W',
+ title='Fast animal pose estimation using deep neural networks',
+ container='Nature methods',
+ year='2019',
+ homepage='https://github.com/jgraving/DeepPoseKit-Data',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='head', id=0, color=[255, 255, 255], type='', swap=''),
+ 1:
+ dict(name='eyeL', id=1, color=[255, 255, 255], type='', swap='eyeR'),
+ 2:
+ dict(name='eyeR', id=2, color=[255, 255, 255], type='', swap='eyeL'),
+ 3:
+ dict(name='neck', id=3, color=[255, 255, 255], type='', swap=''),
+ 4:
+ dict(name='thorax', id=4, color=[255, 255, 255], type='', swap=''),
+ 5:
+ dict(name='abdomen', id=5, color=[255, 255, 255], type='', swap=''),
+ 6:
+ dict(
+ name='forelegR1',
+ id=6,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegL1'),
+ 7:
+ dict(
+ name='forelegR2',
+ id=7,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegL2'),
+ 8:
+ dict(
+ name='forelegR3',
+ id=8,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegL3'),
+ 9:
+ dict(
+ name='forelegR4',
+ id=9,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegL4'),
+ 10:
+ dict(
+ name='midlegR1',
+ id=10,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegL1'),
+ 11:
+ dict(
+ name='midlegR2',
+ id=11,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegL2'),
+ 12:
+ dict(
+ name='midlegR3',
+ id=12,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegL3'),
+ 13:
+ dict(
+ name='midlegR4',
+ id=13,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegL4'),
+ 14:
+ dict(
+ name='hindlegR1',
+ id=14,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegL1'),
+ 15:
+ dict(
+ name='hindlegR2',
+ id=15,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegL2'),
+ 16:
+ dict(
+ name='hindlegR3',
+ id=16,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegL3'),
+ 17:
+ dict(
+ name='hindlegR4',
+ id=17,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegL4'),
+ 18:
+ dict(
+ name='forelegL1',
+ id=18,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegR1'),
+ 19:
+ dict(
+ name='forelegL2',
+ id=19,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegR2'),
+ 20:
+ dict(
+ name='forelegL3',
+ id=20,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegR3'),
+ 21:
+ dict(
+ name='forelegL4',
+ id=21,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegR4'),
+ 22:
+ dict(
+ name='midlegL1',
+ id=22,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegR1'),
+ 23:
+ dict(
+ name='midlegL2',
+ id=23,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegR2'),
+ 24:
+ dict(
+ name='midlegL3',
+ id=24,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegR3'),
+ 25:
+ dict(
+ name='midlegL4',
+ id=25,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegR4'),
+ 26:
+ dict(
+ name='hindlegL1',
+ id=26,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegR1'),
+ 27:
+ dict(
+ name='hindlegL2',
+ id=27,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegR2'),
+ 28:
+ dict(
+ name='hindlegL3',
+ id=28,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegR3'),
+ 29:
+ dict(
+ name='hindlegL4',
+ id=29,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegR4'),
+ 30:
+ dict(
+ name='wingL', id=30, color=[255, 255, 255], type='', swap='wingR'),
+ 31:
+ dict(
+ name='wingR', id=31, color=[255, 255, 255], type='', swap='wingL'),
+ },
+ skeleton_info={
+ 0: dict(link=('eyeL', 'head'), id=0, color=[255, 255, 255]),
+ 1: dict(link=('eyeR', 'head'), id=1, color=[255, 255, 255]),
+ 2: dict(link=('neck', 'head'), id=2, color=[255, 255, 255]),
+ 3: dict(link=('thorax', 'neck'), id=3, color=[255, 255, 255]),
+ 4: dict(link=('abdomen', 'thorax'), id=4, color=[255, 255, 255]),
+ 5: dict(link=('forelegR2', 'forelegR1'), id=5, color=[255, 255, 255]),
+ 6: dict(link=('forelegR3', 'forelegR2'), id=6, color=[255, 255, 255]),
+ 7: dict(link=('forelegR4', 'forelegR3'), id=7, color=[255, 255, 255]),
+ 8: dict(link=('midlegR2', 'midlegR1'), id=8, color=[255, 255, 255]),
+ 9: dict(link=('midlegR3', 'midlegR2'), id=9, color=[255, 255, 255]),
+ 10: dict(link=('midlegR4', 'midlegR3'), id=10, color=[255, 255, 255]),
+ 11:
+ dict(link=('hindlegR2', 'hindlegR1'), id=11, color=[255, 255, 255]),
+ 12:
+ dict(link=('hindlegR3', 'hindlegR2'), id=12, color=[255, 255, 255]),
+ 13:
+ dict(link=('hindlegR4', 'hindlegR3'), id=13, color=[255, 255, 255]),
+ 14:
+ dict(link=('forelegL2', 'forelegL1'), id=14, color=[255, 255, 255]),
+ 15:
+ dict(link=('forelegL3', 'forelegL2'), id=15, color=[255, 255, 255]),
+ 16:
+ dict(link=('forelegL4', 'forelegL3'), id=16, color=[255, 255, 255]),
+ 17: dict(link=('midlegL2', 'midlegL1'), id=17, color=[255, 255, 255]),
+ 18: dict(link=('midlegL3', 'midlegL2'), id=18, color=[255, 255, 255]),
+ 19: dict(link=('midlegL4', 'midlegL3'), id=19, color=[255, 255, 255]),
+ 20:
+ dict(link=('hindlegL2', 'hindlegL1'), id=20, color=[255, 255, 255]),
+ 21:
+ dict(link=('hindlegL3', 'hindlegL2'), id=21, color=[255, 255, 255]),
+ 22:
+ dict(link=('hindlegL4', 'hindlegL3'), id=22, color=[255, 255, 255]),
+ 23: dict(link=('wingL', 'neck'), id=23, color=[255, 255, 255]),
+ 24: dict(link=('wingR', 'neck'), id=24, color=[255, 255, 255])
+ },
+ joint_weights=[1.] * 32,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/freihand2d.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/freihand2d.py
new file mode 100644
index 0000000000000000000000000000000000000000..158839c96f37b173f7aa76b3e526cf4e0ee9b428
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/freihand2d.py
@@ -0,0 +1,150 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='freihand',
+ paper_info=dict(
+ author='Zimmermann, Christian and Ceylan, Duygu and '
+ 'Yang, Jimei and Russell, Bryan and '
+ 'Argus, Max and Brox, Thomas',
+ title='Freihand: A dataset for markerless capture of hand pose '
+ 'and shape from single rgb images',
+ container='Proceedings of the IEEE International '
+ 'Conference on Computer Vision',
+ year='2019',
+ homepage='https://lmb.informatik.uni-freiburg.de/projects/freihand/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='wrist', id=0, color=[255, 255, 255], type='', swap=''),
+ 1:
+ dict(name='thumb1', id=1, color=[255, 128, 0], type='', swap=''),
+ 2:
+ dict(name='thumb2', id=2, color=[255, 128, 0], type='', swap=''),
+ 3:
+ dict(name='thumb3', id=3, color=[255, 128, 0], type='', swap=''),
+ 4:
+ dict(name='thumb4', id=4, color=[255, 128, 0], type='', swap=''),
+ 5:
+ dict(
+ name='forefinger1', id=5, color=[255, 153, 255], type='', swap=''),
+ 6:
+ dict(
+ name='forefinger2', id=6, color=[255, 153, 255], type='', swap=''),
+ 7:
+ dict(
+ name='forefinger3', id=7, color=[255, 153, 255], type='', swap=''),
+ 8:
+ dict(
+ name='forefinger4', id=8, color=[255, 153, 255], type='', swap=''),
+ 9:
+ dict(
+ name='middle_finger1',
+ id=9,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 10:
+ dict(
+ name='middle_finger2',
+ id=10,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 11:
+ dict(
+ name='middle_finger3',
+ id=11,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 12:
+ dict(
+ name='middle_finger4',
+ id=12,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 13:
+ dict(
+ name='ring_finger1', id=13, color=[255, 51, 51], type='', swap=''),
+ 14:
+ dict(
+ name='ring_finger2', id=14, color=[255, 51, 51], type='', swap=''),
+ 15:
+ dict(
+ name='ring_finger3', id=15, color=[255, 51, 51], type='', swap=''),
+ 16:
+ dict(
+ name='ring_finger4', id=16, color=[255, 51, 51], type='', swap=''),
+ 17:
+ dict(name='pinky_finger1', id=17, color=[0, 255, 0], type='', swap=''),
+ 18:
+ dict(name='pinky_finger2', id=18, color=[0, 255, 0], type='', swap=''),
+ 19:
+ dict(name='pinky_finger3', id=19, color=[0, 255, 0], type='', swap=''),
+ 20:
+ dict(name='pinky_finger4', id=20, color=[0, 255, 0], type='', swap='')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('wrist', 'thumb1'), id=0, color=[255, 128, 0]),
+ 1:
+ dict(link=('thumb1', 'thumb2'), id=1, color=[255, 128, 0]),
+ 2:
+ dict(link=('thumb2', 'thumb3'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('thumb3', 'thumb4'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('wrist', 'forefinger1'), id=4, color=[255, 153, 255]),
+ 5:
+ dict(link=('forefinger1', 'forefinger2'), id=5, color=[255, 153, 255]),
+ 6:
+ dict(link=('forefinger2', 'forefinger3'), id=6, color=[255, 153, 255]),
+ 7:
+ dict(link=('forefinger3', 'forefinger4'), id=7, color=[255, 153, 255]),
+ 8:
+ dict(link=('wrist', 'middle_finger1'), id=8, color=[102, 178, 255]),
+ 9:
+ dict(
+ link=('middle_finger1', 'middle_finger2'),
+ id=9,
+ color=[102, 178, 255]),
+ 10:
+ dict(
+ link=('middle_finger2', 'middle_finger3'),
+ id=10,
+ color=[102, 178, 255]),
+ 11:
+ dict(
+ link=('middle_finger3', 'middle_finger4'),
+ id=11,
+ color=[102, 178, 255]),
+ 12:
+ dict(link=('wrist', 'ring_finger1'), id=12, color=[255, 51, 51]),
+ 13:
+ dict(
+ link=('ring_finger1', 'ring_finger2'), id=13, color=[255, 51, 51]),
+ 14:
+ dict(
+ link=('ring_finger2', 'ring_finger3'), id=14, color=[255, 51, 51]),
+ 15:
+ dict(
+ link=('ring_finger3', 'ring_finger4'), id=15, color=[255, 51, 51]),
+ 16:
+ dict(link=('wrist', 'pinky_finger1'), id=16, color=[0, 255, 0]),
+ 17:
+ dict(
+ link=('pinky_finger1', 'pinky_finger2'), id=17, color=[0, 255, 0]),
+ 18:
+ dict(
+ link=('pinky_finger2', 'pinky_finger3'), id=18, color=[0, 255, 0]),
+ 19:
+ dict(
+ link=('pinky_finger3', 'pinky_finger4'), id=19, color=[0, 255, 0])
+ },
+ joint_weights=[1.] * 21,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/goliath.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/goliath.py
new file mode 100644
index 0000000000000000000000000000000000000000..8f8a81af7246ac06c62964c2136196a70e28e78c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/goliath.py
@@ -0,0 +1,2571 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+coco_wholebody_info = dict(
+ dataset_name='coco_wholebody',
+ paper_info=dict(
+ author='Jin, Sheng and Xu, Lumin and Xu, Jin and '
+ 'Wang, Can and Liu, Wentao and '
+ 'Qian, Chen and Ouyang, Wanli and Luo, Ping',
+ title='Whole-Body Human Pose Estimation in the Wild',
+ container='Proceedings of the European '
+ 'Conference on Computer Vision (ECCV)',
+ year='2020',
+ homepage='https://github.com/jin-s13/COCO-WholeBody/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1:
+ dict(
+ name='left_eye',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_eye'),
+ 2:
+ dict(
+ name='right_eye',
+ id=2,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_eye'),
+ 3:
+ dict(
+ name='left_ear',
+ id=3,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 4:
+ dict(
+ name='right_ear',
+ id=4,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='right_shoulder',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 7:
+ dict(
+ name='left_elbow',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 8:
+ dict(
+ name='right_elbow',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 9:
+ dict(
+ name='left_wrist',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='right_hip',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 13:
+ dict(
+ name='left_knee',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 14:
+ dict(
+ name='right_knee',
+ id=14,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 15:
+ dict(
+ name='left_ankle',
+ id=15,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 16:
+ dict(
+ name='right_ankle',
+ id=16,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle'),
+ 17:
+ dict(
+ name='left_big_toe',
+ id=17,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_big_toe'),
+ 18:
+ dict(
+ name='left_small_toe',
+ id=18,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_small_toe'),
+ 19:
+ dict(
+ name='left_heel',
+ id=19,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_heel'),
+ 20:
+ dict(
+ name='right_big_toe',
+ id=20,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_big_toe'),
+ 21:
+ dict(
+ name='right_small_toe',
+ id=21,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_small_toe'),
+ 22:
+ dict(
+ name='right_heel',
+ id=22,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_heel'),
+ 23:
+ dict(
+ name='face-0',
+ id=23,
+ color=[255, 255, 255],
+ type='',
+ swap='face-16'),
+ 24:
+ dict(
+ name='face-1',
+ id=24,
+ color=[255, 255, 255],
+ type='',
+ swap='face-15'),
+ 25:
+ dict(
+ name='face-2',
+ id=25,
+ color=[255, 255, 255],
+ type='',
+ swap='face-14'),
+ 26:
+ dict(
+ name='face-3',
+ id=26,
+ color=[255, 255, 255],
+ type='',
+ swap='face-13'),
+ 27:
+ dict(
+ name='face-4',
+ id=27,
+ color=[255, 255, 255],
+ type='',
+ swap='face-12'),
+ 28:
+ dict(
+ name='face-5',
+ id=28,
+ color=[255, 255, 255],
+ type='',
+ swap='face-11'),
+ 29:
+ dict(
+ name='face-6',
+ id=29,
+ color=[255, 255, 255],
+ type='',
+ swap='face-10'),
+ 30:
+ dict(
+ name='face-7',
+ id=30,
+ color=[255, 255, 255],
+ type='',
+ swap='face-9'),
+ 31:
+ dict(name='face-8', id=31, color=[255, 255, 255], type='', swap=''),
+ 32:
+ dict(
+ name='face-9',
+ id=32,
+ color=[255, 255, 255],
+ type='',
+ swap='face-7'),
+ 33:
+ dict(
+ name='face-10',
+ id=33,
+ color=[255, 255, 255],
+ type='',
+ swap='face-6'),
+ 34:
+ dict(
+ name='face-11',
+ id=34,
+ color=[255, 255, 255],
+ type='',
+ swap='face-5'),
+ 35:
+ dict(
+ name='face-12',
+ id=35,
+ color=[255, 255, 255],
+ type='',
+ swap='face-4'),
+ 36:
+ dict(
+ name='face-13',
+ id=36,
+ color=[255, 255, 255],
+ type='',
+ swap='face-3'),
+ 37:
+ dict(
+ name='face-14',
+ id=37,
+ color=[255, 255, 255],
+ type='',
+ swap='face-2'),
+ 38:
+ dict(
+ name='face-15',
+ id=38,
+ color=[255, 255, 255],
+ type='',
+ swap='face-1'),
+ 39:
+ dict(
+ name='face-16',
+ id=39,
+ color=[255, 255, 255],
+ type='',
+ swap='face-0'),
+ 40:
+ dict(
+ name='face-17',
+ id=40,
+ color=[255, 255, 255],
+ type='',
+ swap='face-26'),
+ 41:
+ dict(
+ name='face-18',
+ id=41,
+ color=[255, 255, 255],
+ type='',
+ swap='face-25'),
+ 42:
+ dict(
+ name='face-19',
+ id=42,
+ color=[255, 255, 255],
+ type='',
+ swap='face-24'),
+ 43:
+ dict(
+ name='face-20',
+ id=43,
+ color=[255, 255, 255],
+ type='',
+ swap='face-23'),
+ 44:
+ dict(
+ name='face-21',
+ id=44,
+ color=[255, 255, 255],
+ type='',
+ swap='face-22'),
+ 45:
+ dict(
+ name='face-22',
+ id=45,
+ color=[255, 255, 255],
+ type='',
+ swap='face-21'),
+ 46:
+ dict(
+ name='face-23',
+ id=46,
+ color=[255, 255, 255],
+ type='',
+ swap='face-20'),
+ 47:
+ dict(
+ name='face-24',
+ id=47,
+ color=[255, 255, 255],
+ type='',
+ swap='face-19'),
+ 48:
+ dict(
+ name='face-25',
+ id=48,
+ color=[255, 255, 255],
+ type='',
+ swap='face-18'),
+ 49:
+ dict(
+ name='face-26',
+ id=49,
+ color=[255, 255, 255],
+ type='',
+ swap='face-17'),
+ 50:
+ dict(name='face-27', id=50, color=[255, 255, 255], type='', swap=''),
+ 51:
+ dict(name='face-28', id=51, color=[255, 255, 255], type='', swap=''),
+ 52:
+ dict(name='face-29', id=52, color=[255, 255, 255], type='', swap=''),
+ 53:
+ dict(name='face-30', id=53, color=[255, 255, 255], type='', swap=''),
+ 54:
+ dict(
+ name='face-31',
+ id=54,
+ color=[255, 255, 255],
+ type='',
+ swap='face-35'),
+ 55:
+ dict(
+ name='face-32',
+ id=55,
+ color=[255, 255, 255],
+ type='',
+ swap='face-34'),
+ 56:
+ dict(name='face-33', id=56, color=[255, 255, 255], type='', swap=''),
+ 57:
+ dict(
+ name='face-34',
+ id=57,
+ color=[255, 255, 255],
+ type='',
+ swap='face-32'),
+ 58:
+ dict(
+ name='face-35',
+ id=58,
+ color=[255, 255, 255],
+ type='',
+ swap='face-31'),
+ 59:
+ dict(
+ name='face-36',
+ id=59,
+ color=[255, 255, 255],
+ type='',
+ swap='face-45'),
+ 60:
+ dict(
+ name='face-37',
+ id=60,
+ color=[255, 255, 255],
+ type='',
+ swap='face-44'),
+ 61:
+ dict(
+ name='face-38',
+ id=61,
+ color=[255, 255, 255],
+ type='',
+ swap='face-43'),
+ 62:
+ dict(
+ name='face-39',
+ id=62,
+ color=[255, 255, 255],
+ type='',
+ swap='face-42'),
+ 63:
+ dict(
+ name='face-40',
+ id=63,
+ color=[255, 255, 255],
+ type='',
+ swap='face-47'),
+ 64:
+ dict(
+ name='face-41',
+ id=64,
+ color=[255, 255, 255],
+ type='',
+ swap='face-46'),
+ 65:
+ dict(
+ name='face-42',
+ id=65,
+ color=[255, 255, 255],
+ type='',
+ swap='face-39'),
+ 66:
+ dict(
+ name='face-43',
+ id=66,
+ color=[255, 255, 255],
+ type='',
+ swap='face-38'),
+ 67:
+ dict(
+ name='face-44',
+ id=67,
+ color=[255, 255, 255],
+ type='',
+ swap='face-37'),
+ 68:
+ dict(
+ name='face-45',
+ id=68,
+ color=[255, 255, 255],
+ type='',
+ swap='face-36'),
+ 69:
+ dict(
+ name='face-46',
+ id=69,
+ color=[255, 255, 255],
+ type='',
+ swap='face-41'),
+ 70:
+ dict(
+ name='face-47',
+ id=70,
+ color=[255, 255, 255],
+ type='',
+ swap='face-40'),
+ 71:
+ dict(
+ name='face-48',
+ id=71,
+ color=[255, 255, 255],
+ type='',
+ swap='face-54'),
+ 72:
+ dict(
+ name='face-49',
+ id=72,
+ color=[255, 255, 255],
+ type='',
+ swap='face-53'),
+ 73:
+ dict(
+ name='face-50',
+ id=73,
+ color=[255, 255, 255],
+ type='',
+ swap='face-52'),
+ 74:
+ dict(name='face-51', id=74, color=[255, 255, 255], type='', swap=''),
+ 75:
+ dict(
+ name='face-52',
+ id=75,
+ color=[255, 255, 255],
+ type='',
+ swap='face-50'),
+ 76:
+ dict(
+ name='face-53',
+ id=76,
+ color=[255, 255, 255],
+ type='',
+ swap='face-49'),
+ 77:
+ dict(
+ name='face-54',
+ id=77,
+ color=[255, 255, 255],
+ type='',
+ swap='face-48'),
+ 78:
+ dict(
+ name='face-55',
+ id=78,
+ color=[255, 255, 255],
+ type='',
+ swap='face-59'),
+ 79:
+ dict(
+ name='face-56',
+ id=79,
+ color=[255, 255, 255],
+ type='',
+ swap='face-58'),
+ 80:
+ dict(name='face-57', id=80, color=[255, 255, 255], type='', swap=''),
+ 81:
+ dict(
+ name='face-58',
+ id=81,
+ color=[255, 255, 255],
+ type='',
+ swap='face-56'),
+ 82:
+ dict(
+ name='face-59',
+ id=82,
+ color=[255, 255, 255],
+ type='',
+ swap='face-55'),
+ 83:
+ dict(
+ name='face-60',
+ id=83,
+ color=[255, 255, 255],
+ type='',
+ swap='face-64'),
+ 84:
+ dict(
+ name='face-61',
+ id=84,
+ color=[255, 255, 255],
+ type='',
+ swap='face-63'),
+ 85:
+ dict(name='face-62', id=85, color=[255, 255, 255], type='', swap=''),
+ 86:
+ dict(
+ name='face-63',
+ id=86,
+ color=[255, 255, 255],
+ type='',
+ swap='face-61'),
+ 87:
+ dict(
+ name='face-64',
+ id=87,
+ color=[255, 255, 255],
+ type='',
+ swap='face-60'),
+ 88:
+ dict(
+ name='face-65',
+ id=88,
+ color=[255, 255, 255],
+ type='',
+ swap='face-67'),
+ 89:
+ dict(name='face-66', id=89, color=[255, 255, 255], type='', swap=''),
+ 90:
+ dict(
+ name='face-67',
+ id=90,
+ color=[255, 255, 255],
+ type='',
+ swap='face-65'),
+ 91:
+ dict(
+ name='left_hand_root',
+ id=91,
+ color=[255, 255, 255],
+ type='',
+ swap='right_hand_root'),
+ 92:
+ dict(
+ name='left_thumb1',
+ id=92,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb1'),
+ 93:
+ dict(
+ name='left_thumb2',
+ id=93,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb2'),
+ 94:
+ dict(
+ name='left_thumb3',
+ id=94,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb3'),
+ 95:
+ dict(
+ name='left_thumb4',
+ id=95,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb4'),
+ 96:
+ dict(
+ name='left_forefinger1',
+ id=96,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger1'),
+ 97:
+ dict(
+ name='left_forefinger2',
+ id=97,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger2'),
+ 98:
+ dict(
+ name='left_forefinger3',
+ id=98,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger3'),
+ 99:
+ dict(
+ name='left_forefinger4',
+ id=99,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger4'),
+ 100:
+ dict(
+ name='left_middle_finger1',
+ id=100,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger1'),
+ 101:
+ dict(
+ name='left_middle_finger2',
+ id=101,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger2'),
+ 102:
+ dict(
+ name='left_middle_finger3',
+ id=102,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger3'),
+ 103:
+ dict(
+ name='left_middle_finger4',
+ id=103,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger4'),
+ 104:
+ dict(
+ name='left_ring_finger1',
+ id=104,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger1'),
+ 105:
+ dict(
+ name='left_ring_finger2',
+ id=105,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger2'),
+ 106:
+ dict(
+ name='left_ring_finger3',
+ id=106,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger3'),
+ 107:
+ dict(
+ name='left_ring_finger4',
+ id=107,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger4'),
+ 108:
+ dict(
+ name='left_pinky_finger1',
+ id=108,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger1'),
+ 109:
+ dict(
+ name='left_pinky_finger2',
+ id=109,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger2'),
+ 110:
+ dict(
+ name='left_pinky_finger3',
+ id=110,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger3'),
+ 111:
+ dict(
+ name='left_pinky_finger4',
+ id=111,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger4'),
+ 112:
+ dict(
+ name='right_hand_root',
+ id=112,
+ color=[255, 255, 255],
+ type='',
+ swap='left_hand_root'),
+ 113:
+ dict(
+ name='right_thumb1',
+ id=113,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb1'),
+ 114:
+ dict(
+ name='right_thumb2',
+ id=114,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb2'),
+ 115:
+ dict(
+ name='right_thumb3',
+ id=115,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb3'),
+ 116:
+ dict(
+ name='right_thumb4',
+ id=116,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb4'),
+ 117:
+ dict(
+ name='right_forefinger1',
+ id=117,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger1'),
+ 118:
+ dict(
+ name='right_forefinger2',
+ id=118,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger2'),
+ 119:
+ dict(
+ name='right_forefinger3',
+ id=119,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger3'),
+ 120:
+ dict(
+ name='right_forefinger4',
+ id=120,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger4'),
+ 121:
+ dict(
+ name='right_middle_finger1',
+ id=121,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger1'),
+ 122:
+ dict(
+ name='right_middle_finger2',
+ id=122,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger2'),
+ 123:
+ dict(
+ name='right_middle_finger3',
+ id=123,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger3'),
+ 124:
+ dict(
+ name='right_middle_finger4',
+ id=124,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger4'),
+ 125:
+ dict(
+ name='right_ring_finger1',
+ id=125,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger1'),
+ 126:
+ dict(
+ name='right_ring_finger2',
+ id=126,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger2'),
+ 127:
+ dict(
+ name='right_ring_finger3',
+ id=127,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger3'),
+ 128:
+ dict(
+ name='right_ring_finger4',
+ id=128,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger4'),
+ 129:
+ dict(
+ name='right_pinky_finger1',
+ id=129,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger1'),
+ 130:
+ dict(
+ name='right_pinky_finger2',
+ id=130,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger2'),
+ 131:
+ dict(
+ name='right_pinky_finger3',
+ id=131,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger3'),
+ 132:
+ dict(
+ name='right_pinky_finger4',
+ id=132,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger4')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+ 6:
+ dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(
+ link=('left_shoulder', 'right_shoulder'),
+ id=7,
+ color=[51, 153, 255]),
+ 8:
+ dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('left_eye', 'right_eye'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('nose', 'left_eye'), id=13, color=[51, 153, 255]),
+ 14:
+ dict(link=('nose', 'right_eye'), id=14, color=[51, 153, 255]),
+ 15:
+ dict(link=('left_eye', 'left_ear'), id=15, color=[51, 153, 255]),
+ 16:
+ dict(link=('right_eye', 'right_ear'), id=16, color=[51, 153, 255]),
+ 17:
+ dict(link=('left_ear', 'left_shoulder'), id=17, color=[51, 153, 255]),
+ 18:
+ dict(
+ link=('right_ear', 'right_shoulder'), id=18, color=[51, 153, 255]),
+ 19:
+ dict(link=('left_ankle', 'left_big_toe'), id=19, color=[0, 255, 0]),
+ 20:
+ dict(link=('left_ankle', 'left_small_toe'), id=20, color=[0, 255, 0]),
+ 21:
+ dict(link=('left_ankle', 'left_heel'), id=21, color=[0, 255, 0]),
+ 22:
+ dict(
+ link=('right_ankle', 'right_big_toe'), id=22, color=[255, 128, 0]),
+ 23:
+ dict(
+ link=('right_ankle', 'right_small_toe'),
+ id=23,
+ color=[255, 128, 0]),
+ 24:
+ dict(link=('right_ankle', 'right_heel'), id=24, color=[255, 128, 0]),
+ 25:
+ dict(
+ link=('left_hand_root', 'left_thumb1'), id=25, color=[255, 128,
+ 0]),
+ 26:
+ dict(link=('left_thumb1', 'left_thumb2'), id=26, color=[255, 128, 0]),
+ 27:
+ dict(link=('left_thumb2', 'left_thumb3'), id=27, color=[255, 128, 0]),
+ 28:
+ dict(link=('left_thumb3', 'left_thumb4'), id=28, color=[255, 128, 0]),
+ 29:
+ dict(
+ link=('left_hand_root', 'left_forefinger1'),
+ id=29,
+ color=[255, 153, 255]),
+ 30:
+ dict(
+ link=('left_forefinger1', 'left_forefinger2'),
+ id=30,
+ color=[255, 153, 255]),
+ 31:
+ dict(
+ link=('left_forefinger2', 'left_forefinger3'),
+ id=31,
+ color=[255, 153, 255]),
+ 32:
+ dict(
+ link=('left_forefinger3', 'left_forefinger4'),
+ id=32,
+ color=[255, 153, 255]),
+ 33:
+ dict(
+ link=('left_hand_root', 'left_middle_finger1'),
+ id=33,
+ color=[102, 178, 255]),
+ 34:
+ dict(
+ link=('left_middle_finger1', 'left_middle_finger2'),
+ id=34,
+ color=[102, 178, 255]),
+ 35:
+ dict(
+ link=('left_middle_finger2', 'left_middle_finger3'),
+ id=35,
+ color=[102, 178, 255]),
+ 36:
+ dict(
+ link=('left_middle_finger3', 'left_middle_finger4'),
+ id=36,
+ color=[102, 178, 255]),
+ 37:
+ dict(
+ link=('left_hand_root', 'left_ring_finger1'),
+ id=37,
+ color=[255, 51, 51]),
+ 38:
+ dict(
+ link=('left_ring_finger1', 'left_ring_finger2'),
+ id=38,
+ color=[255, 51, 51]),
+ 39:
+ dict(
+ link=('left_ring_finger2', 'left_ring_finger3'),
+ id=39,
+ color=[255, 51, 51]),
+ 40:
+ dict(
+ link=('left_ring_finger3', 'left_ring_finger4'),
+ id=40,
+ color=[255, 51, 51]),
+ 41:
+ dict(
+ link=('left_hand_root', 'left_pinky_finger1'),
+ id=41,
+ color=[0, 255, 0]),
+ 42:
+ dict(
+ link=('left_pinky_finger1', 'left_pinky_finger2'),
+ id=42,
+ color=[0, 255, 0]),
+ 43:
+ dict(
+ link=('left_pinky_finger2', 'left_pinky_finger3'),
+ id=43,
+ color=[0, 255, 0]),
+ 44:
+ dict(
+ link=('left_pinky_finger3', 'left_pinky_finger4'),
+ id=44,
+ color=[0, 255, 0]),
+ 45:
+ dict(
+ link=('right_hand_root', 'right_thumb1'),
+ id=45,
+ color=[255, 128, 0]),
+ 46:
+ dict(
+ link=('right_thumb1', 'right_thumb2'), id=46, color=[255, 128, 0]),
+ 47:
+ dict(
+ link=('right_thumb2', 'right_thumb3'), id=47, color=[255, 128, 0]),
+ 48:
+ dict(
+ link=('right_thumb3', 'right_thumb4'), id=48, color=[255, 128, 0]),
+ 49:
+ dict(
+ link=('right_hand_root', 'right_forefinger1'),
+ id=49,
+ color=[255, 153, 255]),
+ 50:
+ dict(
+ link=('right_forefinger1', 'right_forefinger2'),
+ id=50,
+ color=[255, 153, 255]),
+ 51:
+ dict(
+ link=('right_forefinger2', 'right_forefinger3'),
+ id=51,
+ color=[255, 153, 255]),
+ 52:
+ dict(
+ link=('right_forefinger3', 'right_forefinger4'),
+ id=52,
+ color=[255, 153, 255]),
+ 53:
+ dict(
+ link=('right_hand_root', 'right_middle_finger1'),
+ id=53,
+ color=[102, 178, 255]),
+ 54:
+ dict(
+ link=('right_middle_finger1', 'right_middle_finger2'),
+ id=54,
+ color=[102, 178, 255]),
+ 55:
+ dict(
+ link=('right_middle_finger2', 'right_middle_finger3'),
+ id=55,
+ color=[102, 178, 255]),
+ 56:
+ dict(
+ link=('right_middle_finger3', 'right_middle_finger4'),
+ id=56,
+ color=[102, 178, 255]),
+ 57:
+ dict(
+ link=('right_hand_root', 'right_ring_finger1'),
+ id=57,
+ color=[255, 51, 51]),
+ 58:
+ dict(
+ link=('right_ring_finger1', 'right_ring_finger2'),
+ id=58,
+ color=[255, 51, 51]),
+ 59:
+ dict(
+ link=('right_ring_finger2', 'right_ring_finger3'),
+ id=59,
+ color=[255, 51, 51]),
+ 60:
+ dict(
+ link=('right_ring_finger3', 'right_ring_finger4'),
+ id=60,
+ color=[255, 51, 51]),
+ 61:
+ dict(
+ link=('right_hand_root', 'right_pinky_finger1'),
+ id=61,
+ color=[0, 255, 0]),
+ 62:
+ dict(
+ link=('right_pinky_finger1', 'right_pinky_finger2'),
+ id=62,
+ color=[0, 255, 0]),
+ 63:
+ dict(
+ link=('right_pinky_finger2', 'right_pinky_finger3'),
+ id=63,
+ color=[0, 255, 0]),
+ 64:
+ dict(
+ link=('right_pinky_finger3', 'right_pinky_finger4'),
+ id=64,
+ color=[0, 255, 0])
+ },
+ joint_weights=[1.] * 133,
+ # 'https://github.com/jin-s13/COCO-WholeBody/blob/master/'
+ # 'evaluation/myeval_wholebody.py#L175'
+ sigmas=[
+ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+ 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089, 0.068, 0.066, 0.066,
+ 0.092, 0.094, 0.094, 0.042, 0.043, 0.044, 0.043, 0.040, 0.035, 0.031,
+ 0.025, 0.020, 0.023, 0.029, 0.032, 0.037, 0.038, 0.043, 0.041, 0.045,
+ 0.013, 0.012, 0.011, 0.011, 0.012, 0.012, 0.011, 0.011, 0.013, 0.015,
+ 0.009, 0.007, 0.007, 0.007, 0.012, 0.009, 0.008, 0.016, 0.010, 0.017,
+ 0.011, 0.009, 0.011, 0.009, 0.007, 0.013, 0.008, 0.011, 0.012, 0.010,
+ 0.034, 0.008, 0.008, 0.009, 0.008, 0.008, 0.007, 0.010, 0.008, 0.009,
+ 0.009, 0.009, 0.007, 0.007, 0.008, 0.011, 0.008, 0.008, 0.008, 0.01,
+ 0.008, 0.029, 0.022, 0.035, 0.037, 0.047, 0.026, 0.025, 0.024, 0.035,
+ 0.018, 0.024, 0.022, 0.026, 0.017, 0.021, 0.021, 0.032, 0.02, 0.019,
+ 0.022, 0.031, 0.029, 0.022, 0.035, 0.037, 0.047, 0.026, 0.025, 0.024,
+ 0.035, 0.018, 0.024, 0.022, 0.026, 0.017, 0.021, 0.021, 0.032, 0.02,
+ 0.019, 0.022, 0.031
+ ])
+
+dataset_info = dict(
+ dataset_name='goliath',
+ paper_info=dict(
+ author='',
+ year='',
+ homepage='',
+ ),
+ min_visible_keypoints=8,
+ image_height=4096,
+ image_width=2668,
+ original_keypoint_info={
+ 0: 'nose',
+ 1: 'left_eye',
+ 2: 'right_eye',
+ 3: 'left_ear',
+ 4: 'right_ear',
+ 5: 'left_shoulder',
+ 6: 'right_shoulder',
+ 7: 'left_elbow',
+ 8: 'right_elbow',
+ 9: 'left_hip',
+ 10: 'right_hip',
+ 11: 'left_knee',
+ 12: 'right_knee',
+ 13: 'left_ankle',
+ 14: 'right_ankle',
+ 15: 'left_big_toe_tip',
+ 16: 'left_small_toe_tip',
+ 17: 'left_heel',
+ 18: 'right_big_toe_tip',
+ 19: 'right_small_toe_tip',
+ 20: 'right_heel',
+ 21: 'right_thumb_tip',
+ 22: 'right_thumb_first_joint',
+ 23: 'right_thumb_second_joint',
+ 24: 'right_thumb_third_joint',
+ 25: 'right_index_tip',
+ 26: 'right_index_first_joint',
+ 27: 'right_index_second_joint',
+ 28: 'right_index_third_joint',
+ 29: 'right_middle_tip',
+ 30: 'right_middle_first_joint',
+ 31: 'right_middle_second_joint',
+ 32: 'right_middle_third_joint',
+ 33: 'right_ring_tip',
+ 34: 'right_ring_first_joint',
+ 35: 'right_ring_second_joint',
+ 36: 'right_ring_third_joint',
+ 37: 'right_pinky_tip',
+ 38: 'right_pinky_first_joint',
+ 39: 'right_pinky_second_joint',
+ 40: 'right_pinky_third_joint',
+ 41: 'right_wrist',
+ 42: 'left_thumb_tip',
+ 43: 'left_thumb_first_joint',
+ 44: 'left_thumb_second_joint',
+ 45: 'left_thumb_third_joint',
+ 46: 'left_index_tip',
+ 47: 'left_index_first_joint',
+ 48: 'left_index_second_joint',
+ 49: 'left_index_third_joint',
+ 50: 'left_middle_tip',
+ 51: 'left_middle_first_joint',
+ 52: 'left_middle_second_joint',
+ 53: 'left_middle_third_joint',
+ 54: 'left_ring_tip',
+ 55: 'left_ring_first_joint',
+ 56: 'left_ring_second_joint',
+ 57: 'left_ring_third_joint',
+ 58: 'left_pinky_tip',
+ 59: 'left_pinky_first_joint',
+ 60: 'left_pinky_second_joint',
+ 61: 'left_pinky_third_joint',
+ 62: 'left_wrist',
+ 63: 'left_olecranon',
+ 64: 'right_olecranon',
+ 65: 'left_cubital_fossa',
+ 66: 'right_cubital_fossa',
+ 67: 'left_acromion',
+ 68: 'right_acromion',
+ 69: 'neck',
+ 70: 'center_of_glabella',
+ 71: 'center_of_nose_root',
+ 72: 'tip_of_nose_bridge',
+ 73: 'midpoint_1_of_nose_bridge',
+ 74: 'midpoint_2_of_nose_bridge',
+ 75: 'midpoint_3_of_nose_bridge',
+ 76: 'center_of_labiomental_groove',
+ 77: 'tip_of_chin',
+ 78: 'upper_startpoint_of_r_eyebrow',
+ 79: 'lower_startpoint_of_r_eyebrow',
+ 80: 'end_of_r_eyebrow',
+ 81: 'upper_midpoint_1_of_r_eyebrow',
+ 82: 'lower_midpoint_1_of_r_eyebrow',
+ 83: 'upper_midpoint_2_of_r_eyebrow',
+ 84: 'upper_midpoint_3_of_r_eyebrow',
+ 85: 'lower_midpoint_2_of_r_eyebrow',
+ 86: 'lower_midpoint_3_of_r_eyebrow',
+ 87: 'upper_startpoint_of_l_eyebrow',
+ 88: 'lower_startpoint_of_l_eyebrow',
+ 89: 'end_of_l_eyebrow',
+ 90: 'upper_midpoint_1_of_l_eyebrow',
+ 91: 'lower_midpoint_1_of_l_eyebrow',
+ 92: 'upper_midpoint_2_of_l_eyebrow',
+ 93: 'upper_midpoint_3_of_l_eyebrow',
+ 94: 'lower_midpoint_2_of_l_eyebrow',
+ 95: 'lower_midpoint_3_of_l_eyebrow',
+ 96: 'l_inner_end_of_upper_lash_line',
+ 97: 'l_outer_end_of_upper_lash_line',
+ 98: 'l_centerpoint_of_upper_lash_line',
+ 99: 'l_midpoint_2_of_upper_lash_line',
+ 100: 'l_midpoint_1_of_upper_lash_line',
+ 101: 'l_midpoint_6_of_upper_lash_line',
+ 102: 'l_midpoint_5_of_upper_lash_line',
+ 103: 'l_midpoint_4_of_upper_lash_line',
+ 104: 'l_midpoint_3_of_upper_lash_line',
+ 105: 'l_outer_end_of_upper_eyelid_line',
+ 106: 'l_midpoint_6_of_upper_eyelid_line',
+ 107: 'l_midpoint_2_of_upper_eyelid_line',
+ 108: 'l_midpoint_5_of_upper_eyelid_line',
+ 109: 'l_centerpoint_of_upper_eyelid_line',
+ 110: 'l_midpoint_4_of_upper_eyelid_line',
+ 111: 'l_midpoint_1_of_upper_eyelid_line',
+ 112: 'l_midpoint_3_of_upper_eyelid_line',
+ 113: 'l_midpoint_6_of_upper_crease_line',
+ 114: 'l_midpoint_2_of_upper_crease_line',
+ 115: 'l_midpoint_5_of_upper_crease_line',
+ 116: 'l_centerpoint_of_upper_crease_line',
+ 117: 'l_midpoint_4_of_upper_crease_line',
+ 118: 'l_midpoint_1_of_upper_crease_line',
+ 119: 'l_midpoint_3_of_upper_crease_line',
+ 120: 'r_inner_end_of_upper_lash_line',
+ 121: 'r_outer_end_of_upper_lash_line',
+ 122: 'r_centerpoint_of_upper_lash_line',
+ 123: 'r_midpoint_1_of_upper_lash_line',
+ 124: 'r_midpoint_2_of_upper_lash_line',
+ 125: 'r_midpoint_3_of_upper_lash_line',
+ 126: 'r_midpoint_4_of_upper_lash_line',
+ 127: 'r_midpoint_5_of_upper_lash_line',
+ 128: 'r_midpoint_6_of_upper_lash_line',
+ 129: 'r_outer_end_of_upper_eyelid_line',
+ 130: 'r_midpoint_3_of_upper_eyelid_line',
+ 131: 'r_midpoint_1_of_upper_eyelid_line',
+ 132: 'r_midpoint_4_of_upper_eyelid_line',
+ 133: 'r_centerpoint_of_upper_eyelid_line',
+ 134: 'r_midpoint_5_of_upper_eyelid_line',
+ 135: 'r_midpoint_2_of_upper_eyelid_line',
+ 136: 'r_midpoint_6_of_upper_eyelid_line',
+ 137: 'r_midpoint_3_of_upper_crease_line',
+ 138: 'r_midpoint_1_of_upper_crease_line',
+ 139: 'r_midpoint_4_of_upper_crease_line',
+ 140: 'r_centerpoint_of_upper_crease_line',
+ 141: 'r_midpoint_5_of_upper_crease_line',
+ 142: 'r_midpoint_2_of_upper_crease_line',
+ 143: 'r_midpoint_6_of_upper_crease_line',
+ 144: 'l_inner_end_of_lower_lash_line',
+ 145: 'l_outer_end_of_lower_lash_line',
+ 146: 'l_centerpoint_of_lower_lash_line',
+ 147: 'l_midpoint_2_of_lower_lash_line',
+ 148: 'l_midpoint_1_of_lower_lash_line',
+ 149: 'l_midpoint_6_of_lower_lash_line',
+ 150: 'l_midpoint_5_of_lower_lash_line',
+ 151: 'l_midpoint_4_of_lower_lash_line',
+ 152: 'l_midpoint_3_of_lower_lash_line',
+ 153: 'l_outer_end_of_lower_eyelid_line',
+ 154: 'l_midpoint_6_of_lower_eyelid_line',
+ 155: 'l_midpoint_2_of_lower_eyelid_line',
+ 156: 'l_midpoint_5_of_lower_eyelid_line',
+ 157: 'l_centerpoint_of_lower_eyelid_line',
+ 158: 'l_midpoint_4_of_lower_eyelid_line',
+ 159: 'l_midpoint_1_of_lower_eyelid_line',
+ 160: 'l_midpoint_3_of_lower_eyelid_line',
+ 161: 'r_inner_end_of_lower_lash_line',
+ 162: 'r_outer_end_of_lower_lash_line',
+ 163: 'r_centerpoint_of_lower_lash_line',
+ 164: 'r_midpoint_1_of_lower_lash_line',
+ 165: 'r_midpoint_2_of_lower_lash_line',
+ 166: 'r_midpoint_3_of_lower_lash_line',
+ 167: 'r_midpoint_4_of_lower_lash_line',
+ 168: 'r_midpoint_5_of_lower_lash_line',
+ 169: 'r_midpoint_6_of_lower_lash_line',
+ 170: 'r_outer_end_of_lower_eyelid_line',
+ 171: 'r_midpoint_3_of_lower_eyelid_line',
+ 172: 'r_midpoint_1_of_lower_eyelid_line',
+ 173: 'r_midpoint_4_of_lower_eyelid_line',
+ 174: 'r_centerpoint_of_lower_eyelid_line',
+ 175: 'r_midpoint_5_of_lower_eyelid_line',
+ 176: 'r_midpoint_2_of_lower_eyelid_line',
+ 177: 'r_midpoint_6_of_lower_eyelid_line',
+ 178: 'tip_of_nose',
+ 179: 'bottom_center_of_nose',
+ 180: 'r_outer_corner_of_nose',
+ 181: 'l_outer_corner_of_nose',
+ 182: 'inner_corner_of_r_nostril',
+ 183: 'outer_corner_of_r_nostril',
+ 184: 'upper_corner_of_r_nostril',
+ 185: 'inner_corner_of_l_nostril',
+ 186: 'outer_corner_of_l_nostril',
+ 187: 'upper_corner_of_l_nostril',
+ 188: 'r_outer_corner_of_mouth',
+ 189: 'l_outer_corner_of_mouth',
+ 190: 'center_of_cupid_bow',
+ 191: 'center_of_lower_outer_lip',
+ 192: 'midpoint_1_of_upper_outer_lip',
+ 193: 'midpoint_2_of_upper_outer_lip',
+ 194: 'midpoint_1_of_lower_outer_lip',
+ 195: 'midpoint_2_of_lower_outer_lip',
+ 196: 'midpoint_3_of_upper_outer_lip',
+ 197: 'midpoint_4_of_upper_outer_lip',
+ 198: 'midpoint_5_of_upper_outer_lip',
+ 199: 'midpoint_6_of_upper_outer_lip',
+ 200: 'midpoint_3_of_lower_outer_lip',
+ 201: 'midpoint_4_of_lower_outer_lip',
+ 202: 'midpoint_5_of_lower_outer_lip',
+ 203: 'midpoint_6_of_lower_outer_lip',
+ 204: 'r_inner_corner_of_mouth',
+ 205: 'l_inner_corner_of_mouth',
+ 206: 'center_of_upper_inner_lip',
+ 207: 'center_of_lower_inner_lip',
+ 208: 'midpoint_1_of_upper_inner_lip',
+ 209: 'midpoint_2_of_upper_inner_lip',
+ 210: 'midpoint_1_of_lower_inner_lip',
+ 211: 'midpoint_2_of_lower_inner_lip',
+ 212: 'midpoint_3_of_upper_inner_lip',
+ 213: 'midpoint_4_of_upper_inner_lip',
+ 214: 'midpoint_5_of_upper_inner_lip',
+ 215: 'midpoint_6_of_upper_inner_lip',
+ 216: 'midpoint_3_of_lower_inner_lip',
+ 217: 'midpoint_4_of_lower_inner_lip',
+ 218: 'midpoint_5_of_lower_inner_lip',
+ 219: 'midpoint_6_of_lower_inner_lip',
+ 220: 'teeth',
+ 221: 'teeth',
+ 222: 'teeth',
+ 223: 'teeth',
+ 224: 'teeth',
+ 225: 'teeth',
+ 226: 'teeth',
+ 227: 'teeth',
+ 228: 'teeth',
+ 229: 'teeth',
+ 230: 'teeth',
+ 231: 'teeth',
+ 232: 'teeth',
+ 233: 'teeth',
+ 234: 'teeth',
+ 235: 'teeth',
+ 236: 'teeth',
+ 237: 'teeth',
+ 238: 'teeth',
+ 239: 'teeth',
+ 240: 'teeth',
+ 241: 'teeth',
+ 242: 'teeth',
+ 243: 'teeth',
+ 244: 'teeth',
+ 245: 'teeth',
+ 246: 'teeth',
+ 247: 'teeth',
+ 248: 'teeth',
+ 249: 'teeth',
+ 250: 'teeth',
+ 251: 'teeth',
+ 252: 'teeth',
+ 253: 'teeth',
+ 254: 'teeth',
+ 255: 'teeth',
+ 256: 'l_top_end_of_inferior_crus',
+ 257: 'l_top_end_of_superior_crus',
+ 258: 'l_start_of_antihelix',
+ 259: 'l_end_of_antihelix',
+ 260: 'l_midpoint_1_of_antihelix',
+ 261: 'l_midpoint_1_of_inferior_crus',
+ 262: 'l_midpoint_2_of_antihelix',
+ 263: 'l_midpoint_3_of_antihelix',
+ 264: 'l_point_1_of_inner_helix',
+ 265: 'l_point_2_of_inner_helix',
+ 266: 'l_point_3_of_inner_helix',
+ 267: 'l_point_4_of_inner_helix',
+ 268: 'l_point_5_of_inner_helix',
+ 269: 'l_point_6_of_inner_helix',
+ 270: 'l_point_7_of_inner_helix',
+ 271: 'l_highest_point_of_antitragus',
+ 272: 'l_bottom_point_of_tragus',
+ 273: 'l_protruding_point_of_tragus',
+ 274: 'l_top_point_of_tragus',
+ 275: 'l_start_point_of_crus_of_helix',
+ 276: 'l_deepest_point_of_concha',
+ 277: 'l_tip_of_ear_lobe',
+ 278: 'l_midpoint_between_22_15',
+ 279: 'l_bottom_connecting_point_of_ear_lobe',
+ 280: 'l_top_connecting_point_of_helix',
+ 281: 'l_point_8_of_inner_helix',
+ 282: 'r_top_end_of_inferior_crus',
+ 283: 'r_top_end_of_superior_crus',
+ 284: 'r_start_of_antihelix',
+ 285: 'r_end_of_antihelix',
+ 286: 'r_midpoint_1_of_antihelix',
+ 287: 'r_midpoint_1_of_inferior_crus',
+ 288: 'r_midpoint_2_of_antihelix',
+ 289: 'r_midpoint_3_of_antihelix',
+ 290: 'r_point_1_of_inner_helix',
+ 291: 'r_point_8_of_inner_helix',
+ 292: 'r_point_3_of_inner_helix',
+ 293: 'r_point_4_of_inner_helix',
+ 294: 'r_point_5_of_inner_helix',
+ 295: 'r_point_6_of_inner_helix',
+ 296: 'r_point_7_of_inner_helix',
+ 297: 'r_highest_point_of_antitragus',
+ 298: 'r_bottom_point_of_tragus',
+ 299: 'r_protruding_point_of_tragus',
+ 300: 'r_top_point_of_tragus',
+ 301: 'r_start_point_of_crus_of_helix',
+ 302: 'r_deepest_point_of_concha',
+ 303: 'r_tip_of_ear_lobe',
+ 304: 'r_midpoint_between_22_15',
+ 305: 'r_bottom_connecting_point_of_ear_lobe',
+ 306: 'r_top_connecting_point_of_helix',
+ 307: 'r_point_2_of_inner_helix',
+ 308: 'l_center_of_iris',
+ 309: 'l_border_of_iris_3',
+ 310: 'l_border_of_iris_midpoint_1',
+ 311: 'l_border_of_iris_12',
+ 312: 'l_border_of_iris_midpoint_4',
+ 313: 'l_border_of_iris_9',
+ 314: 'l_border_of_iris_midpoint_3',
+ 315: 'l_border_of_iris_6',
+ 316: 'l_border_of_iris_midpoint_2',
+ 317: 'r_center_of_iris',
+ 318: 'r_border_of_iris_3',
+ 319: 'r_border_of_iris_midpoint_1',
+ 320: 'r_border_of_iris_12',
+ 321: 'r_border_of_iris_midpoint_4',
+ 322: 'r_border_of_iris_9',
+ 323: 'r_border_of_iris_midpoint_3',
+ 324: 'r_border_of_iris_6',
+ 325: 'r_border_of_iris_midpoint_2',
+ 326: 'l_center_of_pupil',
+ 327: 'l_border_of_pupil_3',
+ 328: 'l_border_of_pupil_midpoint_1',
+ 329: 'l_border_of_pupil_12',
+ 330: 'l_border_of_pupil_midpoint_4',
+ 331: 'l_border_of_pupil_9',
+ 332: 'l_border_of_pupil_midpoint_3',
+ 333: 'l_border_of_pupil_6',
+ 334: 'l_border_of_pupil_midpoint_2',
+ 335: 'r_center_of_pupil',
+ 336: 'r_border_of_pupil_3',
+ 337: 'r_border_of_pupil_midpoint_1',
+ 338: 'r_border_of_pupil_12',
+ 339: 'r_border_of_pupil_midpoint_4',
+ 340: 'r_border_of_pupil_9',
+ 341: 'r_border_of_pupil_midpoint_3',
+ 342: 'r_border_of_pupil_6',
+ 343: 'r_border_of_pupil_midpoint_2',
+ },
+ keypoint_info={
+ 0: dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1: dict(name='left_eye', id=1, color=[51, 153, 255], type='upper', swap='right_eye'),
+ 2: dict(name='right_eye', id=2, color=[51, 153, 255], type='upper', swap='left_eye'),
+ 3: dict(name='left_ear', id=3, color=[51, 153, 255], type='upper', swap='right_ear'),
+ 4: dict(name='right_ear', id=4, color=[51, 153, 255], type='upper', swap='left_ear'),
+ 5: dict(name='left_shoulder', id=5, color=[51, 153, 255], type='upper', swap='right_shoulder'),
+ 6: dict(name='right_shoulder', id=6, color=[51, 153, 255], type='upper', swap='left_shoulder'),
+ 7: dict(name='left_elbow', id=7, color=[51, 153, 255], type='upper', swap='right_elbow'),
+ 8: dict(name='right_elbow', id=8, color=[51, 153, 255], type='upper', swap='left_elbow'),
+ 9: dict(name='left_hip', id=9, color=[51, 153, 255], type='lower', swap='right_hip'),
+ 10: dict(name='right_hip', id=10, color=[51, 153, 255], type='lower', swap='left_hip'),
+ 11: dict(name='left_knee', id=11, color=[51, 153, 255], type='lower', swap='right_knee'),
+ 12: dict(name='right_knee', id=12, color=[51, 153, 255], type='lower', swap='left_knee'),
+ 13: dict(name='left_ankle', id=13, color=[51, 153, 255], type='lower', swap='right_ankle'),
+ 14: dict(name='right_ankle', id=14, color=[51, 153, 255], type='lower', swap='left_ankle'),
+
+ 15: dict(name='left_big_toe', id=15, color=[51, 153, 255], type='lower', swap='right_big_toe'),
+ 16: dict(name='left_small_toe', id=16, color=[51, 153, 255], type='lower', swap='right_small_toe'),
+ 17: dict(name='left_heel', id=17, color=[51, 153, 255], type='lower', swap='right_heel'),
+ 18: dict(name='right_big_toe', id=18, color=[51, 153, 255], type='lower', swap='left_big_toe'),
+ 19: dict(name='right_small_toe', id=19, color=[51, 153, 255], type='lower', swap='left_small_toe'),
+ 20: dict(name='right_heel', id=20, color=[51, 153, 255], type='lower', swap='left_heel'),
+
+ 21: dict(name='right_thumb4', id=21, color=[51, 153, 255], type='upper', swap='left_thumb4'),
+ 22: dict(name='right_thumb3', id=22, color=[51, 153, 255], type='upper', swap='left_thumb3'),
+ 23: dict(name='right_thumb2', id=23, color=[51, 153, 255], type='upper', swap='left_thumb2'),
+ 24: dict(name='right_thumb_third_joint', id=24, color=[51, 153, 255], type='upper', swap='left_thumb_third_joint'),
+
+ 25: dict(name='right_forefinger4', id=25, color=[51, 153, 255], type='upper', swap='left_forefinger4'),
+ 26: dict(name='right_forefinger3', id=26, color=[51, 153, 255], type='upper', swap='left_forefinger3'),
+ 27: dict(name='right_forefinger2', id=27, color=[51, 153, 255], type='upper', swap='left_forefinger2'),
+ 28: dict(name='right_forefinger_third_joint', id=28, color=[51, 153, 255], type='upper', swap='left_forefinger_third_joint'),
+
+ 29: dict(name='right_middle_finger4', id=29, color=[51, 153, 255], type='upper', swap='left_middle_finger4'),
+ 30: dict(name='right_middle_finger3', id=30, color=[51, 153, 255], type='upper', swap='left_middle_finger3'),
+ 31: dict(name='right_middle_finger2', id=31, color=[51, 153, 255], type='upper', swap='left_middle_finger2'),
+ 32: dict(name='right_middle_finger_third_joint', id=32, color=[51, 153, 255], type='upper', swap='left_middle_finger_third_joint'),
+
+ 33: dict(name='right_ring_finger4', id=33, color=[51, 153, 255], type='upper', swap='left_ring_finger4'),
+ 34: dict(name='right_ring_finger3', id=34, color=[51, 153, 255], type='upper', swap='left_ring_finger3'),
+ 35: dict(name='right_ring_finger2', id=35, color=[51, 153, 255], type='upper', swap='left_ring_finger2'),
+ 36: dict(name='right_ring_finger_third_joint', id=36, color=[51, 153, 255], type='upper', swap='left_ring_finger_third_joint'),
+
+ 37: dict(name='right_pinky_finger4', id=37, color=[51, 153, 255], type='upper', swap='left_pinky_finger4'),
+ 38: dict(name='right_pinky_finger3', id=38, color=[51, 153, 255], type='upper', swap='left_pinky_finger3'),
+ 39: dict(name='right_pinky_finger2', id=39, color=[51, 153, 255], type='upper', swap='left_pinky_finger2'),
+ 40: dict(name='right_pinky_finger_third_joint', id=40, color=[51, 153, 255], type='upper', swap='left_pinky_finger_third_joint'),
+
+ 41: dict(name='right_wrist', id=41, color=[51, 153, 255], type='upper', swap='left_wrist'),
+
+ 42: dict(name='left_thumb4', id=42, color=[51, 153, 255], type='upper', swap='right_thumb4'),
+ 43: dict(name='left_thumb3', id=43, color=[51, 153, 255], type='upper', swap='right_thumb3'),
+ 44: dict(name='left_thumb2', id=44, color=[51, 153, 255], type='upper', swap='right_thumb2'),
+ 45: dict(name='left_thumb_third_joint', id=45, color=[51, 153, 255], type='upper', swap='right_thumb_third_joint'), ## doesnt match with wholebody
+
+ 46: dict(name='left_forefinger4', id=46, color=[51, 153, 255], type='upper', swap='right_forefinger4'),
+ 47: dict(name='left_forefinger3', id=47, color=[51, 153, 255], type='upper', swap='right_forefinger3'),
+ 48: dict(name='left_forefinger2', id=48, color=[51, 153, 255], type='upper', swap='right_forefinger2'),
+ 49: dict(name='left_forefinger_third_joint', id=49, color=[51, 153, 255], type='upper', swap='right_forefinger_third_joint'),
+
+ 50: dict(name='left_middle_finger4', id=50, color=[51, 153, 255], type='upper', swap='right_middle_finger4'),
+ 51: dict(name='left_middle_finger3', id=51, color=[51, 153, 255], type='upper', swap='right_middle_finger3'),
+ 52: dict(name='left_middle_finger2', id=52, color=[51, 153, 255], type='upper', swap='right_middle_finger2'),
+ 53: dict(name='left_middle_finger_third_joint', id=53, color=[51, 153, 255], type='upper', swap='right_middle_finger_third_joint'),
+
+ 54: dict(name='left_ring_finger4', id=54, color=[51, 153, 255], type='upper', swap='right_ring_finger4'),
+ 55: dict(name='left_ring_finger3', id=55, color=[51, 153, 255], type='upper', swap='right_ring_finger3'),
+ 56: dict(name='left_ring_finger2', id=56, color=[51, 153, 255], type='upper', swap='right_ring_finger2'),
+ 57: dict(name='left_ring_finger_third_joint', id=57, color=[51, 153, 255], type='upper', swap='right_ring_finger_third_joint'),
+
+ 58: dict(name='left_pinky_finger4', id=58, color=[51, 153, 255], type='upper', swap='right_pinky_finger4'),
+ 59: dict(name='left_pinky_finger3', id=59, color=[51, 153, 255], type='upper', swap='right_pinky_finger3'),
+ 60: dict(name='left_pinky_finger2', id=60, color=[51, 153, 255], type='upper', swap='right_pinky_finger2'),
+ 61: dict(name='left_pinky_finger_third_joint', id=61, color=[51, 153, 255], type='upper', swap='right_pinky_finger_third_joint'),
+
+ 62: dict(name='left_wrist', id=62, color=[51, 153, 255], type='upper', swap='right_wrist'),
+
+ 63: dict(name='left_olecranon', id=63, color=[51, 153, 255], type='', swap='right_olecranon'),
+ 64: dict(name='right_olecranon', id=64, color=[51, 153, 255], type='', swap='left_olecranon'),
+ 65: dict(name='left_cubital_fossa', id=65, color=[51, 153, 255], type='', swap='right_cubital_fossa'),
+ 66: dict(name='right_cubital_fossa', id=66, color=[51, 153, 255], type='', swap='left_cubital_fossa'),
+ 67: dict(name='left_acromion', id=67, color=[51, 153, 255], type='', swap='right_acromion'),
+ 68: dict(name='right_acromion', id=68, color=[51, 153, 255], type='', swap='left_acromion'),
+ 69: dict(name='neck', id=69, color=[51, 153, 255], type='', swap=''),
+
+ 70: dict(name='center_of_glabella', id=70, color=[255, 255, 255], type='', swap=''),
+ 71: dict(name='center_of_nose_root', id=71, color=[255, 255, 255], type='', swap=''),
+ 72: dict(name='tip_of_nose_bridge', id=72, color=[255, 255, 255], type='', swap=''),
+ 73: dict(name='midpoint_1_of_nose_bridge', id=73, color=[255, 255, 255], type='', swap=''),
+ 74: dict(name='midpoint_2_of_nose_bridge', id=74, color=[255, 255, 255], type='', swap=''),
+ 75: dict(name='midpoint_3_of_nose_bridge', id=75, color=[255, 255, 255], type='', swap=''),
+ 76: dict(name='center_of_labiomental_groove', id=76, color=[255, 255, 255], type='', swap=''),
+ 77: dict(name='tip_of_chin', id=77, color=[255, 255, 255], type='', swap=''),
+ 78: dict(name='upper_startpoint_of_r_eyebrow', id=78, color=[255, 255, 255], type='', swap='upper_startpoint_of_l_eyebrow'),
+ 79: dict(name='lower_startpoint_of_r_eyebrow', id=79, color=[255, 255, 255], type='', swap='lower_startpoint_of_l_eyebrow'),
+ 80: dict(name='end_of_r_eyebrow', id=80, color=[255, 255, 255], type='', swap='end_of_l_eyebrow'),
+ 81: dict(name='upper_midpoint_1_of_r_eyebrow', id=81, color=[255, 255, 255], type='', swap='upper_midpoint_1_of_l_eyebrow'),
+ 82: dict(name='lower_midpoint_1_of_r_eyebrow', id=82, color=[255, 255, 255], type='', swap='lower_midpoint_1_of_l_eyebrow'),
+ 83: dict(name='upper_midpoint_2_of_r_eyebrow', id=83, color=[255, 255, 255], type='', swap='upper_midpoint_3_of_l_eyebrow'),
+ 84: dict(name='upper_midpoint_3_of_r_eyebrow', id=84, color=[255, 255, 255], type='', swap='upper_midpoint_2_of_l_eyebrow'),
+ 85: dict(name='lower_midpoint_2_of_r_eyebrow', id=85, color=[255, 255, 255], type='', swap='lower_midpoint_3_of_l_eyebrow'),
+ 86: dict(name='lower_midpoint_3_of_r_eyebrow', id=86, color=[255, 255, 255], type='', swap='lower_midpoint_2_of_l_eyebrow'),
+ 87: dict(name='upper_startpoint_of_l_eyebrow', id=87, color=[255, 255, 255], type='', swap='upper_startpoint_of_r_eyebrow'),
+ 88: dict(name='lower_startpoint_of_l_eyebrow', id=88, color=[255, 255, 255], type='', swap='lower_startpoint_of_r_eyebrow'),
+ 89: dict(name='end_of_l_eyebrow', id=89, color=[255, 255, 255], type='', swap='end_of_r_eyebrow'),
+ 90: dict(name='upper_midpoint_1_of_l_eyebrow', id=90, color=[255, 255, 255], type='', swap='upper_midpoint_1_of_r_eyebrow'),
+ 91: dict(name='lower_midpoint_1_of_l_eyebrow', id=91, color=[255, 255, 255], type='', swap='lower_midpoint_1_of_r_eyebrow'),
+ 92: dict(name='upper_midpoint_2_of_l_eyebrow', id=92, color=[255, 255, 255], type='', swap='upper_midpoint_3_of_r_eyebrow'),
+ 93: dict(name='upper_midpoint_3_of_l_eyebrow', id=93, color=[255, 255, 255], type='', swap='upper_midpoint_2_of_r_eyebrow'),
+ 94: dict(name='lower_midpoint_2_of_l_eyebrow', id=94, color=[255, 255, 255], type='', swap='lower_midpoint_3_of_r_eyebrow'),
+ 95: dict(name='lower_midpoint_3_of_l_eyebrow', id=95, color=[255, 255, 255], type='', swap='lower_midpoint_2_of_r_eyebrow'),
+
+ 96: dict(name='l_inner_end_of_upper_lash_line', id=96, color=[192, 64, 128], type='', swap='r_inner_end_of_upper_lash_line'),
+ 97: dict(name='l_outer_end_of_upper_lash_line', id=97, color=[192, 64, 128], type='', swap='r_outer_end_of_upper_lash_line'),
+ 98: dict(name='l_centerpoint_of_upper_lash_line', id=98, color=[192, 64, 128], type='', swap='r_centerpoint_of_upper_lash_line'),
+ 99: dict(name='l_midpoint_2_of_upper_lash_line', id=99, color=[192, 64, 128], type='', swap='r_midpoint_1_of_upper_lash_line'),
+ 100: dict(name='l_midpoint_1_of_upper_lash_line', id=100, color=[192, 64, 128], type='', swap='r_midpoint_2_of_upper_lash_line'),
+ 101: dict(name='l_midpoint_6_of_upper_lash_line', id=101, color=[192, 64, 128], type='', swap='r_midpoint_3_of_upper_lash_line'),
+ 102: dict(name='l_midpoint_5_of_upper_lash_line', id=102, color=[192, 64, 128], type='', swap='r_midpoint_4_of_upper_lash_line'),
+ 103: dict(name='l_midpoint_4_of_upper_lash_line', id=103, color=[192, 64, 128], type='', swap='r_midpoint_5_of_upper_lash_line'),
+ 104: dict(name='l_midpoint_3_of_upper_lash_line', id=104, color=[192, 64, 128], type='', swap='r_midpoint_6_of_upper_lash_line'),
+
+ 105: dict(name='l_outer_end_of_upper_eyelid_line', id=105, color=[192, 64, 128], type='', swap='r_outer_end_of_upper_eyelid_line'),
+ 106: dict(name='l_midpoint_6_of_upper_eyelid_line', id=106, color=[192, 64, 128], type='', swap='r_midpoint_3_of_upper_eyelid_line'),
+ 107: dict(name='l_midpoint_2_of_upper_eyelid_line', id=107, color=[192, 64, 128], type='', swap='r_midpoint_1_of_upper_eyelid_line'),
+ 108: dict(name='l_midpoint_5_of_upper_eyelid_line', id=108, color=[192, 64, 128], type='', swap='r_midpoint_4_of_upper_eyelid_line'),
+ 109: dict(name='l_centerpoint_of_upper_eyelid_line', id=109, color=[192, 64, 128], type='', swap='r_centerpoint_of_upper_eyelid_line'),
+ 110: dict(name='l_midpoint_4_of_upper_eyelid_line', id=110, color=[192, 64, 128], type='', swap='r_midpoint_5_of_upper_eyelid_line'),
+ 111: dict(name='l_midpoint_1_of_upper_eyelid_line', id=111, color=[192, 64, 128], type='', swap='r_midpoint_2_of_upper_eyelid_line'),
+ 112: dict(name='l_midpoint_3_of_upper_eyelid_line', id=112, color=[192, 64, 128], type='', swap='r_midpoint_6_of_upper_eyelid_line'),
+ 113: dict(name='l_midpoint_6_of_upper_crease_line', id=113, color=[192, 64, 128], type='', swap='r_midpoint_3_of_upper_crease_line'),
+
+ 114: dict(name='l_midpoint_2_of_upper_crease_line', id=114, color=[192, 64, 128], type='', swap='r_midpoint_1_of_upper_crease_line'),
+ 115: dict(name='l_midpoint_5_of_upper_crease_line', id=115, color=[192, 64, 128], type='', swap='r_midpoint_4_of_upper_crease_line'),
+ 116: dict(name='l_centerpoint_of_upper_crease_line', id=116, color=[192, 64, 128], type='', swap='r_centerpoint_of_upper_crease_line'),
+ 117: dict(name='l_midpoint_4_of_upper_crease_line', id=117, color=[192, 64, 128], type='', swap='r_midpoint_5_of_upper_crease_line'),
+ 118: dict(name='l_midpoint_1_of_upper_crease_line', id=118, color=[192, 64, 128], type='', swap='r_midpoint_2_of_upper_crease_line'),
+ 119: dict(name='l_midpoint_3_of_upper_crease_line', id=119, color=[192, 64, 128], type='', swap='r_midpoint_6_of_upper_crease_line'),
+
+ 120: dict(name='r_inner_end_of_upper_lash_line', id=120, color=[64, 32, 192], type='', swap='l_inner_end_of_upper_lash_line'),
+ 121: dict(name='r_outer_end_of_upper_lash_line', id=121, color=[64, 32, 192], type='', swap='l_outer_end_of_upper_lash_line'),
+ 122: dict(name='r_centerpoint_of_upper_lash_line', id=122, color=[64, 32, 192], type='', swap='l_centerpoint_of_upper_lash_line'),
+ 123: dict(name='r_midpoint_1_of_upper_lash_line', id=123, color=[64, 32, 192], type='', swap='l_midpoint_2_of_upper_lash_line'),
+ 124: dict(name='r_midpoint_2_of_upper_lash_line', id=124, color=[64, 32, 192], type='', swap='l_midpoint_1_of_upper_lash_line'),
+ 125: dict(name='r_midpoint_3_of_upper_lash_line', id=125, color=[64, 32, 192], type='', swap='l_midpoint_6_of_upper_lash_line'),
+ 126: dict(name='r_midpoint_4_of_upper_lash_line', id=126, color=[64, 32, 192], type='', swap='l_midpoint_5_of_upper_lash_line'),
+ 127: dict(name='r_midpoint_5_of_upper_lash_line', id=127, color=[64, 32, 192], type='', swap='l_midpoint_4_of_upper_lash_line'),
+
+ 128: dict(name='r_midpoint_6_of_upper_lash_line', id=128, color=[64, 32, 192], type='', swap='l_midpoint_3_of_upper_lash_line'),
+ 129: dict(name='r_outer_end_of_upper_eyelid_line', id=129, color=[64, 32, 192], type='', swap='l_outer_end_of_upper_eyelid_line'),
+ 130: dict(name='r_midpoint_3_of_upper_eyelid_line', id=130, color=[64, 32, 192], type='', swap='l_midpoint_6_of_upper_eyelid_line'),
+ 131: dict(name='r_midpoint_1_of_upper_eyelid_line', id=131, color=[64, 32, 192], type='', swap='l_midpoint_2_of_upper_eyelid_line'),
+ 132: dict(name='r_midpoint_4_of_upper_eyelid_line', id=132, color=[64, 32, 192], type='', swap='l_midpoint_5_of_upper_eyelid_line'),
+ 133: dict(name='r_centerpoint_of_upper_eyelid_line', id=133, color=[64, 32, 192], type='', swap='l_centerpoint_of_upper_eyelid_line'),
+ 134: dict(name='r_midpoint_5_of_upper_eyelid_line', id=134, color=[64, 32, 192], type='', swap='l_midpoint_4_of_upper_eyelid_line'),
+ 135: dict(name='r_midpoint_2_of_upper_eyelid_line', id=135, color=[64, 32, 192], type='', swap='l_midpoint_1_of_upper_eyelid_line'),
+
+ 136: dict(name='r_midpoint_6_of_upper_eyelid_line', id=136, color=[64, 32, 192], type='', swap='l_midpoint_3_of_upper_eyelid_line'),
+ 137: dict(name='r_midpoint_3_of_upper_crease_line', id=137, color=[64, 32, 192], type='', swap='l_midpoint_6_of_upper_crease_line'),
+ 138: dict(name='r_midpoint_1_of_upper_crease_line', id=138, color=[64, 32, 192], type='', swap='l_midpoint_2_of_upper_crease_line'),
+ 139: dict(name='r_midpoint_4_of_upper_crease_line', id=139, color=[64, 32, 192], type='', swap='l_midpoint_5_of_upper_crease_line'),
+ 140: dict(name='r_centerpoint_of_upper_crease_line', id=140, color=[64, 32, 192], type='', swap='l_centerpoint_of_upper_crease_line'),
+ 141: dict(name='r_midpoint_5_of_upper_crease_line', id=141, color=[64, 32, 192], type='', swap='l_midpoint_4_of_upper_crease_line'),
+ 142: dict(name='r_midpoint_2_of_upper_crease_line', id=142, color=[64, 32, 192], type='', swap='l_midpoint_1_of_upper_crease_line'),
+ 143: dict(name='r_midpoint_6_of_upper_crease_line', id=143, color=[64, 32, 192], type='', swap='l_midpoint_3_of_upper_crease_line'),
+
+ 144: dict(name='l_inner_end_of_lower_lash_line', id=144, color=[64, 192, 128], type='', swap='r_inner_end_of_lower_lash_line'),
+ 145: dict(name='l_outer_end_of_lower_lash_line', id=145, color=[64, 192, 128], type='', swap='r_outer_end_of_lower_lash_line'),
+ 146: dict(name='l_centerpoint_of_lower_lash_line', id=146, color=[64, 192, 128], type='', swap='r_centerpoint_of_lower_lash_line'),
+ 147: dict(name='l_midpoint_2_of_lower_lash_line', id=147, color=[64, 192, 128], type='', swap='r_midpoint_1_of_lower_lash_line'),
+ 148: dict(name='l_midpoint_1_of_lower_lash_line', id=148, color=[64, 192, 128], type='', swap='r_midpoint_2_of_lower_lash_line'),
+ 149: dict(name='l_midpoint_6_of_lower_lash_line', id=149, color=[64, 192, 128], type='', swap='r_midpoint_3_of_lower_lash_line'),
+ 150: dict(name='l_midpoint_5_of_lower_lash_line', id=150, color=[64, 192, 128], type='', swap='r_midpoint_4_of_lower_lash_line'),
+ 151: dict(name='l_midpoint_4_of_lower_lash_line', id=151, color=[64, 192, 128], type='', swap='r_midpoint_5_of_lower_lash_line'),
+ 152: dict(name='l_midpoint_3_of_lower_lash_line', id=152, color=[64, 192, 128], type='', swap='r_midpoint_6_of_lower_lash_line'),
+ 153: dict(name='l_outer_end_of_lower_eyelid_line', id=153, color=[64, 192, 128], type='', swap='r_outer_end_of_lower_eyelid_line'),
+ 154: dict(name='l_midpoint_6_of_lower_eyelid_line', id=154, color=[64, 192, 128], type='', swap='r_midpoint_3_of_lower_eyelid_line'),
+ 155: dict(name='l_midpoint_2_of_lower_eyelid_line', id=155, color=[64, 192, 128], type='', swap='r_midpoint_1_of_lower_eyelid_line'),
+ 156: dict(name='l_midpoint_5_of_lower_eyelid_line', id=156, color=[64, 192, 128], type='', swap='r_midpoint_4_of_lower_eyelid_line'),
+ 157: dict(name='l_centerpoint_of_lower_eyelid_line', id=157, color=[64, 192, 128], type='', swap='r_centerpoint_of_lower_eyelid_line'),
+ 158: dict(name='l_midpoint_4_of_lower_eyelid_line', id=158, color=[64, 192, 128], type='', swap='r_midpoint_5_of_lower_eyelid_line'),
+ 159: dict(name='l_midpoint_1_of_lower_eyelid_line', id=159, color=[64, 192, 128], type='', swap='r_midpoint_2_of_lower_eyelid_line'),
+ 160: dict(name='l_midpoint_3_of_lower_eyelid_line', id=160, color=[64, 192, 128], type='', swap='r_midpoint_6_of_lower_eyelid_line'),
+
+ 161: dict(name='r_inner_end_of_lower_lash_line', id=161, color=[64, 192, 32], type='', swap='l_inner_end_of_lower_lash_line'),
+ 162: dict(name='r_outer_end_of_lower_lash_line', id=162, color=[64, 192, 32], type='', swap='l_outer_end_of_lower_lash_line'),
+ 163: dict(name='r_centerpoint_of_lower_lash_line', id=163, color=[64, 192, 32], type='', swap='l_centerpoint_of_lower_lash_line'),
+ 164: dict(name='r_midpoint_1_of_lower_lash_line', id=164, color=[64, 192, 32], type='', swap='l_midpoint_2_of_lower_lash_line'),
+ 165: dict(name='r_midpoint_2_of_lower_lash_line', id=165, color=[64, 192, 32], type='', swap='l_midpoint_1_of_lower_lash_line'),
+ 166: dict(name='r_midpoint_3_of_lower_lash_line', id=166, color=[64, 192, 32], type='', swap='l_midpoint_6_of_lower_lash_line'),
+ 167: dict(name='r_midpoint_4_of_lower_lash_line', id=167, color=[64, 192, 32], type='', swap='l_midpoint_5_of_lower_lash_line'),
+ 168: dict(name='r_midpoint_5_of_lower_lash_line', id=168, color=[64, 192, 32], type='', swap='l_midpoint_4_of_lower_lash_line'),
+ 169: dict(name='r_midpoint_6_of_lower_lash_line', id=169, color=[64, 192, 32], type='', swap='l_midpoint_3_of_lower_lash_line'),
+ 170: dict(name='r_outer_end_of_lower_eyelid_line', id=170, color=[64, 192, 32], type='', swap='l_outer_end_of_lower_eyelid_line'),
+ 171: dict(name='r_midpoint_3_of_lower_eyelid_line', id=171, color=[64, 192, 32], type='', swap='l_midpoint_6_of_lower_eyelid_line'),
+ 172: dict(name='r_midpoint_1_of_lower_eyelid_line', id=172, color=[64, 192, 32], type='', swap='l_midpoint_2_of_lower_eyelid_line'),
+ 173: dict(name='r_midpoint_4_of_lower_eyelid_line', id=173, color=[64, 192, 32], type='', swap='l_midpoint_5_of_lower_eyelid_line'),
+ 174: dict(name='r_centerpoint_of_lower_eyelid_line', id=174, color=[64, 192, 32], type='', swap='l_centerpoint_of_lower_eyelid_line'),
+ 175: dict(name='r_midpoint_5_of_lower_eyelid_line', id=175, color=[64, 192, 32], type='', swap='l_midpoint_4_of_lower_eyelid_line'),
+ 176: dict(name='r_midpoint_2_of_lower_eyelid_line', id=176, color=[64, 192, 32], type='', swap='l_midpoint_1_of_lower_eyelid_line'),
+ 177: dict(name='r_midpoint_6_of_lower_eyelid_line', id=177, color=[64, 192, 32], type='', swap='l_midpoint_3_of_lower_eyelid_line'),
+
+ 178: dict(name='tip_of_nose', id=178, color=[0, 192, 0], type='', swap=''),
+ 179: dict(name='bottom_center_of_nose', id=179, color=[0, 192, 0], type='', swap=''),
+ 180: dict(name='r_outer_corner_of_nose', id=180, color=[0, 192, 0], type='', swap='l_outer_corner_of_nose'),
+ 181: dict(name='l_outer_corner_of_nose', id=181, color=[0, 192, 0], type='', swap='r_outer_corner_of_nose'),
+ 182: dict(name='inner_corner_of_r_nostril', id=182, color=[0, 192, 0], type='', swap='inner_corner_of_l_nostril'),
+ 183: dict(name='outer_corner_of_r_nostril', id=183, color=[0, 192, 0], type='', swap='outer_corner_of_l_nostril'),
+ 184: dict(name='upper_corner_of_r_nostril', id=184, color=[0, 192, 0], type='', swap='upper_corner_of_l_nostril'),
+ 185: dict(name='inner_corner_of_l_nostril', id=185, color=[0, 192, 0], type='', swap='inner_corner_of_r_nostril'),
+ 186: dict(name='outer_corner_of_l_nostril', id=186, color=[0, 192, 0], type='', swap='outer_corner_of_r_nostril'),
+ 187: dict(name='upper_corner_of_l_nostril', id=187, color=[0, 192, 0], type='', swap='upper_corner_of_r_nostril'),
+
+ 188: dict(name='r_outer_corner_of_mouth', id=188, color=[192, 0, 0], type='', swap='l_outer_corner_of_mouth'),
+ 189: dict(name='l_outer_corner_of_mouth', id=189, color=[192, 0, 0], type='', swap='r_outer_corner_of_mouth'),
+ 190: dict(name='center_of_cupid_bow', id=190, color=[192, 0, 0], type='', swap=''),
+ 191: dict(name='center_of_lower_outer_lip', id=191, color=[192, 0, 0], type='', swap=''),
+ 192: dict(name='midpoint_1_of_upper_outer_lip', id=192, color=[192, 0, 0], type='', swap='midpoint_2_of_upper_outer_lip'),
+ 193: dict(name='midpoint_2_of_upper_outer_lip', id=193, color=[192, 0, 0], type='', swap='midpoint_1_of_upper_outer_lip'),
+ 194: dict(name='midpoint_1_of_lower_outer_lip', id=194, color=[192, 0, 0], type='', swap='midpoint_2_of_lower_outer_lip'),
+ 195: dict(name='midpoint_2_of_lower_outer_lip', id=195, color=[192, 0, 0], type='', swap='midpoint_1_of_lower_outer_lip'),
+
+ 196: dict(name='midpoint_3_of_upper_outer_lip', id=196, color=[192, 0, 0], type='', swap='midpoint_6_of_upper_outer_lip'),
+ 197: dict(name='midpoint_4_of_upper_outer_lip', id=197, color=[192, 0, 0], type='', swap='midpoint_5_of_upper_outer_lip'),
+ 198: dict(name='midpoint_5_of_upper_outer_lip', id=198, color=[192, 0, 0], type='', swap='midpoint_4_of_upper_outer_lip'),
+ 199: dict(name='midpoint_6_of_upper_outer_lip', id=199, color=[192, 0, 0], type='', swap='midpoint_3_of_upper_outer_lip'),
+ 200: dict(name='midpoint_3_of_lower_outer_lip', id=200, color=[192, 0, 0], type='', swap='midpoint_6_of_lower_outer_lip'),
+ 201: dict(name='midpoint_4_of_lower_outer_lip', id=201, color=[192, 0, 0], type='', swap='midpoint_5_of_lower_outer_lip'),
+ 202: dict(name='midpoint_5_of_lower_outer_lip', id=202, color=[192, 0, 0], type='', swap='midpoint_4_of_lower_outer_lip'),
+ 203: dict(name='midpoint_6_of_lower_outer_lip', id=203, color=[192, 0, 0], type='', swap='midpoint_3_of_lower_outer_lip'),
+
+ 204: dict(name='r_inner_corner_of_mouth', id=204, color=[0, 192, 192], type='', swap='l_inner_corner_of_mouth'),
+ 205: dict(name='l_inner_corner_of_mouth', id=205, color=[0, 192, 192], type='', swap='r_inner_corner_of_mouth'),
+ 206: dict(name='center_of_upper_inner_lip', id=206, color=[0, 192, 192], type='', swap=''),
+ 207: dict(name='center_of_lower_inner_lip', id=207, color=[0, 192, 192], type='', swap=''),
+ 208: dict(name='midpoint_1_of_upper_inner_lip', id=208, color=[0, 192, 192], type='', swap='midpoint_2_of_upper_inner_lip'),
+ 209: dict(name='midpoint_2_of_upper_inner_lip', id=209, color=[0, 192, 192], type='', swap='midpoint_1_of_upper_inner_lip'),
+ 210: dict(name='midpoint_1_of_lower_inner_lip', id=210, color=[0, 192, 192], type='', swap='midpoint_2_of_lower_inner_lip'),
+ 211: dict(name='midpoint_2_of_lower_inner_lip', id=211, color=[0, 192, 192], type='', swap='midpoint_1_of_lower_inner_lip'),
+ 212: dict(name='midpoint_3_of_upper_inner_lip', id=212, color=[0, 192, 192], type='', swap='midpoint_6_of_upper_inner_lip'),
+ 213: dict(name='midpoint_4_of_upper_inner_lip', id=213, color=[0, 192, 192], type='', swap='midpoint_5_of_upper_inner_lip'),
+ 214: dict(name='midpoint_5_of_upper_inner_lip', id=214, color=[0, 192, 192], type='', swap='midpoint_4_of_upper_inner_lip'),
+ 215: dict(name='midpoint_6_of_upper_inner_lip', id=215, color=[0, 192, 192], type='', swap='midpoint_3_of_upper_inner_lip'),
+ 216: dict(name='midpoint_3_of_lower_inner_lip', id=216, color=[0, 192, 192], type='', swap='midpoint_6_of_lower_inner_lip'),
+ 217: dict(name='midpoint_4_of_lower_inner_lip', id=217, color=[0, 192, 192], type='', swap='midpoint_5_of_lower_inner_lip'),
+ 218: dict(name='midpoint_5_of_lower_inner_lip', id=218, color=[0, 192, 192], type='', swap='midpoint_4_of_lower_inner_lip'),
+ 219: dict(name='midpoint_6_of_lower_inner_lip', id=219, color=[0, 192, 192], type='', swap='midpoint_3_of_lower_inner_lip'),
+
+ 220: dict(name='teeth_1', id=220, color=[51, 153, 255], type='', swap=''),
+ 221: dict(name='teeth_2', id=221, color=[51, 153, 255], type='', swap=''),
+ 222: dict(name='teeth_3', id=222, color=[51, 153, 255], type='', swap=''),
+ 223: dict(name='teeth_4', id=223, color=[51, 153, 255], type='', swap=''),
+ 224: dict(name='teeth_5', id=224, color=[51, 153, 255], type='', swap=''),
+ 225: dict(name='teeth_6', id=225, color=[51, 153, 255], type='', swap=''),
+ 226: dict(name='teeth_7', id=226, color=[51, 153, 255], type='', swap=''),
+ 227: dict(name='teeth_8', id=227, color=[51, 153, 255], type='', swap=''),
+ 228: dict(name='teeth_9', id=228, color=[51, 153, 255], type='', swap=''),
+ 229: dict(name='teeth_10', id=229, color=[51, 153, 255], type='', swap=''),
+ 230: dict(name='teeth_11', id=230, color=[51, 153, 255], type='', swap=''),
+ 231: dict(name='teeth_12', id=231, color=[51, 153, 255], type='', swap=''),
+ 232: dict(name='teeth_13', id=232, color=[51, 153, 255], type='', swap=''),
+ 233: dict(name='teeth_14', id=233, color=[51, 153, 255], type='', swap=''),
+ 234: dict(name='teeth_15', id=234, color=[51, 153, 255], type='', swap=''),
+ 235: dict(name='teeth_16', id=235, color=[51, 153, 255], type='', swap=''),
+ 236: dict(name='teeth_17', id=236, color=[51, 153, 255], type='', swap=''),
+ 237: dict(name='teeth_18', id=237, color=[51, 153, 255], type='', swap=''),
+ 238: dict(name='teeth_19', id=238, color=[51, 153, 255], type='', swap=''),
+ 239: dict(name='teeth_20', id=239, color=[51, 153, 255], type='', swap=''),
+ 240: dict(name='teeth_21', id=240, color=[51, 153, 255], type='', swap=''),
+ 241: dict(name='teeth_22', id=241, color=[51, 153, 255], type='', swap=''),
+ 242: dict(name='teeth_23', id=242, color=[51, 153, 255], type='', swap=''),
+ 243: dict(name='teeth_24', id=243, color=[51, 153, 255], type='', swap=''),
+ 244: dict(name='teeth_25', id=244, color=[51, 153, 255], type='', swap=''),
+ 245: dict(name='teeth_26', id=245, color=[51, 153, 255], type='', swap=''),
+ 246: dict(name='teeth_27', id=246, color=[51, 153, 255], type='', swap=''),
+ 247: dict(name='teeth_28', id=247, color=[51, 153, 255], type='', swap=''),
+ 248: dict(name='teeth_29', id=248, color=[51, 153, 255], type='', swap=''),
+ 249: dict(name='teeth_30', id=249, color=[51, 153, 255], type='', swap=''),
+ 250: dict(name='teeth_31', id=250, color=[51, 153, 255], type='', swap=''),
+ 251: dict(name='teeth_32', id=251, color=[51, 153, 255], type='', swap=''),
+ 252: dict(name='teeth_33', id=252, color=[51, 153, 255], type='', swap=''),
+ 253: dict(name='teeth_34', id=253, color=[51, 153, 255], type='', swap=''),
+ 254: dict(name='teeth_35', id=254, color=[51, 153, 255], type='', swap=''),
+ 255: dict(name='teeth_36', id=255, color=[51, 153, 255], type='', swap=''),
+
+ 256: dict(name='l_top_end_of_inferior_crus', id=256, color=[200, 200, 0], type='', swap='r_top_end_of_inferior_crus'),
+ 257: dict(name='l_top_end_of_superior_crus', id=257, color=[200, 200, 0], type='', swap='r_top_end_of_superior_crus'),
+ 258: dict(name='l_start_of_antihelix', id=258, color=[200, 200, 0], type='', swap='r_start_of_antihelix'),
+ 259: dict(name='l_end_of_antihelix', id=259, color=[200, 200, 0], type='', swap='r_end_of_antihelix'),
+ 260: dict(name='l_midpoint_1_of_antihelix', id=260, color=[200, 200, 0], type='', swap='r_midpoint_1_of_antihelix'),
+ 261: dict(name='l_midpoint_1_of_inferior_crus', id=261, color=[200, 200, 0], type='', swap='r_midpoint_1_of_inferior_crus'),
+ 262: dict(name='l_midpoint_2_of_antihelix', id=262, color=[200, 200, 0], type='', swap='r_midpoint_2_of_antihelix'),
+ 263: dict(name='l_midpoint_3_of_antihelix', id=263, color=[200, 200, 0], type='', swap='r_midpoint_3_of_antihelix'),
+
+ 264: dict(name='l_point_1_of_inner_helix', id=264, color=[200, 200, 0], type='', swap='r_point_1_of_inner_helix'),
+ 265: dict(name='l_point_2_of_inner_helix', id=265, color=[200, 200, 0], type='', swap='r_point_8_of_inner_helix'),
+ 266: dict(name='l_point_3_of_inner_helix', id=266, color=[200, 200, 0], type='', swap='r_point_3_of_inner_helix'),
+ 267: dict(name='l_point_4_of_inner_helix', id=267, color=[200, 200, 0], type='', swap='r_point_4_of_inner_helix'),
+ 268: dict(name='l_point_5_of_inner_helix', id=268, color=[200, 200, 0], type='', swap='r_point_5_of_inner_helix'),
+ 269: dict(name='l_point_6_of_inner_helix', id=269, color=[200, 200, 0], type='', swap='r_point_6_of_inner_helix'),
+ 270: dict(name='l_point_7_of_inner_helix', id=270, color=[200, 200, 0], type='', swap='r_point_7_of_inner_helix'),
+ 271: dict(name='l_highest_point_of_antitragus', id=271, color=[200, 200, 0], type='', swap='r_highest_point_of_antitragus'),
+ 272: dict(name='l_bottom_point_of_tragus', id=272, color=[200, 200, 0], type='', swap='r_bottom_point_of_tragus'),
+ 273: dict(name='l_protruding_point_of_tragus', id=273, color=[200, 200, 0], type='', swap='r_protruding_point_of_tragus'),
+ 274: dict(name='l_top_point_of_tragus', id=274, color=[200, 200, 0], type='', swap='r_top_point_of_tragus'),
+ 275: dict(name='l_start_point_of_crus_of_helix', id=275, color=[200, 200, 0], type='', swap='r_start_point_of_crus_of_helix'),
+ 276: dict(name='l_deepest_point_of_concha', id=276, color=[200, 200, 0], type='', swap='r_deepest_point_of_concha'),
+ 277: dict(name='l_tip_of_ear_lobe', id=277, color=[200, 200, 0], type='', swap='r_tip_of_ear_lobe'),
+ 278: dict(name='l_midpoint_between_22_15', id=278, color=[200, 200, 0], type='', swap='r_midpoint_between_22_15'),
+ 279: dict(name='l_bottom_connecting_point_of_ear_lobe', id=279, color=[200, 200, 0], type='', swap='r_bottom_connecting_point_of_ear_lobe'),
+ 280: dict(name='l_top_connecting_point_of_helix', id=280, color=[200, 200, 0], type='', swap='r_top_connecting_point_of_helix'),
+ 281: dict(name='l_point_8_of_inner_helix', id=281, color=[200, 200, 0], type='', swap='r_point_2_of_inner_helix'),
+
+ 282: dict(name='r_top_end_of_inferior_crus', id=282, color=[0, 200, 200], type='', swap='l_top_end_of_inferior_crus'),
+ 283: dict(name='r_top_end_of_superior_crus', id=283, color=[0, 200, 200], type='', swap='l_top_end_of_superior_crus'),
+ 284: dict(name='r_start_of_antihelix', id=284, color=[0, 200, 200], type='', swap='l_start_of_antihelix'),
+ 285: dict(name='r_end_of_antihelix', id=285, color=[0, 200, 200], type='', swap='l_end_of_antihelix'),
+ 286: dict(name='r_midpoint_1_of_antihelix', id=286, color=[0, 200, 200], type='', swap='l_midpoint_1_of_antihelix'),
+ 287: dict(name='r_midpoint_1_of_inferior_crus', id=287, color=[0, 200, 200], type='', swap='l_midpoint_1_of_inferior_crus'),
+ 288: dict(name='r_midpoint_2_of_antihelix', id=288, color=[0, 200, 200], type='', swap='l_midpoint_2_of_antihelix'),
+ 289: dict(name='r_midpoint_3_of_antihelix', id=289, color=[0, 200, 200], type='', swap='l_midpoint_3_of_antihelix'),
+ 290: dict(name='r_point_1_of_inner_helix', id=290, color=[0, 200, 200], type='', swap='l_point_1_of_inner_helix'),
+ 291: dict(name='r_point_8_of_inner_helix', id=291, color=[0, 200, 200], type='', swap='l_point_2_of_inner_helix'),
+ 292: dict(name='r_point_3_of_inner_helix', id=292, color=[0, 200, 200], type='', swap='l_point_3_of_inner_helix'),
+ 293: dict(name='r_point_4_of_inner_helix', id=293, color=[0, 200, 200], type='', swap='l_point_4_of_inner_helix'),
+ 294: dict(name='r_point_5_of_inner_helix', id=294, color=[0, 200, 200], type='', swap='l_point_5_of_inner_helix'),
+ 295: dict(name='r_point_6_of_inner_helix', id=295, color=[0, 200, 200], type='', swap='l_point_6_of_inner_helix'),
+ 296: dict(name='r_point_7_of_inner_helix', id=296, color=[0, 200, 200], type='', swap='l_point_7_of_inner_helix'),
+
+ 297: dict(name='r_highest_point_of_antitragus', id=297, color=[0, 200, 200], type='', swap='l_highest_point_of_antitragus'),
+ 298: dict(name='r_bottom_point_of_tragus', id=298, color=[0, 200, 200], type='', swap='l_bottom_point_of_tragus'),
+ 299: dict(name='r_protruding_point_of_tragus', id=299, color=[0, 200, 200], type='', swap='l_protruding_point_of_tragus'),
+ 300: dict(name='r_top_point_of_tragus', id=300, color=[0, 200, 200], type='', swap='l_top_point_of_tragus'),
+ 301: dict(name='r_start_point_of_crus_of_helix', id=301, color=[0, 200, 200], type='', swap='l_start_point_of_crus_of_helix'),
+ 302: dict(name='r_deepest_point_of_concha', id=302, color=[0, 200, 200], type='', swap='l_deepest_point_of_concha'),
+ 303: dict(name='r_tip_of_ear_lobe', id=303, color=[0, 200, 200], type='', swap='l_tip_of_ear_lobe'),
+ 304: dict(name='r_midpoint_between_22_15', id=304, color=[0, 200, 200], type='', swap='l_midpoint_between_22_15'),
+ 305: dict(name='r_bottom_connecting_point_of_ear_lobe', id=305, color=[0, 200, 200], type='', swap='l_bottom_connecting_point_of_ear_lobe'),
+ 306: dict(name='r_top_connecting_point_of_helix', id=306, color=[0, 200, 200], type='', swap='l_top_connecting_point_of_helix'),
+ 307: dict(name='r_point_2_of_inner_helix', id=307, color=[0, 200, 200], type='', swap='l_point_8_of_inner_helix'),
+
+ 308: dict(name='l_center_of_iris', id=308, color=[128, 192, 64], type='', swap='r_center_of_iris'),
+ 309: dict(name='l_border_of_iris_3', id=309, color=[128, 192, 64], type='', swap='r_border_of_iris_9'),
+ 310: dict(name='l_border_of_iris_midpoint_1', id=310, color=[128, 192, 64], type='', swap='r_border_of_iris_midpoint_4'),
+ 311: dict(name='l_border_of_iris_12', id=311, color=[128, 192, 64], type='', swap='r_border_of_iris_12'),
+ 312: dict(name='l_border_of_iris_midpoint_4', id=312, color=[128, 192, 64], type='', swap='r_border_of_iris_midpoint_1'),
+ 313: dict(name='l_border_of_iris_9', id=313, color=[128, 192, 64], type='', swap='r_border_of_iris_3'),
+ 314: dict(name='l_border_of_iris_midpoint_3', id=314, color=[128, 192, 64], type='', swap='r_border_of_iris_midpoint_2'),
+ 315: dict(name='l_border_of_iris_6', id=315, color=[128, 192, 64], type='', swap='r_border_of_iris_6'),
+ 316: dict(name='l_border_of_iris_midpoint_2', id=316, color=[128, 192, 64], type='', swap='r_border_of_iris_midpoint_3'),
+ 317: dict(name='r_center_of_iris', id=317, color=[192, 32, 64], type='', swap='l_center_of_iris'),
+ 318: dict(name='r_border_of_iris_3', id=318, color=[192, 32, 64], type='', swap='l_border_of_iris_9'),
+ 319: dict(name='r_border_of_iris_midpoint_1', id=319, color=[192, 32, 64], type='', swap='l_border_of_iris_midpoint_4'),
+ 320: dict(name='r_border_of_iris_12', id=320, color=[192, 32, 64], type='', swap='l_border_of_iris_12'),
+ 321: dict(name='r_border_of_iris_midpoint_4', id=321, color=[192, 32, 64], type='', swap='l_border_of_iris_midpoint_1'),
+ 322: dict(name='r_border_of_iris_9', id=322, color=[192, 32, 64], type='', swap='l_border_of_iris_3'),
+ 323: dict(name='r_border_of_iris_midpoint_3', id=323, color=[192, 32, 64], type='', swap='l_border_of_iris_midpoint_2'),
+
+ 324: dict(name='r_border_of_iris_6', id=324, color=[192, 32, 64], type='', swap='l_border_of_iris_6'),
+ 325: dict(name='r_border_of_iris_midpoint_2', id=325, color=[192, 32, 64], type='', swap='l_border_of_iris_midpoint_3'),
+ 326: dict(name='l_center_of_pupil', id=326, color=[192, 128, 64], type='', swap='r_center_of_pupil'),
+ 327: dict(name='l_border_of_pupil_3', id=327, color=[192, 128, 64], type='', swap='r_border_of_pupil_9'),
+ 328: dict(name='l_border_of_pupil_midpoint_1', id=328, color=[192, 128, 64], type='', swap='r_border_of_pupil_midpoint_4'),
+ 329: dict(name='l_border_of_pupil_12', id=329, color=[192, 128, 64], type='', swap='r_border_of_pupil_12'),
+ 330: dict(name='l_border_of_pupil_midpoint_4', id=330, color=[192, 128, 64], type='', swap='r_border_of_pupil_midpoint_1'),
+ 331: dict(name='l_border_of_pupil_9', id=331, color=[192, 128, 64], type='', swap='r_border_of_pupil_3'),
+ 332: dict(name='l_border_of_pupil_midpoint_3', id=332, color=[192, 128, 64], type='', swap='r_border_of_pupil_midpoint_2'),
+ 333: dict(name='l_border_of_pupil_6', id=333, color=[192, 128, 64], type='', swap='r_border_of_pupil_6'),
+ 334: dict(name='l_border_of_pupil_midpoint_2', id=334, color=[192, 128, 64], type='', swap='r_border_of_pupil_midpoint_3'),
+
+ 335: dict(name='r_center_of_pupil', id=335, color=[32, 192, 192], type='', swap='l_center_of_pupil'),
+ 336: dict(name='r_border_of_pupil_3', id=336, color=[32, 192, 192], type='', swap='l_border_of_pupil_9'),
+ 337: dict(name='r_border_of_pupil_midpoint_1', id=337, color=[32, 192, 192], type='', swap='l_border_of_pupil_midpoint_4'),
+ 338: dict(name='r_border_of_pupil_12', id=338, color=[32, 192, 192], type='', swap='l_border_of_pupil_12'),
+ 339: dict(name='r_border_of_pupil_midpoint_4', id=339, color=[32, 192, 192], type='', swap='l_border_of_pupil_midpoint_1'),
+ 340: dict(name='r_border_of_pupil_9', id=340, color=[32, 192, 192], type='', swap='l_border_of_pupil_3'),
+ 341: dict(name='r_border_of_pupil_midpoint_3', id=341, color=[32, 192, 192], type='', swap='l_border_of_pupil_midpoint_2'),
+ 342: dict(name='r_border_of_pupil_6', id=342, color=[32, 192, 192], type='', swap='l_border_of_pupil_6'),
+ 343: dict(name='r_border_of_pupil_midpoint_2', id=343, color=[32, 192, 192], type='', swap='l_border_of_pupil_midpoint_3'),
+ },
+ remove_teeth=True, ## 36 of them, 344 - 36 = 308
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+ 6:
+ dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(
+ link=('left_shoulder', 'right_shoulder'),
+ id=7,
+ color=[51, 153, 255]),
+ 8:
+ dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('left_eye', 'right_eye'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('nose', 'left_eye'), id=13, color=[51, 153, 255]),
+ 14:
+ dict(link=('nose', 'right_eye'), id=14, color=[51, 153, 255]),
+ 15:
+ dict(link=('left_eye', 'left_ear'), id=15, color=[51, 153, 255]),
+ 16:
+ dict(link=('right_eye', 'right_ear'), id=16, color=[51, 153, 255]),
+ 17:
+ dict(link=('left_ear', 'left_shoulder'), id=17, color=[51, 153, 255]),
+ 18:
+ dict(
+ link=('right_ear', 'right_shoulder'), id=18, color=[51, 153, 255]),
+ 19:
+ dict(link=('left_ankle', 'left_big_toe'), id=19, color=[0, 255, 0]),
+ 20:
+ dict(link=('left_ankle', 'left_small_toe'), id=20, color=[0, 255, 0]),
+ 21:
+ dict(link=('left_ankle', 'left_heel'), id=21, color=[0, 255, 0]),
+ 22:
+ dict(
+ link=('right_ankle', 'right_big_toe'), id=22, color=[255, 128, 0]),
+ 23:
+ dict(
+ link=('right_ankle', 'right_small_toe'),
+ id=23,
+ color=[255, 128, 0]),
+ 24:
+ dict(link=('right_ankle', 'right_heel'), id=24, color=[255, 128, 0]),
+ 25:
+ dict(
+ link=('left_wrist', 'left_thumb_third_joint'), id=25, color=[255, 128,
+ 0]),
+ 26:
+ dict(link=('left_thumb_third_joint', 'left_thumb2'), id=26, color=[255, 128, 0]),
+ 27:
+ dict(link=('left_thumb2', 'left_thumb3'), id=27, color=[255, 128, 0]),
+ 28:
+ dict(link=('left_thumb3', 'left_thumb4'), id=28, color=[255, 128, 0]),
+ 29:
+ dict(
+ link=('left_wrist', 'left_forefinger_third_joint'),
+ id=29,
+ color=[255, 153, 255]),
+ 30:
+ dict(
+ link=('left_forefinger_third_joint', 'left_forefinger2'),
+ id=30,
+ color=[255, 153, 255]),
+ 31:
+ dict(
+ link=('left_forefinger2', 'left_forefinger3'),
+ id=31,
+ color=[255, 153, 255]),
+ 32:
+ dict(
+ link=('left_forefinger3', 'left_forefinger4'),
+ id=32,
+ color=[255, 153, 255]),
+ 33:
+ dict(
+ link=('left_wrist', 'left_middle_finger_third_joint'),
+ id=33,
+ color=[102, 178, 255]),
+ 34:
+ dict(
+ link=('left_middle_finger_third_joint', 'left_middle_finger2'),
+ id=34,
+ color=[102, 178, 255]),
+ 35:
+ dict(
+ link=('left_middle_finger2', 'left_middle_finger3'),
+ id=35,
+ color=[102, 178, 255]),
+ 36:
+ dict(
+ link=('left_middle_finger3', 'left_middle_finger4'),
+ id=36,
+ color=[102, 178, 255]),
+ 37:
+ dict(
+ link=('left_wrist', 'left_ring_finger_third_joint'),
+ id=37,
+ color=[255, 51, 51]),
+ 38:
+ dict(
+ link=('left_ring_finger_third_joint', 'left_ring_finger2'),
+ id=38,
+ color=[255, 51, 51]),
+ 39:
+ dict(
+ link=('left_ring_finger2', 'left_ring_finger3'),
+ id=39,
+ color=[255, 51, 51]),
+ 40:
+ dict(
+ link=('left_ring_finger3', 'left_ring_finger4'),
+ id=40,
+ color=[255, 51, 51]),
+ 41:
+ dict(
+ link=('left_wrist', 'left_pinky_finger_third_joint'),
+ id=41,
+ color=[0, 255, 0]),
+ 42:
+ dict(
+ link=('left_pinky_finger_third_joint', 'left_pinky_finger2'),
+ id=42,
+ color=[0, 255, 0]),
+ 43:
+ dict(
+ link=('left_pinky_finger2', 'left_pinky_finger3'),
+ id=43,
+ color=[0, 255, 0]),
+ 44:
+ dict(
+ link=('left_pinky_finger3', 'left_pinky_finger4'),
+ id=44,
+ color=[0, 255, 0]),
+ 45:
+ dict(
+ link=('right_wrist', 'right_thumb_third_joint'),
+ id=45,
+ color=[255, 128, 0]),
+ 46:
+ dict(
+ link=('right_thumb_third_joint', 'right_thumb2'), id=46, color=[255, 128, 0]),
+ 47:
+ dict(
+ link=('right_thumb2', 'right_thumb3'), id=47, color=[255, 128, 0]),
+ 48:
+ dict(
+ link=('right_thumb3', 'right_thumb4'), id=48, color=[255, 128, 0]),
+ 49:
+ dict(
+ link=('right_wrist', 'right_forefinger_third_joint'),
+ id=49,
+ color=[255, 153, 255]),
+ 50:
+ dict(
+ link=('right_forefinger_third_joint', 'right_forefinger2'),
+ id=50,
+ color=[255, 153, 255]),
+ 51:
+ dict(
+ link=('right_forefinger2', 'right_forefinger3'),
+ id=51,
+ color=[255, 153, 255]),
+ 52:
+ dict(
+ link=('right_forefinger3', 'right_forefinger4'),
+ id=52,
+ color=[255, 153, 255]),
+ 53:
+ dict(
+ link=('right_wrist', 'right_middle_finger_third_joint'),
+ id=53,
+ color=[102, 178, 255]),
+ 54:
+ dict(
+ link=('right_middle_finger_third_joint', 'right_middle_finger2'),
+ id=54,
+ color=[102, 178, 255]),
+ 55:
+ dict(
+ link=('right_middle_finger2', 'right_middle_finger3'),
+ id=55,
+ color=[102, 178, 255]),
+ 56:
+ dict(
+ link=('right_middle_finger3', 'right_middle_finger4'),
+ id=56,
+ color=[102, 178, 255]),
+ 57:
+ dict(
+ link=('right_wrist', 'right_ring_finger_third_joint'),
+ id=57,
+ color=[255, 51, 51]),
+ 58:
+ dict(
+ link=('right_ring_finger_third_joint', 'right_ring_finger2'),
+ id=58,
+ color=[255, 51, 51]),
+ 59:
+ dict(
+ link=('right_ring_finger2', 'right_ring_finger3'),
+ id=59,
+ color=[255, 51, 51]),
+ 60:
+ dict(
+ link=('right_ring_finger3', 'right_ring_finger4'),
+ id=60,
+ color=[255, 51, 51]),
+ 61:
+ dict(
+ link=('right_wrist', 'right_pinky_finger_third_joint'),
+ id=61,
+ color=[0, 255, 0]),
+ 62:
+ dict(
+ link=('right_pinky_finger_third_joint', 'right_pinky_finger2'),
+ id=62,
+ color=[0, 255, 0]),
+ 63:
+ dict(
+ link=('right_pinky_finger2', 'right_pinky_finger3'),
+ id=63,
+ color=[0, 255, 0]),
+ 64:
+ dict(
+ link=('right_pinky_finger3', 'right_pinky_finger4'),
+ id=64,
+ color=[0, 255, 0])
+ },
+ joint_weights=[1.] * 344,
+ body_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',
+ ],
+ foot_keypoint_names=[
+ 'left_big_toe',
+ 'left_small_toe',
+ 'left_heel',
+ 'right_big_toe',
+ 'right_small_toe',
+ 'right_heel'
+ ],
+ left_hand_keypoint_names=[
+ 'left_thumb4',
+ 'left_thumb3',
+ 'left_thumb2',
+ 'left_thumb_third_joint',
+ 'left_forefinger4',
+ 'left_forefinger3',
+ 'left_forefinger2',
+ 'left_forefinger_third_joint',
+ 'left_middle_finger4',
+ 'left_middle_finger3',
+ 'left_middle_finger2',
+ 'left_middle_finger_third_joint',
+ 'left_ring_finger4',
+ 'left_ring_finger3',
+ 'left_ring_finger2',
+ 'left_ring_finger_third_joint',
+ 'left_pinky_finger4',
+ 'left_pinky_finger3',
+ 'left_pinky_finger2',
+ 'left_pinky_finger_third_joint'
+ ],
+ right_hand_keypoint_names=[
+ 'right_thumb4',
+ 'right_thumb3',
+ 'right_thumb2',
+ 'right_thumb_third_joint',
+ 'right_forefinger4',
+ 'right_forefinger3',
+ 'right_forefinger2',
+ 'right_forefinger_third_joint',
+ 'right_middle_finger4',
+ 'right_middle_finger3',
+ 'right_middle_finger2',
+ 'right_middle_finger_third_joint',
+ 'right_ring_finger4',
+ 'right_ring_finger3',
+ 'right_ring_finger2',
+ 'right_ring_finger_third_joint',
+ 'right_pinky_finger4',
+ 'right_pinky_finger3',
+ 'right_pinky_finger2',
+ 'right_pinky_finger_third_joint'
+ ],
+ ## 7 of them
+ extra_keypoint_names=[
+ 'neck',
+ 'left_olecranon',
+ 'right_olecranon',
+ 'left_cubital_fossa',
+ 'right_cubital_fossa',
+ 'left_acromion',
+ 'right_acromion',
+ ],
+ face_keypoint_names=[
+ 'center_of_glabella',
+ 'center_of_nose_root',
+ 'tip_of_nose_bridge',
+ 'midpoint_1_of_nose_bridge',
+ 'midpoint_2_of_nose_bridge',
+ 'midpoint_3_of_nose_bridge',
+ 'center_of_labiomental_groove',
+ 'tip_of_chin',
+ 'upper_startpoint_of_r_eyebrow',
+ 'lower_startpoint_of_r_eyebrow',
+ 'end_of_r_eyebrow',
+ 'upper_midpoint_1_of_r_eyebrow',
+ 'lower_midpoint_1_of_r_eyebrow',
+ 'upper_midpoint_2_of_r_eyebrow',
+ 'upper_midpoint_3_of_r_eyebrow',
+ 'lower_midpoint_2_of_r_eyebrow',
+ 'lower_midpoint_3_of_r_eyebrow',
+ 'upper_startpoint_of_l_eyebrow',
+ 'lower_startpoint_of_l_eyebrow',
+ 'end_of_l_eyebrow',
+ 'upper_midpoint_1_of_l_eyebrow',
+ 'lower_midpoint_1_of_l_eyebrow',
+ 'upper_midpoint_2_of_l_eyebrow',
+ 'upper_midpoint_3_of_l_eyebrow',
+ 'lower_midpoint_2_of_l_eyebrow',
+ 'lower_midpoint_3_of_l_eyebrow',
+ 'l_inner_end_of_upper_lash_line',
+ 'l_outer_end_of_upper_lash_line',
+ 'l_centerpoint_of_upper_lash_line',
+ 'l_midpoint_2_of_upper_lash_line',
+ 'l_midpoint_1_of_upper_lash_line',
+ 'l_midpoint_6_of_upper_lash_line',
+ 'l_midpoint_5_of_upper_lash_line',
+ 'l_midpoint_4_of_upper_lash_line',
+ 'l_midpoint_3_of_upper_lash_line',
+ 'l_outer_end_of_upper_eyelid_line',
+ 'l_midpoint_6_of_upper_eyelid_line',
+ 'l_midpoint_2_of_upper_eyelid_line',
+ 'l_midpoint_5_of_upper_eyelid_line',
+ 'l_centerpoint_of_upper_eyelid_line',
+ 'l_midpoint_4_of_upper_eyelid_line',
+ 'l_midpoint_1_of_upper_eyelid_line',
+ 'l_midpoint_3_of_upper_eyelid_line',
+ 'l_midpoint_6_of_upper_crease_line',
+ 'l_midpoint_2_of_upper_crease_line',
+ 'l_midpoint_5_of_upper_crease_line',
+ 'l_centerpoint_of_upper_crease_line',
+ 'l_midpoint_4_of_upper_crease_line',
+ 'l_midpoint_1_of_upper_crease_line',
+ 'l_midpoint_3_of_upper_crease_line',
+ 'r_inner_end_of_upper_lash_line',
+ 'r_outer_end_of_upper_lash_line',
+ 'r_centerpoint_of_upper_lash_line',
+ 'r_midpoint_1_of_upper_lash_line',
+ 'r_midpoint_2_of_upper_lash_line',
+ 'r_midpoint_3_of_upper_lash_line',
+ 'r_midpoint_4_of_upper_lash_line',
+ 'r_midpoint_5_of_upper_lash_line',
+ 'r_midpoint_6_of_upper_lash_line',
+ 'r_outer_end_of_upper_eyelid_line',
+ 'r_midpoint_3_of_upper_eyelid_line',
+ 'r_midpoint_1_of_upper_eyelid_line',
+ 'r_midpoint_4_of_upper_eyelid_line',
+ 'r_centerpoint_of_upper_eyelid_line',
+ 'r_midpoint_5_of_upper_eyelid_line',
+ 'r_midpoint_2_of_upper_eyelid_line',
+ 'r_midpoint_6_of_upper_eyelid_line',
+ 'r_midpoint_3_of_upper_crease_line',
+ 'r_midpoint_1_of_upper_crease_line',
+ 'r_midpoint_4_of_upper_crease_line',
+ 'r_centerpoint_of_upper_crease_line',
+ 'r_midpoint_5_of_upper_crease_line',
+ 'r_midpoint_2_of_upper_crease_line',
+ 'r_midpoint_6_of_upper_crease_line',
+ 'l_inner_end_of_lower_lash_line',
+ 'l_outer_end_of_lower_lash_line',
+ 'l_centerpoint_of_lower_lash_line',
+ 'l_midpoint_2_of_lower_lash_line',
+ 'l_midpoint_1_of_lower_lash_line',
+ 'l_midpoint_6_of_lower_lash_line',
+ 'l_midpoint_5_of_lower_lash_line',
+ 'l_midpoint_4_of_lower_lash_line',
+ 'l_midpoint_3_of_lower_lash_line',
+ 'l_outer_end_of_lower_eyelid_line',
+ 'l_midpoint_6_of_lower_eyelid_line',
+ 'l_midpoint_2_of_lower_eyelid_line',
+ 'l_midpoint_5_of_lower_eyelid_line',
+ 'l_centerpoint_of_lower_eyelid_line',
+ 'l_midpoint_4_of_lower_eyelid_line',
+ 'l_midpoint_1_of_lower_eyelid_line',
+ 'l_midpoint_3_of_lower_eyelid_line',
+ 'r_inner_end_of_lower_lash_line',
+ 'r_outer_end_of_lower_lash_line',
+ 'r_centerpoint_of_lower_lash_line',
+ 'r_midpoint_1_of_lower_lash_line',
+ 'r_midpoint_2_of_lower_lash_line',
+ 'r_midpoint_3_of_lower_lash_line',
+ 'r_midpoint_4_of_lower_lash_line',
+ 'r_midpoint_5_of_lower_lash_line',
+ 'r_midpoint_6_of_lower_lash_line',
+ 'r_outer_end_of_lower_eyelid_line',
+ 'r_midpoint_3_of_lower_eyelid_line',
+ 'r_midpoint_1_of_lower_eyelid_line',
+ 'r_midpoint_4_of_lower_eyelid_line',
+ 'r_centerpoint_of_lower_eyelid_line',
+ 'r_midpoint_5_of_lower_eyelid_line',
+ 'r_midpoint_2_of_lower_eyelid_line',
+ 'r_midpoint_6_of_lower_eyelid_line',
+ 'tip_of_nose',
+ 'bottom_center_of_nose',
+ 'r_outer_corner_of_nose',
+ 'l_outer_corner_of_nose',
+ 'inner_corner_of_r_nostril',
+ 'outer_corner_of_r_nostril',
+ 'upper_corner_of_r_nostril',
+ 'inner_corner_of_l_nostril',
+ 'outer_corner_of_l_nostril',
+ 'upper_corner_of_l_nostril',
+ 'r_outer_corner_of_mouth',
+ 'l_outer_corner_of_mouth',
+ 'center_of_cupid_bow',
+ 'center_of_lower_outer_lip',
+ 'midpoint_1_of_upper_outer_lip',
+ 'midpoint_2_of_upper_outer_lip',
+ 'midpoint_1_of_lower_outer_lip',
+ 'midpoint_2_of_lower_outer_lip',
+ 'midpoint_3_of_upper_outer_lip',
+ 'midpoint_4_of_upper_outer_lip',
+ 'midpoint_5_of_upper_outer_lip',
+ 'midpoint_6_of_upper_outer_lip',
+ 'midpoint_3_of_lower_outer_lip',
+ 'midpoint_4_of_lower_outer_lip',
+ 'midpoint_5_of_lower_outer_lip',
+ 'midpoint_6_of_lower_outer_lip',
+ 'r_inner_corner_of_mouth',
+ 'l_inner_corner_of_mouth',
+ 'center_of_upper_inner_lip',
+ 'center_of_lower_inner_lip',
+ 'midpoint_1_of_upper_inner_lip',
+ 'midpoint_2_of_upper_inner_lip',
+ 'midpoint_1_of_lower_inner_lip',
+ 'midpoint_2_of_lower_inner_lip',
+ 'midpoint_3_of_upper_inner_lip',
+ 'midpoint_4_of_upper_inner_lip',
+ 'midpoint_5_of_upper_inner_lip',
+ 'midpoint_6_of_upper_inner_lip',
+ 'midpoint_3_of_lower_inner_lip',
+ 'midpoint_4_of_lower_inner_lip',
+ 'midpoint_5_of_lower_inner_lip',
+ 'midpoint_6_of_lower_inner_lip',
+ 'l_top_end_of_inferior_crus',
+ 'l_top_end_of_superior_crus',
+ 'l_start_of_antihelix',
+ 'l_end_of_antihelix',
+ 'l_midpoint_1_of_antihelix',
+ 'l_midpoint_1_of_inferior_crus',
+ 'l_midpoint_2_of_antihelix',
+ 'l_midpoint_3_of_antihelix',
+ 'l_point_1_of_inner_helix',
+ 'l_point_2_of_inner_helix',
+ 'l_point_3_of_inner_helix',
+ 'l_point_4_of_inner_helix',
+ 'l_point_5_of_inner_helix',
+ 'l_point_6_of_inner_helix',
+ 'l_point_7_of_inner_helix',
+ 'l_highest_point_of_antitragus',
+ 'l_bottom_point_of_tragus',
+ 'l_protruding_point_of_tragus',
+ 'l_top_point_of_tragus',
+ 'l_start_point_of_crus_of_helix',
+ 'l_deepest_point_of_concha',
+ 'l_tip_of_ear_lobe',
+ 'l_midpoint_between_22_15',
+ 'l_bottom_connecting_point_of_ear_lobe',
+ 'l_top_connecting_point_of_helix',
+ 'l_point_8_of_inner_helix',
+ 'r_top_end_of_inferior_crus',
+ 'r_top_end_of_superior_crus',
+ 'r_start_of_antihelix',
+ 'r_end_of_antihelix',
+ 'r_midpoint_1_of_antihelix',
+ 'r_midpoint_1_of_inferior_crus',
+ 'r_midpoint_2_of_antihelix',
+ 'r_midpoint_3_of_antihelix',
+ 'r_point_1_of_inner_helix',
+ 'r_point_8_of_inner_helix',
+ 'r_point_3_of_inner_helix',
+ 'r_point_4_of_inner_helix',
+ 'r_point_5_of_inner_helix',
+ 'r_point_6_of_inner_helix',
+ 'r_point_7_of_inner_helix',
+ 'r_highest_point_of_antitragus',
+ 'r_bottom_point_of_tragus',
+ 'r_protruding_point_of_tragus',
+ 'r_top_point_of_tragus',
+ 'r_start_point_of_crus_of_helix',
+ 'r_deepest_point_of_concha',
+ 'r_tip_of_ear_lobe',
+ 'r_midpoint_between_22_15',
+ 'r_bottom_connecting_point_of_ear_lobe',
+ 'r_top_connecting_point_of_helix',
+ 'r_point_2_of_inner_helix',
+ 'l_center_of_iris',
+ 'l_border_of_iris_3',
+ 'l_border_of_iris_midpoint_1',
+ 'l_border_of_iris_12',
+ 'l_border_of_iris_midpoint_4',
+ 'l_border_of_iris_9',
+ 'l_border_of_iris_midpoint_3',
+ 'l_border_of_iris_6',
+ 'l_border_of_iris_midpoint_2',
+ 'r_center_of_iris',
+ 'r_border_of_iris_3',
+ 'r_border_of_iris_midpoint_1',
+ 'r_border_of_iris_12',
+ 'r_border_of_iris_midpoint_4',
+ 'r_border_of_iris_9',
+ 'r_border_of_iris_midpoint_3',
+ 'r_border_of_iris_6',
+ 'r_border_of_iris_midpoint_2',
+ 'l_center_of_pupil',
+ 'l_border_of_pupil_3',
+ 'l_border_of_pupil_midpoint_1',
+ 'l_border_of_pupil_12',
+ 'l_border_of_pupil_midpoint_4',
+ 'l_border_of_pupil_9',
+ 'l_border_of_pupil_midpoint_3',
+ 'l_border_of_pupil_6',
+ 'l_border_of_pupil_midpoint_2',
+ 'r_center_of_pupil',
+ 'r_border_of_pupil_3',
+ 'r_border_of_pupil_midpoint_1',
+ 'r_border_of_pupil_12',
+ 'r_border_of_pupil_midpoint_4',
+ 'r_border_of_pupil_9',
+ 'r_border_of_pupil_midpoint_3',
+ 'r_border_of_pupil_6',
+ 'r_border_of_pupil_midpoint_2',
+ ]
+)
+
+##------------------------------------------------------------------------------------------------------------------
+### remove teeth keypoints
+if dataset_info['remove_teeth'] == True:
+
+ ## get teeth ids
+ teeth_keypoint_ids = [keypoint_id for keypoint_id, info in dataset_info['keypoint_info'].items() if info['name'].startswith('teeth_')]
+ min_teeth_keypoint_id = min(teeth_keypoint_ids)
+ max_teeth_keypoint_id = max(teeth_keypoint_ids)
+
+ dataset_info['teeth_keypoint_ids'] = teeth_keypoint_ids
+
+ ## remove teeth keypoints from keypoint_info
+ keypoint_info_ = dataset_info['keypoint_info']
+
+ keypoint_info = {}
+ for keypoint_id, info in keypoint_info_.items():
+ if keypoint_id in teeth_keypoint_ids:
+ continue
+
+ if keypoint_id < min_teeth_keypoint_id:
+ keypoint_info[keypoint_id] = info
+
+ if keypoint_id > max_teeth_keypoint_id:
+
+ keypoint_id = keypoint_id - len(teeth_keypoint_ids)
+ info['id'] = keypoint_id
+ keypoint_info[keypoint_id] = info
+
+ dataset_info['keypoint_info'] = keypoint_info
+
+ ## update joint_weights
+ dataset_info['joint_weights'] = (len(keypoint_info_) - len(teeth_keypoint_ids))*[1.]
+
+##------------------------------------------------------------------------------------------------------------------
+## reconfigure in the order of coco_whole_body
+coco_wholebody_keypoint_info = {keypoint_info['name']: keypoint_info for (keypoint_index, keypoint_info) in coco_wholebody_info['keypoint_info'].items()}
+coco_wholebody_to_goliath_mapping = {} ## coco_wholebody_index to goliath_index
+coco_wholebody_to_goliath_keypoint_info = {}
+
+## find out common keypoints between goliath and coco_whole_body
+for (keypoint_index, keypoint_info) in dataset_info['keypoint_info'].items():
+ keypoint_name = keypoint_info['name']
+ keypoint_index_ = keypoint_info['id']
+ assert(keypoint_index == keypoint_index_)
+
+ if keypoint_name in coco_wholebody_keypoint_info.keys():
+ coco_wholebody_to_goliath_keypoint_info[keypoint_name] = coco_wholebody_keypoint_info[keypoint_name]
+ coco_wholebody_to_goliath_mapping[coco_wholebody_keypoint_info[keypoint_name]['id']] = keypoint_info['id']
+
+dataset_info['coco_wholebody_to_goliath_mapping'] = coco_wholebody_to_goliath_mapping ## store the cocowholebody indices
+dataset_info['coco_wholebody_to_goliath_keypoint_info'] = coco_wholebody_to_goliath_keypoint_info
+
+##------------------------------------------------------------------------------------------------------------------
+coco_wholebody_sigmas = {}
+
+## compute the coco_wholebody_sigmas
+for keypoint_index, keypoint_info in coco_wholebody_info['keypoint_info'].items():
+ coco_wholebody_sigmas[keypoint_info['name']] = coco_wholebody_info['sigmas'][keypoint_info['id']]
+
+default_sigma = 0.010 ## for mostly face keypoints
+dataset_info['sigmas'] = [default_sigma]*len(dataset_info['keypoint_info'])
+
+## we copy sigmas from coco_wholebody. Rest are assigned as below:
+custom_sigmas = {
+ 'left_thumb_third_joint': 0.022,
+ 'left_forefinger_third_joint': 0.026,
+ 'left_middle_finger_third_joint': 0.018,
+ 'left_ring_finger_third_joint': 0.017,
+ 'left_pinky_finger_third_joint': 0.02,
+ 'right_thumb_third_joint': 0.022,
+ 'right_forefinger_third_joint': 0.026,
+ 'right_middle_finger_third_joint': 0.018,
+ 'right_ring_finger_third_joint': 0.017,
+ 'right_pinky_finger_third_joint': 0.02,
+ 'neck': 0.079, ## same as shoulder
+ 'left_olecranon': 0.072, ## same as elbow
+ 'right_olecranon': 0.072, ## same as elbow
+ 'left_cubital_fossa': 0.072, ## same as elbow
+ 'right_cubital_fossa': 0.072, ## same as elbow
+ 'left_acromion': 0.079, ## same as shoulder
+ 'right_acromion': 0.079, ## same as shoulder
+}
+
+## copy custom sigmas
+for keypoint_name, sigma in custom_sigmas.items():
+ keypoint_id = -1
+
+ ## search for keypoint id from keypoint name
+ for keypoint_id_ in dataset_info['keypoint_info'].keys():
+ if dataset_info['keypoint_info'][keypoint_id_]['name'] == keypoint_name:
+ keypoint_id = keypoint_id_
+ break
+
+ if keypoint_id != -1:
+ keypoint_info = dataset_info['keypoint_info'][keypoint_id]
+ assert(keypoint_info['name'] == keypoint_name)
+ assert(keypoint_info['id'] == keypoint_id)
+ dataset_info['sigmas'][keypoint_info['id']] = sigma
+
+## copy coco_wholebody sigmas
+for keypoint_index, keypoint_info in dataset_info['keypoint_info'].items():
+ if keypoint_info['name'] in coco_wholebody_sigmas.keys():
+ dataset_info['sigmas'][keypoint_info['id']] = coco_wholebody_sigmas[keypoint_info['name']]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/goliath3d.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/goliath3d.py
new file mode 100644
index 0000000000000000000000000000000000000000..246ed71b29e138f0a1c52c6abc6e6323cf239c16
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/goliath3d.py
@@ -0,0 +1,2131 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+coco_wholebody_info = dict(
+ dataset_name='coco_wholebody',
+ paper_info=dict(
+ author='Jin, Sheng and Xu, Lumin and Xu, Jin and '
+ 'Wang, Can and Liu, Wentao and '
+ 'Qian, Chen and Ouyang, Wanli and Luo, Ping',
+ title='Whole-Body Human Pose Estimation in the Wild',
+ container='Proceedings of the European '
+ 'Conference on Computer Vision (ECCV)',
+ year='2020',
+ homepage='https://github.com/jin-s13/COCO-WholeBody/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1:
+ dict(
+ name='left_eye',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_eye'),
+ 2:
+ dict(
+ name='right_eye',
+ id=2,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_eye'),
+ 3:
+ dict(
+ name='left_ear',
+ id=3,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 4:
+ dict(
+ name='right_ear',
+ id=4,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='right_shoulder',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 7:
+ dict(
+ name='left_elbow',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 8:
+ dict(
+ name='right_elbow',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 9:
+ dict(
+ name='left_wrist',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='right_hip',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 13:
+ dict(
+ name='left_knee',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 14:
+ dict(
+ name='right_knee',
+ id=14,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 15:
+ dict(
+ name='left_ankle',
+ id=15,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 16:
+ dict(
+ name='right_ankle',
+ id=16,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle'),
+ 17:
+ dict(
+ name='left_big_toe',
+ id=17,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_big_toe'),
+ 18:
+ dict(
+ name='left_small_toe',
+ id=18,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_small_toe'),
+ 19:
+ dict(
+ name='left_heel',
+ id=19,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_heel'),
+ 20:
+ dict(
+ name='right_big_toe',
+ id=20,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_big_toe'),
+ 21:
+ dict(
+ name='right_small_toe',
+ id=21,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_small_toe'),
+ 22:
+ dict(
+ name='right_heel',
+ id=22,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_heel'),
+ 23:
+ dict(
+ name='face-0',
+ id=23,
+ color=[255, 255, 255],
+ type='',
+ swap='face-16'),
+ 24:
+ dict(
+ name='face-1',
+ id=24,
+ color=[255, 255, 255],
+ type='',
+ swap='face-15'),
+ 25:
+ dict(
+ name='face-2',
+ id=25,
+ color=[255, 255, 255],
+ type='',
+ swap='face-14'),
+ 26:
+ dict(
+ name='face-3',
+ id=26,
+ color=[255, 255, 255],
+ type='',
+ swap='face-13'),
+ 27:
+ dict(
+ name='face-4',
+ id=27,
+ color=[255, 255, 255],
+ type='',
+ swap='face-12'),
+ 28:
+ dict(
+ name='face-5',
+ id=28,
+ color=[255, 255, 255],
+ type='',
+ swap='face-11'),
+ 29:
+ dict(
+ name='face-6',
+ id=29,
+ color=[255, 255, 255],
+ type='',
+ swap='face-10'),
+ 30:
+ dict(
+ name='face-7',
+ id=30,
+ color=[255, 255, 255],
+ type='',
+ swap='face-9'),
+ 31:
+ dict(name='face-8', id=31, color=[255, 255, 255], type='', swap=''),
+ 32:
+ dict(
+ name='face-9',
+ id=32,
+ color=[255, 255, 255],
+ type='',
+ swap='face-7'),
+ 33:
+ dict(
+ name='face-10',
+ id=33,
+ color=[255, 255, 255],
+ type='',
+ swap='face-6'),
+ 34:
+ dict(
+ name='face-11',
+ id=34,
+ color=[255, 255, 255],
+ type='',
+ swap='face-5'),
+ 35:
+ dict(
+ name='face-12',
+ id=35,
+ color=[255, 255, 255],
+ type='',
+ swap='face-4'),
+ 36:
+ dict(
+ name='face-13',
+ id=36,
+ color=[255, 255, 255],
+ type='',
+ swap='face-3'),
+ 37:
+ dict(
+ name='face-14',
+ id=37,
+ color=[255, 255, 255],
+ type='',
+ swap='face-2'),
+ 38:
+ dict(
+ name='face-15',
+ id=38,
+ color=[255, 255, 255],
+ type='',
+ swap='face-1'),
+ 39:
+ dict(
+ name='face-16',
+ id=39,
+ color=[255, 255, 255],
+ type='',
+ swap='face-0'),
+ 40:
+ dict(
+ name='face-17',
+ id=40,
+ color=[255, 255, 255],
+ type='',
+ swap='face-26'),
+ 41:
+ dict(
+ name='face-18',
+ id=41,
+ color=[255, 255, 255],
+ type='',
+ swap='face-25'),
+ 42:
+ dict(
+ name='face-19',
+ id=42,
+ color=[255, 255, 255],
+ type='',
+ swap='face-24'),
+ 43:
+ dict(
+ name='face-20',
+ id=43,
+ color=[255, 255, 255],
+ type='',
+ swap='face-23'),
+ 44:
+ dict(
+ name='face-21',
+ id=44,
+ color=[255, 255, 255],
+ type='',
+ swap='face-22'),
+ 45:
+ dict(
+ name='face-22',
+ id=45,
+ color=[255, 255, 255],
+ type='',
+ swap='face-21'),
+ 46:
+ dict(
+ name='face-23',
+ id=46,
+ color=[255, 255, 255],
+ type='',
+ swap='face-20'),
+ 47:
+ dict(
+ name='face-24',
+ id=47,
+ color=[255, 255, 255],
+ type='',
+ swap='face-19'),
+ 48:
+ dict(
+ name='face-25',
+ id=48,
+ color=[255, 255, 255],
+ type='',
+ swap='face-18'),
+ 49:
+ dict(
+ name='face-26',
+ id=49,
+ color=[255, 255, 255],
+ type='',
+ swap='face-17'),
+ 50:
+ dict(name='face-27', id=50, color=[255, 255, 255], type='', swap=''),
+ 51:
+ dict(name='face-28', id=51, color=[255, 255, 255], type='', swap=''),
+ 52:
+ dict(name='face-29', id=52, color=[255, 255, 255], type='', swap=''),
+ 53:
+ dict(name='face-30', id=53, color=[255, 255, 255], type='', swap=''),
+ 54:
+ dict(
+ name='face-31',
+ id=54,
+ color=[255, 255, 255],
+ type='',
+ swap='face-35'),
+ 55:
+ dict(
+ name='face-32',
+ id=55,
+ color=[255, 255, 255],
+ type='',
+ swap='face-34'),
+ 56:
+ dict(name='face-33', id=56, color=[255, 255, 255], type='', swap=''),
+ 57:
+ dict(
+ name='face-34',
+ id=57,
+ color=[255, 255, 255],
+ type='',
+ swap='face-32'),
+ 58:
+ dict(
+ name='face-35',
+ id=58,
+ color=[255, 255, 255],
+ type='',
+ swap='face-31'),
+ 59:
+ dict(
+ name='face-36',
+ id=59,
+ color=[255, 255, 255],
+ type='',
+ swap='face-45'),
+ 60:
+ dict(
+ name='face-37',
+ id=60,
+ color=[255, 255, 255],
+ type='',
+ swap='face-44'),
+ 61:
+ dict(
+ name='face-38',
+ id=61,
+ color=[255, 255, 255],
+ type='',
+ swap='face-43'),
+ 62:
+ dict(
+ name='face-39',
+ id=62,
+ color=[255, 255, 255],
+ type='',
+ swap='face-42'),
+ 63:
+ dict(
+ name='face-40',
+ id=63,
+ color=[255, 255, 255],
+ type='',
+ swap='face-47'),
+ 64:
+ dict(
+ name='face-41',
+ id=64,
+ color=[255, 255, 255],
+ type='',
+ swap='face-46'),
+ 65:
+ dict(
+ name='face-42',
+ id=65,
+ color=[255, 255, 255],
+ type='',
+ swap='face-39'),
+ 66:
+ dict(
+ name='face-43',
+ id=66,
+ color=[255, 255, 255],
+ type='',
+ swap='face-38'),
+ 67:
+ dict(
+ name='face-44',
+ id=67,
+ color=[255, 255, 255],
+ type='',
+ swap='face-37'),
+ 68:
+ dict(
+ name='face-45',
+ id=68,
+ color=[255, 255, 255],
+ type='',
+ swap='face-36'),
+ 69:
+ dict(
+ name='face-46',
+ id=69,
+ color=[255, 255, 255],
+ type='',
+ swap='face-41'),
+ 70:
+ dict(
+ name='face-47',
+ id=70,
+ color=[255, 255, 255],
+ type='',
+ swap='face-40'),
+ 71:
+ dict(
+ name='face-48',
+ id=71,
+ color=[255, 255, 255],
+ type='',
+ swap='face-54'),
+ 72:
+ dict(
+ name='face-49',
+ id=72,
+ color=[255, 255, 255],
+ type='',
+ swap='face-53'),
+ 73:
+ dict(
+ name='face-50',
+ id=73,
+ color=[255, 255, 255],
+ type='',
+ swap='face-52'),
+ 74:
+ dict(name='face-51', id=74, color=[255, 255, 255], type='', swap=''),
+ 75:
+ dict(
+ name='face-52',
+ id=75,
+ color=[255, 255, 255],
+ type='',
+ swap='face-50'),
+ 76:
+ dict(
+ name='face-53',
+ id=76,
+ color=[255, 255, 255],
+ type='',
+ swap='face-49'),
+ 77:
+ dict(
+ name='face-54',
+ id=77,
+ color=[255, 255, 255],
+ type='',
+ swap='face-48'),
+ 78:
+ dict(
+ name='face-55',
+ id=78,
+ color=[255, 255, 255],
+ type='',
+ swap='face-59'),
+ 79:
+ dict(
+ name='face-56',
+ id=79,
+ color=[255, 255, 255],
+ type='',
+ swap='face-58'),
+ 80:
+ dict(name='face-57', id=80, color=[255, 255, 255], type='', swap=''),
+ 81:
+ dict(
+ name='face-58',
+ id=81,
+ color=[255, 255, 255],
+ type='',
+ swap='face-56'),
+ 82:
+ dict(
+ name='face-59',
+ id=82,
+ color=[255, 255, 255],
+ type='',
+ swap='face-55'),
+ 83:
+ dict(
+ name='face-60',
+ id=83,
+ color=[255, 255, 255],
+ type='',
+ swap='face-64'),
+ 84:
+ dict(
+ name='face-61',
+ id=84,
+ color=[255, 255, 255],
+ type='',
+ swap='face-63'),
+ 85:
+ dict(name='face-62', id=85, color=[255, 255, 255], type='', swap=''),
+ 86:
+ dict(
+ name='face-63',
+ id=86,
+ color=[255, 255, 255],
+ type='',
+ swap='face-61'),
+ 87:
+ dict(
+ name='face-64',
+ id=87,
+ color=[255, 255, 255],
+ type='',
+ swap='face-60'),
+ 88:
+ dict(
+ name='face-65',
+ id=88,
+ color=[255, 255, 255],
+ type='',
+ swap='face-67'),
+ 89:
+ dict(name='face-66', id=89, color=[255, 255, 255], type='', swap=''),
+ 90:
+ dict(
+ name='face-67',
+ id=90,
+ color=[255, 255, 255],
+ type='',
+ swap='face-65'),
+ 91:
+ dict(
+ name='left_hand_root',
+ id=91,
+ color=[255, 255, 255],
+ type='',
+ swap='right_hand_root'),
+ 92:
+ dict(
+ name='left_thumb1',
+ id=92,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb1'),
+ 93:
+ dict(
+ name='left_thumb2',
+ id=93,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb2'),
+ 94:
+ dict(
+ name='left_thumb3',
+ id=94,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb3'),
+ 95:
+ dict(
+ name='left_thumb4',
+ id=95,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb4'),
+ 96:
+ dict(
+ name='left_forefinger1',
+ id=96,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger1'),
+ 97:
+ dict(
+ name='left_forefinger2',
+ id=97,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger2'),
+ 98:
+ dict(
+ name='left_forefinger3',
+ id=98,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger3'),
+ 99:
+ dict(
+ name='left_forefinger4',
+ id=99,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger4'),
+ 100:
+ dict(
+ name='left_middle_finger1',
+ id=100,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger1'),
+ 101:
+ dict(
+ name='left_middle_finger2',
+ id=101,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger2'),
+ 102:
+ dict(
+ name='left_middle_finger3',
+ id=102,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger3'),
+ 103:
+ dict(
+ name='left_middle_finger4',
+ id=103,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger4'),
+ 104:
+ dict(
+ name='left_ring_finger1',
+ id=104,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger1'),
+ 105:
+ dict(
+ name='left_ring_finger2',
+ id=105,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger2'),
+ 106:
+ dict(
+ name='left_ring_finger3',
+ id=106,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger3'),
+ 107:
+ dict(
+ name='left_ring_finger4',
+ id=107,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger4'),
+ 108:
+ dict(
+ name='left_pinky_finger1',
+ id=108,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger1'),
+ 109:
+ dict(
+ name='left_pinky_finger2',
+ id=109,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger2'),
+ 110:
+ dict(
+ name='left_pinky_finger3',
+ id=110,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger3'),
+ 111:
+ dict(
+ name='left_pinky_finger4',
+ id=111,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger4'),
+ 112:
+ dict(
+ name='right_hand_root',
+ id=112,
+ color=[255, 255, 255],
+ type='',
+ swap='left_hand_root'),
+ 113:
+ dict(
+ name='right_thumb1',
+ id=113,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb1'),
+ 114:
+ dict(
+ name='right_thumb2',
+ id=114,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb2'),
+ 115:
+ dict(
+ name='right_thumb3',
+ id=115,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb3'),
+ 116:
+ dict(
+ name='right_thumb4',
+ id=116,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb4'),
+ 117:
+ dict(
+ name='right_forefinger1',
+ id=117,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger1'),
+ 118:
+ dict(
+ name='right_forefinger2',
+ id=118,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger2'),
+ 119:
+ dict(
+ name='right_forefinger3',
+ id=119,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger3'),
+ 120:
+ dict(
+ name='right_forefinger4',
+ id=120,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger4'),
+ 121:
+ dict(
+ name='right_middle_finger1',
+ id=121,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger1'),
+ 122:
+ dict(
+ name='right_middle_finger2',
+ id=122,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger2'),
+ 123:
+ dict(
+ name='right_middle_finger3',
+ id=123,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger3'),
+ 124:
+ dict(
+ name='right_middle_finger4',
+ id=124,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger4'),
+ 125:
+ dict(
+ name='right_ring_finger1',
+ id=125,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger1'),
+ 126:
+ dict(
+ name='right_ring_finger2',
+ id=126,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger2'),
+ 127:
+ dict(
+ name='right_ring_finger3',
+ id=127,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger3'),
+ 128:
+ dict(
+ name='right_ring_finger4',
+ id=128,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger4'),
+ 129:
+ dict(
+ name='right_pinky_finger1',
+ id=129,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger1'),
+ 130:
+ dict(
+ name='right_pinky_finger2',
+ id=130,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger2'),
+ 131:
+ dict(
+ name='right_pinky_finger3',
+ id=131,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger3'),
+ 132:
+ dict(
+ name='right_pinky_finger4',
+ id=132,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger4')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+ 6:
+ dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(
+ link=('left_shoulder', 'right_shoulder'),
+ id=7,
+ color=[51, 153, 255]),
+ 8:
+ dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('left_eye', 'right_eye'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('nose', 'left_eye'), id=13, color=[51, 153, 255]),
+ 14:
+ dict(link=('nose', 'right_eye'), id=14, color=[51, 153, 255]),
+ 15:
+ dict(link=('left_eye', 'left_ear'), id=15, color=[51, 153, 255]),
+ 16:
+ dict(link=('right_eye', 'right_ear'), id=16, color=[51, 153, 255]),
+ 17:
+ dict(link=('left_ear', 'left_shoulder'), id=17, color=[51, 153, 255]),
+ 18:
+ dict(
+ link=('right_ear', 'right_shoulder'), id=18, color=[51, 153, 255]),
+ 19:
+ dict(link=('left_ankle', 'left_big_toe'), id=19, color=[0, 255, 0]),
+ 20:
+ dict(link=('left_ankle', 'left_small_toe'), id=20, color=[0, 255, 0]),
+ 21:
+ dict(link=('left_ankle', 'left_heel'), id=21, color=[0, 255, 0]),
+ 22:
+ dict(
+ link=('right_ankle', 'right_big_toe'), id=22, color=[255, 128, 0]),
+ 23:
+ dict(
+ link=('right_ankle', 'right_small_toe'),
+ id=23,
+ color=[255, 128, 0]),
+ 24:
+ dict(link=('right_ankle', 'right_heel'), id=24, color=[255, 128, 0]),
+ 25:
+ dict(
+ link=('left_hand_root', 'left_thumb1'), id=25, color=[255, 128,
+ 0]),
+ 26:
+ dict(link=('left_thumb1', 'left_thumb2'), id=26, color=[255, 128, 0]),
+ 27:
+ dict(link=('left_thumb2', 'left_thumb3'), id=27, color=[255, 128, 0]),
+ 28:
+ dict(link=('left_thumb3', 'left_thumb4'), id=28, color=[255, 128, 0]),
+ 29:
+ dict(
+ link=('left_hand_root', 'left_forefinger1'),
+ id=29,
+ color=[255, 153, 255]),
+ 30:
+ dict(
+ link=('left_forefinger1', 'left_forefinger2'),
+ id=30,
+ color=[255, 153, 255]),
+ 31:
+ dict(
+ link=('left_forefinger2', 'left_forefinger3'),
+ id=31,
+ color=[255, 153, 255]),
+ 32:
+ dict(
+ link=('left_forefinger3', 'left_forefinger4'),
+ id=32,
+ color=[255, 153, 255]),
+ 33:
+ dict(
+ link=('left_hand_root', 'left_middle_finger1'),
+ id=33,
+ color=[102, 178, 255]),
+ 34:
+ dict(
+ link=('left_middle_finger1', 'left_middle_finger2'),
+ id=34,
+ color=[102, 178, 255]),
+ 35:
+ dict(
+ link=('left_middle_finger2', 'left_middle_finger3'),
+ id=35,
+ color=[102, 178, 255]),
+ 36:
+ dict(
+ link=('left_middle_finger3', 'left_middle_finger4'),
+ id=36,
+ color=[102, 178, 255]),
+ 37:
+ dict(
+ link=('left_hand_root', 'left_ring_finger1'),
+ id=37,
+ color=[255, 51, 51]),
+ 38:
+ dict(
+ link=('left_ring_finger1', 'left_ring_finger2'),
+ id=38,
+ color=[255, 51, 51]),
+ 39:
+ dict(
+ link=('left_ring_finger2', 'left_ring_finger3'),
+ id=39,
+ color=[255, 51, 51]),
+ 40:
+ dict(
+ link=('left_ring_finger3', 'left_ring_finger4'),
+ id=40,
+ color=[255, 51, 51]),
+ 41:
+ dict(
+ link=('left_hand_root', 'left_pinky_finger1'),
+ id=41,
+ color=[0, 255, 0]),
+ 42:
+ dict(
+ link=('left_pinky_finger1', 'left_pinky_finger2'),
+ id=42,
+ color=[0, 255, 0]),
+ 43:
+ dict(
+ link=('left_pinky_finger2', 'left_pinky_finger3'),
+ id=43,
+ color=[0, 255, 0]),
+ 44:
+ dict(
+ link=('left_pinky_finger3', 'left_pinky_finger4'),
+ id=44,
+ color=[0, 255, 0]),
+ 45:
+ dict(
+ link=('right_hand_root', 'right_thumb1'),
+ id=45,
+ color=[255, 128, 0]),
+ 46:
+ dict(
+ link=('right_thumb1', 'right_thumb2'), id=46, color=[255, 128, 0]),
+ 47:
+ dict(
+ link=('right_thumb2', 'right_thumb3'), id=47, color=[255, 128, 0]),
+ 48:
+ dict(
+ link=('right_thumb3', 'right_thumb4'), id=48, color=[255, 128, 0]),
+ 49:
+ dict(
+ link=('right_hand_root', 'right_forefinger1'),
+ id=49,
+ color=[255, 153, 255]),
+ 50:
+ dict(
+ link=('right_forefinger1', 'right_forefinger2'),
+ id=50,
+ color=[255, 153, 255]),
+ 51:
+ dict(
+ link=('right_forefinger2', 'right_forefinger3'),
+ id=51,
+ color=[255, 153, 255]),
+ 52:
+ dict(
+ link=('right_forefinger3', 'right_forefinger4'),
+ id=52,
+ color=[255, 153, 255]),
+ 53:
+ dict(
+ link=('right_hand_root', 'right_middle_finger1'),
+ id=53,
+ color=[102, 178, 255]),
+ 54:
+ dict(
+ link=('right_middle_finger1', 'right_middle_finger2'),
+ id=54,
+ color=[102, 178, 255]),
+ 55:
+ dict(
+ link=('right_middle_finger2', 'right_middle_finger3'),
+ id=55,
+ color=[102, 178, 255]),
+ 56:
+ dict(
+ link=('right_middle_finger3', 'right_middle_finger4'),
+ id=56,
+ color=[102, 178, 255]),
+ 57:
+ dict(
+ link=('right_hand_root', 'right_ring_finger1'),
+ id=57,
+ color=[255, 51, 51]),
+ 58:
+ dict(
+ link=('right_ring_finger1', 'right_ring_finger2'),
+ id=58,
+ color=[255, 51, 51]),
+ 59:
+ dict(
+ link=('right_ring_finger2', 'right_ring_finger3'),
+ id=59,
+ color=[255, 51, 51]),
+ 60:
+ dict(
+ link=('right_ring_finger3', 'right_ring_finger4'),
+ id=60,
+ color=[255, 51, 51]),
+ 61:
+ dict(
+ link=('right_hand_root', 'right_pinky_finger1'),
+ id=61,
+ color=[0, 255, 0]),
+ 62:
+ dict(
+ link=('right_pinky_finger1', 'right_pinky_finger2'),
+ id=62,
+ color=[0, 255, 0]),
+ 63:
+ dict(
+ link=('right_pinky_finger2', 'right_pinky_finger3'),
+ id=63,
+ color=[0, 255, 0]),
+ 64:
+ dict(
+ link=('right_pinky_finger3', 'right_pinky_finger4'),
+ id=64,
+ color=[0, 255, 0])
+ },
+ joint_weights=[1.] * 133,
+ # 'https://github.com/jin-s13/COCO-WholeBody/blob/master/'
+ # 'evaluation/myeval_wholebody.py#L175'
+ sigmas=[
+ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+ 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089, 0.068, 0.066, 0.066,
+ 0.092, 0.094, 0.094, 0.042, 0.043, 0.044, 0.043, 0.040, 0.035, 0.031,
+ 0.025, 0.020, 0.023, 0.029, 0.032, 0.037, 0.038, 0.043, 0.041, 0.045,
+ 0.013, 0.012, 0.011, 0.011, 0.012, 0.012, 0.011, 0.011, 0.013, 0.015,
+ 0.009, 0.007, 0.007, 0.007, 0.012, 0.009, 0.008, 0.016, 0.010, 0.017,
+ 0.011, 0.009, 0.011, 0.009, 0.007, 0.013, 0.008, 0.011, 0.012, 0.010,
+ 0.034, 0.008, 0.008, 0.009, 0.008, 0.008, 0.007, 0.010, 0.008, 0.009,
+ 0.009, 0.009, 0.007, 0.007, 0.008, 0.011, 0.008, 0.008, 0.008, 0.01,
+ 0.008, 0.029, 0.022, 0.035, 0.037, 0.047, 0.026, 0.025, 0.024, 0.035,
+ 0.018, 0.024, 0.022, 0.026, 0.017, 0.021, 0.021, 0.032, 0.02, 0.019,
+ 0.022, 0.031, 0.029, 0.022, 0.035, 0.037, 0.047, 0.026, 0.025, 0.024,
+ 0.035, 0.018, 0.024, 0.022, 0.026, 0.017, 0.021, 0.021, 0.032, 0.02,
+ 0.019, 0.022, 0.031
+ ])
+
+dataset_info = dict(
+ dataset_name='goliath3d',
+ paper_info=dict(
+ author='',
+ year='',
+ homepage='',
+ ),
+ min_visible_keypoints=8,
+ image_height=4096,
+ image_width=2668,
+ original_keypoint_info={
+ 0: 'nose',
+ 1: 'left_eye',
+ 2: 'right_eye',
+ 3: 'left_ear',
+ 4: 'right_ear',
+ 5: 'left_shoulder',
+ 6: 'right_shoulder',
+ 7: 'left_elbow',
+ 8: 'right_elbow',
+ 9: 'left_hip',
+ 10: 'right_hip',
+ 11: 'left_knee',
+ 12: 'right_knee',
+ 13: 'left_ankle',
+ 14: 'right_ankle',
+ 15: 'left_big_toe', # 'left_big_toe_tip'
+ 16: 'left_small_toe', # 'left_small_toe_tip'
+ 17: 'left_heel',
+ 18: 'right_big_toe', # 'right_big_toe_tip'
+ 19: 'right_small_toe', # 'right_small_toe_tip'
+ 20: 'right_heel',
+ 21: 'right_thumb4', # 'right_thumb_tip'
+ 22: 'right_thumb3', # 'right_thumb_first_joint'
+ 23: 'right_thumb2', # 'right_thumb_second_joint'
+ 24: 'right_thumb_third_joint', # 'right_thumb_third_joint'
+
+ 25: 'right_forefinger4', # 'right_index_tip'
+ 26: 'right_forefinger3', # 'right_index_first_joint'
+ 27: 'right_forefinger2', # 'right_index_second_joint'
+ 28: 'right_forefinger_third_joint', # 'right_index_third_joint'
+
+ 29: 'right_middle_finger4', # 'right_middle_tip'
+ 30: 'right_middle_finger3', # 'right_middle_first_joint'
+ 31: 'right_middle_finger2', # 'right_middle_second_joint'
+ 32: 'right_middle_finger_third_joint', # 'right_middle_third_joint'
+
+ 33: 'right_ring_finger4', # 'right_ring_tip'
+ 34: 'right_ring_finger3', # 'right_ring_first_joint'
+ 35: 'right_ring_finger2', # 'right_ring_second_joint'
+ 36: 'right_ring_finger_third_joint', # 'right_ring_third_joint'
+
+ 37: 'right_pinky_finger4', # 'right_pinky_tip'
+ 38: 'right_pinky_finger3', # 'right_pinky_first_joint'
+ 39: 'right_pinky_finger2', # 'right_pinky_second_joint'
+ 40: 'right_pinky_finger_third_joint', # 'right_pinky_third_joint'
+
+ 41: 'right_wrist',
+
+ 42: 'left_thumb4', # 'left_thumb_tip'
+ 43: 'left_thumb3', # 'left_thumb_first_joint'
+ 44: 'left_thumb2', # 'left_thumb_second_joint'
+ 45: 'left_thumb_third_joint', # 'left_thumb_third_joint'
+
+ 46: 'left_forefinger4', # 'left_index_tip'
+ 47: 'left_forefinger3', # 'left_index_first_joint'
+ 48: 'left_forefinger2', # 'left_index_second_joint'
+ 49: 'left_forefinger_third_joint', # 'left_index_third_joint'
+
+ 50: 'left_middle_finger4', # 'left_middle_tip'
+ 51: 'left_middle_finger3', # 'left_middle_first_joint'
+ 52: 'left_middle_finger2', # 'left_middle_second_joint'
+ 53: 'left_middle_finger_third_joint', # 'left_middle_third_joint'
+
+ 54: 'left_ring_finger4', # 'left_ring_tip'
+ 55: 'left_ring_finger3', # 'left_ring_first_joint'
+ 56: 'left_ring_finger2', # 'left_ring_second_joint'
+ 57: 'left_ring_finger_third_joint', # 'left_ring_third_joint'
+
+ 58: 'left_pinky_finger4', # 'left_pinky_tip'
+ 59: 'left_pinky_finger3', # 'left_pinky_first_joint'
+ 60: 'left_pinky_finger2', # 'left_pinky_second_joint'
+ 61: 'left_pinky_finger_third_joint', # 'left_pinky_third_joint'
+
+ 62: 'left_wrist', # 'left_wrist'
+
+ 63: 'left_olecranon',
+ 64: 'right_olecranon',
+ 65: 'left_cubital_fossa',
+ 66: 'right_cubital_fossa',
+ 67: 'left_acromion',
+ 68: 'right_acromion',
+ 69: 'neck',
+ 70: 'center_of_glabella',
+ 71: 'center_of_nose_root',
+ 72: 'tip_of_nose_bridge',
+ 73: 'midpoint_1_of_nose_bridge',
+ 74: 'midpoint_2_of_nose_bridge',
+ 75: 'midpoint_3_of_nose_bridge',
+ 76: 'center_of_labiomental_groove',
+ 77: 'tip_of_chin',
+ 78: 'upper_startpoint_of_r_eyebrow',
+ 79: 'lower_startpoint_of_r_eyebrow',
+ 80: 'end_of_r_eyebrow',
+ 81: 'upper_midpoint_1_of_r_eyebrow',
+ 82: 'lower_midpoint_1_of_r_eyebrow',
+ 83: 'upper_midpoint_2_of_r_eyebrow',
+ 84: 'upper_midpoint_3_of_r_eyebrow',
+ 85: 'lower_midpoint_2_of_r_eyebrow',
+ 86: 'lower_midpoint_3_of_r_eyebrow',
+ 87: 'upper_startpoint_of_l_eyebrow',
+ 88: 'lower_startpoint_of_l_eyebrow',
+ 89: 'end_of_l_eyebrow',
+ 90: 'upper_midpoint_1_of_l_eyebrow',
+ 91: 'lower_midpoint_1_of_l_eyebrow',
+ 92: 'upper_midpoint_2_of_l_eyebrow',
+ 93: 'upper_midpoint_3_of_l_eyebrow',
+ 94: 'lower_midpoint_2_of_l_eyebrow',
+ 95: 'lower_midpoint_3_of_l_eyebrow',
+ 96: 'l_inner_end_of_upper_lash_line',
+ 97: 'l_outer_end_of_upper_lash_line',
+ 98: 'l_centerpoint_of_upper_lash_line',
+ 99: 'l_midpoint_2_of_upper_lash_line',
+ 100: 'l_midpoint_1_of_upper_lash_line',
+ 101: 'l_midpoint_6_of_upper_lash_line',
+ 102: 'l_midpoint_5_of_upper_lash_line',
+ 103: 'l_midpoint_4_of_upper_lash_line',
+ 104: 'l_midpoint_3_of_upper_lash_line',
+ 105: 'l_outer_end_of_upper_eyelid_line',
+ 106: 'l_midpoint_6_of_upper_eyelid_line',
+ 107: 'l_midpoint_2_of_upper_eyelid_line',
+ 108: 'l_midpoint_5_of_upper_eyelid_line',
+ 109: 'l_centerpoint_of_upper_eyelid_line',
+ 110: 'l_midpoint_4_of_upper_eyelid_line',
+ 111: 'l_midpoint_1_of_upper_eyelid_line',
+ 112: 'l_midpoint_3_of_upper_eyelid_line',
+ 113: 'l_midpoint_6_of_upper_crease_line',
+ 114: 'l_midpoint_2_of_upper_crease_line',
+ 115: 'l_midpoint_5_of_upper_crease_line',
+ 116: 'l_centerpoint_of_upper_crease_line',
+ 117: 'l_midpoint_4_of_upper_crease_line',
+ 118: 'l_midpoint_1_of_upper_crease_line',
+ 119: 'l_midpoint_3_of_upper_crease_line',
+ 120: 'r_inner_end_of_upper_lash_line',
+ 121: 'r_outer_end_of_upper_lash_line',
+ 122: 'r_centerpoint_of_upper_lash_line',
+ 123: 'r_midpoint_1_of_upper_lash_line',
+ 124: 'r_midpoint_2_of_upper_lash_line',
+ 125: 'r_midpoint_3_of_upper_lash_line',
+ 126: 'r_midpoint_4_of_upper_lash_line',
+ 127: 'r_midpoint_5_of_upper_lash_line',
+ 128: 'r_midpoint_6_of_upper_lash_line',
+ 129: 'r_outer_end_of_upper_eyelid_line',
+ 130: 'r_midpoint_3_of_upper_eyelid_line',
+ 131: 'r_midpoint_1_of_upper_eyelid_line',
+ 132: 'r_midpoint_4_of_upper_eyelid_line',
+ 133: 'r_centerpoint_of_upper_eyelid_line',
+ 134: 'r_midpoint_5_of_upper_eyelid_line',
+ 135: 'r_midpoint_2_of_upper_eyelid_line',
+ 136: 'r_midpoint_6_of_upper_eyelid_line',
+ 137: 'r_midpoint_3_of_upper_crease_line',
+ 138: 'r_midpoint_1_of_upper_crease_line',
+ 139: 'r_midpoint_4_of_upper_crease_line',
+ 140: 'r_centerpoint_of_upper_crease_line',
+ 141: 'r_midpoint_5_of_upper_crease_line',
+ 142: 'r_midpoint_2_of_upper_crease_line',
+ 143: 'r_midpoint_6_of_upper_crease_line',
+ 144: 'l_inner_end_of_lower_lash_line',
+ 145: 'l_outer_end_of_lower_lash_line',
+ 146: 'l_centerpoint_of_lower_lash_line',
+ 147: 'l_midpoint_2_of_lower_lash_line',
+ 148: 'l_midpoint_1_of_lower_lash_line',
+ 149: 'l_midpoint_6_of_lower_lash_line',
+ 150: 'l_midpoint_5_of_lower_lash_line',
+ 151: 'l_midpoint_4_of_lower_lash_line',
+ 152: 'l_midpoint_3_of_lower_lash_line',
+ 153: 'l_outer_end_of_lower_eyelid_line',
+ 154: 'l_midpoint_6_of_lower_eyelid_line',
+ 155: 'l_midpoint_2_of_lower_eyelid_line',
+ 156: 'l_midpoint_5_of_lower_eyelid_line',
+ 157: 'l_centerpoint_of_lower_eyelid_line',
+ 158: 'l_midpoint_4_of_lower_eyelid_line',
+ 159: 'l_midpoint_1_of_lower_eyelid_line',
+ 160: 'l_midpoint_3_of_lower_eyelid_line',
+ 161: 'r_inner_end_of_lower_lash_line',
+ 162: 'r_outer_end_of_lower_lash_line',
+ 163: 'r_centerpoint_of_lower_lash_line',
+ 164: 'r_midpoint_1_of_lower_lash_line',
+ 165: 'r_midpoint_2_of_lower_lash_line',
+ 166: 'r_midpoint_3_of_lower_lash_line',
+ 167: 'r_midpoint_4_of_lower_lash_line',
+ 168: 'r_midpoint_5_of_lower_lash_line',
+ 169: 'r_midpoint_6_of_lower_lash_line',
+ 170: 'r_outer_end_of_lower_eyelid_line',
+ 171: 'r_midpoint_3_of_lower_eyelid_line',
+ 172: 'r_midpoint_1_of_lower_eyelid_line',
+ 173: 'r_midpoint_4_of_lower_eyelid_line',
+ 174: 'r_centerpoint_of_lower_eyelid_line',
+ 175: 'r_midpoint_5_of_lower_eyelid_line',
+ 176: 'r_midpoint_2_of_lower_eyelid_line',
+ 177: 'r_midpoint_6_of_lower_eyelid_line',
+ 178: 'tip_of_nose',
+ 179: 'bottom_center_of_nose',
+ 180: 'r_outer_corner_of_nose',
+ 181: 'l_outer_corner_of_nose',
+ 182: 'inner_corner_of_r_nostril',
+ 183: 'outer_corner_of_r_nostril',
+ 184: 'upper_corner_of_r_nostril',
+ 185: 'inner_corner_of_l_nostril',
+ 186: 'outer_corner_of_l_nostril',
+ 187: 'upper_corner_of_l_nostril',
+ 188: 'r_outer_corner_of_mouth',
+ 189: 'l_outer_corner_of_mouth',
+ 190: 'center_of_cupid_bow',
+ 191: 'center_of_lower_outer_lip',
+ 192: 'midpoint_1_of_upper_outer_lip',
+ 193: 'midpoint_2_of_upper_outer_lip',
+ 194: 'midpoint_1_of_lower_outer_lip',
+ 195: 'midpoint_2_of_lower_outer_lip',
+ 196: 'midpoint_3_of_upper_outer_lip',
+ 197: 'midpoint_4_of_upper_outer_lip',
+ 198: 'midpoint_5_of_upper_outer_lip',
+ 199: 'midpoint_6_of_upper_outer_lip',
+ 200: 'midpoint_3_of_lower_outer_lip',
+ 201: 'midpoint_4_of_lower_outer_lip',
+ 202: 'midpoint_5_of_lower_outer_lip',
+ 203: 'midpoint_6_of_lower_outer_lip',
+ 204: 'r_inner_corner_of_mouth',
+ 205: 'l_inner_corner_of_mouth',
+ 206: 'center_of_upper_inner_lip',
+ 207: 'center_of_lower_inner_lip',
+ 208: 'midpoint_1_of_upper_inner_lip',
+ 209: 'midpoint_2_of_upper_inner_lip',
+ 210: 'midpoint_1_of_lower_inner_lip',
+ 211: 'midpoint_2_of_lower_inner_lip',
+ 212: 'midpoint_3_of_upper_inner_lip',
+ 213: 'midpoint_4_of_upper_inner_lip',
+ 214: 'midpoint_5_of_upper_inner_lip',
+ 215: 'midpoint_6_of_upper_inner_lip',
+ 216: 'midpoint_3_of_lower_inner_lip',
+ 217: 'midpoint_4_of_lower_inner_lip',
+ 218: 'midpoint_5_of_lower_inner_lip',
+ 219: 'midpoint_6_of_lower_inner_lip',
+ 220: 'teeth',
+ 221: 'teeth',
+ 222: 'teeth',
+ 223: 'teeth',
+ 224: 'teeth',
+ 225: 'teeth',
+ 226: 'teeth',
+ 227: 'teeth',
+ 228: 'teeth',
+ 229: 'teeth',
+ 230: 'teeth',
+ 231: 'teeth',
+ 232: 'teeth',
+ 233: 'teeth',
+ 234: 'teeth',
+ 235: 'teeth',
+ 236: 'teeth',
+ 237: 'teeth',
+ 238: 'teeth',
+ 239: 'teeth',
+ 240: 'teeth',
+ 241: 'teeth',
+ 242: 'teeth',
+ 243: 'teeth',
+ 244: 'teeth',
+ 245: 'teeth',
+ 246: 'teeth',
+ 247: 'teeth',
+ 248: 'teeth',
+ 249: 'teeth',
+ 250: 'teeth',
+ 251: 'teeth',
+ 252: 'teeth',
+ 253: 'teeth',
+ 254: 'teeth',
+ 255: 'teeth',
+ 256: 'l_top_end_of_inferior_crus',
+ 257: 'l_top_end_of_superior_crus',
+ 258: 'l_start_of_antihelix',
+ 259: 'l_end_of_antihelix',
+ 260: 'l_midpoint_1_of_antihelix',
+ 261: 'l_midpoint_1_of_inferior_crus',
+ 262: 'l_midpoint_2_of_antihelix',
+ 263: 'l_midpoint_3_of_antihelix',
+ 264: 'l_point_1_of_inner_helix',
+ 265: 'l_point_2_of_inner_helix',
+ 266: 'l_point_3_of_inner_helix',
+ 267: 'l_point_4_of_inner_helix',
+ 268: 'l_point_5_of_inner_helix',
+ 269: 'l_point_6_of_inner_helix',
+ 270: 'l_point_7_of_inner_helix',
+ 271: 'l_highest_point_of_antitragus',
+ 272: 'l_bottom_point_of_tragus',
+ 273: 'l_protruding_point_of_tragus',
+ 274: 'l_top_point_of_tragus',
+ 275: 'l_start_point_of_crus_of_helix',
+ 276: 'l_deepest_point_of_concha',
+ 277: 'l_tip_of_ear_lobe',
+ 278: 'l_midpoint_between_22_15',
+ 279: 'l_bottom_connecting_point_of_ear_lobe',
+ 280: 'l_top_connecting_point_of_helix',
+ 281: 'l_point_8_of_inner_helix',
+ 282: 'r_top_end_of_inferior_crus',
+ 283: 'r_top_end_of_superior_crus',
+ 284: 'r_start_of_antihelix',
+ 285: 'r_end_of_antihelix',
+ 286: 'r_midpoint_1_of_antihelix',
+ 287: 'r_midpoint_1_of_inferior_crus',
+ 288: 'r_midpoint_2_of_antihelix',
+ 289: 'r_midpoint_3_of_antihelix',
+ 290: 'r_point_1_of_inner_helix',
+ 291: 'r_point_8_of_inner_helix',
+ 292: 'r_point_3_of_inner_helix',
+ 293: 'r_point_4_of_inner_helix',
+ 294: 'r_point_5_of_inner_helix',
+ 295: 'r_point_6_of_inner_helix',
+ 296: 'r_point_7_of_inner_helix',
+ 297: 'r_highest_point_of_antitragus',
+ 298: 'r_bottom_point_of_tragus',
+ 299: 'r_protruding_point_of_tragus',
+ 300: 'r_top_point_of_tragus',
+ 301: 'r_start_point_of_crus_of_helix',
+ 302: 'r_deepest_point_of_concha',
+ 303: 'r_tip_of_ear_lobe',
+ 304: 'r_midpoint_between_22_15',
+ 305: 'r_bottom_connecting_point_of_ear_lobe',
+ 306: 'r_top_connecting_point_of_helix',
+ 307: 'r_point_2_of_inner_helix',
+ 308: 'l_center_of_iris',
+ 309: 'l_border_of_iris_3',
+ 310: 'l_border_of_iris_midpoint_1',
+ 311: 'l_border_of_iris_12',
+ 312: 'l_border_of_iris_midpoint_4',
+ 313: 'l_border_of_iris_9',
+ 314: 'l_border_of_iris_midpoint_3',
+ 315: 'l_border_of_iris_6',
+ 316: 'l_border_of_iris_midpoint_2',
+ 317: 'r_center_of_iris',
+ 318: 'r_border_of_iris_3',
+ 319: 'r_border_of_iris_midpoint_1',
+ 320: 'r_border_of_iris_12',
+ 321: 'r_border_of_iris_midpoint_4',
+ 322: 'r_border_of_iris_9',
+ 323: 'r_border_of_iris_midpoint_3',
+ 324: 'r_border_of_iris_6',
+ 325: 'r_border_of_iris_midpoint_2',
+ 326: 'l_center_of_pupil',
+ 327: 'l_border_of_pupil_3',
+ 328: 'l_border_of_pupil_midpoint_1',
+ 329: 'l_border_of_pupil_12',
+ 330: 'l_border_of_pupil_midpoint_4',
+ 331: 'l_border_of_pupil_9',
+ 332: 'l_border_of_pupil_midpoint_3',
+ 333: 'l_border_of_pupil_6',
+ 334: 'l_border_of_pupil_midpoint_2',
+ 335: 'r_center_of_pupil',
+ 336: 'r_border_of_pupil_3',
+ 337: 'r_border_of_pupil_midpoint_1',
+ 338: 'r_border_of_pupil_12',
+ 339: 'r_border_of_pupil_midpoint_4',
+ 340: 'r_border_of_pupil_9',
+ 341: 'r_border_of_pupil_midpoint_3',
+ 342: 'r_border_of_pupil_6',
+ 343: 'r_border_of_pupil_midpoint_2',
+ },
+ keypoint_info={
+ 0: dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1: dict(name='left_eye', id=1, color=[51, 153, 255], type='upper', swap='right_eye'),
+ 2: dict(name='right_eye', id=2, color=[51, 153, 255], type='upper', swap='left_eye'),
+ 3: dict(name='left_ear', id=3, color=[51, 153, 255], type='upper', swap='right_ear'),
+ 4: dict(name='right_ear', id=4, color=[51, 153, 255], type='upper', swap='left_ear'),
+ 5: dict(name='left_shoulder', id=5, color=[51, 153, 255], type='upper', swap='right_shoulder'),
+ 6: dict(name='right_shoulder', id=6, color=[51, 153, 255], type='upper', swap='left_shoulder'),
+ 7: dict(name='left_elbow', id=7, color=[51, 153, 255], type='upper', swap='right_elbow'),
+ 8: dict(name='right_elbow', id=8, color=[51, 153, 255], type='upper', swap='left_elbow'),
+ 9: dict(name='left_hip', id=9, color=[51, 153, 255], type='lower', swap='right_hip'),
+ 10: dict(name='right_hip', id=10, color=[51, 153, 255], type='lower', swap='left_hip'),
+ 11: dict(name='left_knee', id=11, color=[51, 153, 255], type='lower', swap='right_knee'),
+ 12: dict(name='right_knee', id=12, color=[51, 153, 255], type='lower', swap='left_knee'),
+ 13: dict(name='left_ankle', id=13, color=[51, 153, 255], type='lower', swap='right_ankle'),
+ 14: dict(name='right_ankle', id=14, color=[51, 153, 255], type='lower', swap='left_ankle'),
+
+ 15: dict(name='left_big_toe', id=15, color=[51, 153, 255], type='lower', swap='right_big_toe'),
+ 16: dict(name='left_small_toe', id=16, color=[51, 153, 255], type='lower', swap='right_small_toe'),
+ 17: dict(name='left_heel', id=17, color=[51, 153, 255], type='lower', swap='right_heel'),
+ 18: dict(name='right_big_toe', id=18, color=[51, 153, 255], type='lower', swap='left_big_toe'),
+ 19: dict(name='right_small_toe', id=19, color=[51, 153, 255], type='lower', swap='left_small_toe'),
+ 20: dict(name='right_heel', id=20, color=[51, 153, 255], type='lower', swap='left_heel'),
+
+ 21: dict(name='right_thumb4', id=21, color=[51, 153, 255], type='upper', swap='left_thumb4'),
+ 22: dict(name='right_thumb3', id=22, color=[51, 153, 255], type='upper', swap='left_thumb3'),
+ 23: dict(name='right_thumb2', id=23, color=[51, 153, 255], type='upper', swap='left_thumb2'),
+ 24: dict(name='right_thumb_third_joint', id=24, color=[51, 153, 255], type='upper', swap='left_thumb_third_joint'),
+
+ 25: dict(name='right_forefinger4', id=25, color=[51, 153, 255], type='upper', swap='left_forefinger4'),
+ 26: dict(name='right_forefinger3', id=26, color=[51, 153, 255], type='upper', swap='left_forefinger3'),
+ 27: dict(name='right_forefinger2', id=27, color=[51, 153, 255], type='upper', swap='left_forefinger2'),
+ 28: dict(name='right_forefinger_third_joint', id=28, color=[51, 153, 255], type='upper', swap='left_forefinger_third_joint'),
+
+ 29: dict(name='right_middle_finger4', id=29, color=[51, 153, 255], type='upper', swap='left_middle_finger4'),
+ 30: dict(name='right_middle_finger3', id=30, color=[51, 153, 255], type='upper', swap='left_middle_finger3'),
+ 31: dict(name='right_middle_finger2', id=31, color=[51, 153, 255], type='upper', swap='left_middle_finger2'),
+ 32: dict(name='right_middle_finger_third_joint', id=32, color=[51, 153, 255], type='upper', swap='left_middle_finger_third_joint'),
+
+ 33: dict(name='right_ring_finger4', id=33, color=[51, 153, 255], type='upper', swap='left_ring_finger4'),
+ 34: dict(name='right_ring_finger3', id=34, color=[51, 153, 255], type='upper', swap='left_ring_finger3'),
+ 35: dict(name='right_ring_finger2', id=35, color=[51, 153, 255], type='upper', swap='left_ring_finger2'),
+ 36: dict(name='right_ring_finger_third_joint', id=36, color=[51, 153, 255], type='upper', swap='left_ring_finger_third_joint'),
+
+ 37: dict(name='right_pinky_finger4', id=37, color=[51, 153, 255], type='upper', swap='left_pinky_finger4'),
+ 38: dict(name='right_pinky_finger3', id=38, color=[51, 153, 255], type='upper', swap='left_pinky_finger3'),
+ 39: dict(name='right_pinky_finger2', id=39, color=[51, 153, 255], type='upper', swap='left_pinky_finger2'),
+ 40: dict(name='right_pinky_finger_third_joint', id=40, color=[51, 153, 255], type='upper', swap='left_pinky_finger_third_joint'),
+
+ 41: dict(name='right_wrist', id=41, color=[51, 153, 255], type='upper', swap='left_wrist'),
+
+ 42: dict(name='left_thumb4', id=42, color=[51, 153, 255], type='upper', swap='right_thumb4'),
+ 43: dict(name='left_thumb3', id=43, color=[51, 153, 255], type='upper', swap='right_thumb3'),
+ 44: dict(name='left_thumb2', id=44, color=[51, 153, 255], type='upper', swap='right_thumb2'),
+ 45: dict(name='left_thumb_third_joint', id=45, color=[51, 153, 255], type='upper', swap='right_thumb_third_joint'), ## doesnt match with wholebody
+
+ 46: dict(name='left_forefinger4', id=46, color=[51, 153, 255], type='upper', swap='right_forefinger4'),
+ 47: dict(name='left_forefinger3', id=47, color=[51, 153, 255], type='upper', swap='right_forefinger3'),
+ 48: dict(name='left_forefinger2', id=48, color=[51, 153, 255], type='upper', swap='right_forefinger2'),
+ 49: dict(name='left_forefinger_third_joint', id=49, color=[51, 153, 255], type='upper', swap='right_forefinger_third_joint'),
+
+ 50: dict(name='left_middle_finger4', id=50, color=[51, 153, 255], type='upper', swap='right_middle_finger4'),
+ 51: dict(name='left_middle_finger3', id=51, color=[51, 153, 255], type='upper', swap='right_middle_finger3'),
+ 52: dict(name='left_middle_finger2', id=52, color=[51, 153, 255], type='upper', swap='right_middle_finger2'),
+ 53: dict(name='left_middle_finger_third_joint', id=53, color=[51, 153, 255], type='upper', swap='right_middle_finger_third_joint'),
+
+ 54: dict(name='left_ring_finger4', id=54, color=[51, 153, 255], type='upper', swap='right_ring_finger4'),
+ 55: dict(name='left_ring_finger3', id=55, color=[51, 153, 255], type='upper', swap='right_ring_finger3'),
+ 56: dict(name='left_ring_finger2', id=56, color=[51, 153, 255], type='upper', swap='right_ring_finger2'),
+ 57: dict(name='left_ring_finger_third_joint', id=57, color=[51, 153, 255], type='upper', swap='right_ring_finger_third_joint'),
+
+ 58: dict(name='left_pinky_finger4', id=58, color=[51, 153, 255], type='upper', swap='right_pinky_finger4'),
+ 59: dict(name='left_pinky_finger3', id=59, color=[51, 153, 255], type='upper', swap='right_pinky_finger3'),
+ 60: dict(name='left_pinky_finger2', id=60, color=[51, 153, 255], type='upper', swap='right_pinky_finger2'),
+ 61: dict(name='left_pinky_finger_third_joint', id=61, color=[51, 153, 255], type='upper', swap='right_pinky_finger_third_joint'),
+
+ 62: dict(name='left_wrist', id=62, color=[51, 153, 255], type='upper', swap='right_wrist'),
+
+ 63: dict(name='left_olecranon', id=63, color=[51, 153, 255], type='', swap='right_olecranon'),
+ 64: dict(name='right_olecranon', id=64, color=[51, 153, 255], type='', swap='left_olecranon'),
+ 65: dict(name='left_cubital_fossa', id=65, color=[51, 153, 255], type='', swap='right_cubital_fossa'),
+ 66: dict(name='right_cubital_fossa', id=66, color=[51, 153, 255], type='', swap='left_cubital_fossa'),
+ 67: dict(name='left_acromion', id=67, color=[51, 153, 255], type='', swap='right_acromion'),
+ 68: dict(name='right_acromion', id=68, color=[51, 153, 255], type='', swap='left_acromion'),
+ 69: dict(name='neck', id=69, color=[51, 153, 255], type='', swap=''),
+
+ # Jaw line
+ 70: dict(name='center_of_glabella', id=70, color=[255, 255, 255], type='', swap=''),
+ 71: dict(name='tip_of_chin', id=71, color=[255, 255, 255], type='', swap=''),
+
+ # Right eyebrow
+ 72: dict(name='upper_startpoint_of_r_eyebrow', id=72, color=[255, 255, 255], type='upper', swap='upper_startpoint_of_l_eyebrow'),
+ 73: dict(name='end_of_r_eyebrow', id=73, color=[255, 255, 255], type='upper', swap='end_of_l_eyebrow'),
+ 74: dict(name='upper_midpoint_1_of_r_eyebrow', id=74, color=[255, 255, 255], type='upper', swap='upper_midpoint_1_of_l_eyebrow'),
+ 75: dict(name='upper_midpoint_2_of_r_eyebrow', id=75, color=[255, 255, 255], type='upper', swap='upper_midpoint_3_of_l_eyebrow'),
+ 76: dict(name='upper_midpoint_3_of_r_eyebrow', id=76, color=[255, 255, 255], type='upper', swap='upper_midpoint_2_of_l_eyebrow'),
+
+ # Left eyebrow
+ 77: dict(name='upper_startpoint_of_l_eyebrow', id=77, color=[255, 255, 255], type='upper', swap='upper_startpoint_of_r_eyebrow'),
+ 78: dict(name='end_of_l_eyebrow', id=78, color=[255, 255, 255], type='upper', swap='end_of_r_eyebrow'),
+ 79: dict(name='upper_midpoint_1_of_l_eyebrow', id=79, color=[255, 255, 255], type='upper', swap='upper_midpoint_1_of_r_eyebrow'),
+ 80: dict(name='upper_midpoint_2_of_l_eyebrow', id=80, color=[255, 255, 255], type='upper', swap='upper_midpoint_3_of_r_eyebrow'),
+ 81: dict(name='upper_midpoint_3_of_l_eyebrow', id=81, color=[255, 255, 255], type='upper', swap='upper_midpoint_2_of_r_eyebrow'),
+
+ # Nose
+ 82: dict(name='center_of_nose_root', id=82, color=[255, 255, 255], type='upper', swap=''),
+ 83: dict(name='tip_of_nose_bridge', id=83, color=[255, 255, 255], type='upper', swap=''),
+ 84: dict(name='midpoint_1_of_nose_bridge', id=84, color=[255, 255, 255], type='upper', swap=''),
+ 85: dict(name='midpoint_2_of_nose_bridge', id=85, color=[255, 255, 255], type='upper', swap=''),
+ 86: dict(name='midpoint_3_of_nose_bridge', id=86, color=[255, 255, 255], type='upper', swap=''),
+ 87: dict(name='center_of_labiomental_groove', id=87, color=[255, 255, 255], type='upper', swap=''),
+
+ # Right eye
+ 88: dict(name='l_inner_end_of_upper_lash_line', id=88, color=[192, 64, 128], type='upper', swap='r_inner_end_of_upper_lash_line'),
+ 89: dict(name='l_outer_end_of_upper_lash_line', id=89, color=[192, 64, 128], type='upper', swap='r_outer_end_of_upper_lash_line'),
+ 90: dict(name='l_centerpoint_of_upper_lash_line', id=90, color=[192, 64, 128], type='upper', swap='r_centerpoint_of_upper_lash_line'),
+ 91: dict(name='l_inner_end_of_lower_lash_line', id=91, color=[64, 192, 128], type='upper', swap='r_inner_end_of_lower_lash_line'),
+ 92: dict(name='l_outer_end_of_lower_lash_line', id=92, color=[64, 192, 128], type='upper', swap='r_outer_end_of_lower_lash_line'),
+ 93: dict(name='l_centerpoint_of_lower_lash_line', id=93, color=[64, 192, 128], type='upper', swap='r_centerpoint_of_lower_lash_line'),
+
+ # Left eye
+ 94: dict(name='r_inner_end_of_upper_lash_line', id=94, color=[64, 32, 192], type='upper', swap='l_inner_end_of_upper_lash_line'),
+ 95: dict(name='r_outer_end_of_upper_lash_line', id=95, color=[64, 32, 192], type='upper', swap='l_outer_end_of_upper_lash_line'),
+ 96: dict(name='r_centerpoint_of_upper_lash_line', id=96, color=[64, 32, 192], type='upper', swap='l_centerpoint_of_upper_lash_line'),
+ 97: dict(name='r_inner_end_of_lower_lash_line', id=97, color=[64, 192, 32], type='upper', swap='l_inner_end_of_lower_lash_line'),
+ 98: dict(name='r_outer_end_of_lower_lash_line', id=98, color=[64, 192, 32], type='upper', swap='l_outer_end_of_lower_lash_line'),
+ 99: dict(name='r_centerpoint_of_lower_lash_line', id=99, color=[64, 192, 32], type='upper', swap='l_centerpoint_of_lower_lash_line'),
+
+ # Mouth
+ 100: dict(name='r_outer_corner_of_mouth', id=100, color=[192, 0, 0], type='upper', swap='l_outer_corner_of_mouth'),
+ 101: dict(name='l_outer_corner_of_mouth', id=101, color=[192, 0, 0], type='upper', swap='r_outer_corner_of_mouth'),
+ 102: dict(name='center_of_cupid_bow', id=102, color=[192, 0, 0], type='upper', swap=''),
+ 103: dict(name='center_of_lower_outer_lip', id=103, color=[192, 0, 0], type='upper', swap=''),
+ 104: dict(name='midpoint_1_of_upper_outer_lip', id=104, color=[192, 0, 0], type='upper', swap='midpoint_2_of_upper_outer_lip'),
+ 105: dict(name='midpoint_2_of_upper_outer_lip', id=105, color=[192, 0, 0], type='upper', swap='midpoint_1_of_upper_outer_lip'),
+ 106: dict(name='midpoint_1_of_lower_outer_lip', id=106, color=[192, 0, 0], type='upper', swap='midpoint_2_of_lower_outer_lip'),
+ 107: dict(name='midpoint_2_of_lower_outer_lip', id=107, color=[192, 0, 0], type='upper', swap='midpoint_1_of_lower_outer_lip'),
+ 108: dict(name='r_inner_corner_of_mouth', id=108, color=[0, 192, 192], type='upper', swap='l_inner_corner_of_mouth'),
+ 109: dict(name='l_inner_corner_of_mouth', id=109, color=[0, 192, 192], type='upper', swap='r_inner_corner_of_mouth'),
+ 110: dict(name='center_of_upper_inner_lip', id=110, color=[0, 192, 192], type='upper', swap=''),
+ 111: dict(name='center_of_lower_inner_lip', id=111, color=[0, 192, 192], type='upper', swap=''),
+ 112: dict(name='midpoint_1_of_upper_inner_lip', id=112, color=[0, 192, 192], type='upper', swap='midpoint_2_of_upper_inner_lip'),
+ 113: dict(name='midpoint_2_of_upper_inner_lip', id=113, color=[0, 192, 192], type='upper', swap='midpoint_1_of_upper_inner_lip'),
+ 114: dict(name='midpoint_1_of_lower_inner_lip', id=114, color=[0, 192, 192], type='upper', swap='midpoint_2_of_lower_inner_lip'),
+ 115: dict(name='midpoint_2_of_lower_inner_lip', id=115, color=[0, 192, 192], type='upper', swap='midpoint_1_of_lower_inner_lip'),
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+ 6:
+ dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(
+ link=('left_shoulder', 'right_shoulder'),
+ id=7,
+ color=[51, 153, 255]),
+ 8:
+ dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('left_eye', 'right_eye'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('nose', 'left_eye'), id=13, color=[51, 153, 255]),
+ 14:
+ dict(link=('nose', 'right_eye'), id=14, color=[51, 153, 255]),
+ 15:
+ dict(link=('left_eye', 'left_ear'), id=15, color=[51, 153, 255]),
+ 16:
+ dict(link=('right_eye', 'right_ear'), id=16, color=[51, 153, 255]),
+ 17:
+ dict(link=('left_ear', 'left_shoulder'), id=17, color=[51, 153, 255]),
+ 18:
+ dict(
+ link=('right_ear', 'right_shoulder'), id=18, color=[51, 153, 255]),
+ 19:
+ dict(link=('left_ankle', 'left_big_toe'), id=19, color=[0, 255, 0]),
+ 20:
+ dict(link=('left_ankle', 'left_small_toe'), id=20, color=[0, 255, 0]),
+ 21:
+ dict(link=('left_ankle', 'left_heel'), id=21, color=[0, 255, 0]),
+ 22:
+ dict(
+ link=('right_ankle', 'right_big_toe'), id=22, color=[255, 128, 0]),
+ 23:
+ dict(
+ link=('right_ankle', 'right_small_toe'),
+ id=23,
+ color=[255, 128, 0]),
+ 24:
+ dict(link=('right_ankle', 'right_heel'), id=24, color=[255, 128, 0]),
+ 25:
+ dict(
+ link=('left_wrist', 'left_thumb_third_joint'), id=25, color=[255, 128,
+ 0]),
+ 26:
+ dict(link=('left_thumb_third_joint', 'left_thumb2'), id=26, color=[255, 128, 0]),
+ 27:
+ dict(link=('left_thumb2', 'left_thumb3'), id=27, color=[255, 128, 0]),
+ 28:
+ dict(link=('left_thumb3', 'left_thumb4'), id=28, color=[255, 128, 0]),
+ 29:
+ dict(
+ link=('left_wrist', 'left_forefinger_third_joint'),
+ id=29,
+ color=[255, 153, 255]),
+ 30:
+ dict(
+ link=('left_forefinger_third_joint', 'left_forefinger2'),
+ id=30,
+ color=[255, 153, 255]),
+ 31:
+ dict(
+ link=('left_forefinger2', 'left_forefinger3'),
+ id=31,
+ color=[255, 153, 255]),
+ 32:
+ dict(
+ link=('left_forefinger3', 'left_forefinger4'),
+ id=32,
+ color=[255, 153, 255]),
+ 33:
+ dict(
+ link=('left_wrist', 'left_middle_finger_third_joint'),
+ id=33,
+ color=[102, 178, 255]),
+ 34:
+ dict(
+ link=('left_middle_finger_third_joint', 'left_middle_finger2'),
+ id=34,
+ color=[102, 178, 255]),
+ 35:
+ dict(
+ link=('left_middle_finger2', 'left_middle_finger3'),
+ id=35,
+ color=[102, 178, 255]),
+ 36:
+ dict(
+ link=('left_middle_finger3', 'left_middle_finger4'),
+ id=36,
+ color=[102, 178, 255]),
+ 37:
+ dict(
+ link=('left_wrist', 'left_ring_finger_third_joint'),
+ id=37,
+ color=[255, 51, 51]),
+ 38:
+ dict(
+ link=('left_ring_finger_third_joint', 'left_ring_finger2'),
+ id=38,
+ color=[255, 51, 51]),
+ 39:
+ dict(
+ link=('left_ring_finger2', 'left_ring_finger3'),
+ id=39,
+ color=[255, 51, 51]),
+ 40:
+ dict(
+ link=('left_ring_finger3', 'left_ring_finger4'),
+ id=40,
+ color=[255, 51, 51]),
+ 41:
+ dict(
+ link=('left_wrist', 'left_pinky_finger_third_joint'),
+ id=41,
+ color=[0, 255, 0]),
+ 42:
+ dict(
+ link=('left_pinky_finger_third_joint', 'left_pinky_finger2'),
+ id=42,
+ color=[0, 255, 0]),
+ 43:
+ dict(
+ link=('left_pinky_finger2', 'left_pinky_finger3'),
+ id=43,
+ color=[0, 255, 0]),
+ 44:
+ dict(
+ link=('left_pinky_finger3', 'left_pinky_finger4'),
+ id=44,
+ color=[0, 255, 0]),
+ 45:
+ dict(
+ link=('right_wrist', 'right_thumb_third_joint'),
+ id=45,
+ color=[255, 128, 0]),
+ 46:
+ dict(
+ link=('right_thumb_third_joint', 'right_thumb2'), id=46, color=[255, 128, 0]),
+ 47:
+ dict(
+ link=('right_thumb2', 'right_thumb3'), id=47, color=[255, 128, 0]),
+ 48:
+ dict(
+ link=('right_thumb3', 'right_thumb4'), id=48, color=[255, 128, 0]),
+ 49:
+ dict(
+ link=('right_wrist', 'right_forefinger_third_joint'),
+ id=49,
+ color=[255, 153, 255]),
+ 50:
+ dict(
+ link=('right_forefinger_third_joint', 'right_forefinger2'),
+ id=50,
+ color=[255, 153, 255]),
+ 51:
+ dict(
+ link=('right_forefinger2', 'right_forefinger3'),
+ id=51,
+ color=[255, 153, 255]),
+ 52:
+ dict(
+ link=('right_forefinger3', 'right_forefinger4'),
+ id=52,
+ color=[255, 153, 255]),
+ 53:
+ dict(
+ link=('right_wrist', 'right_middle_finger_third_joint'),
+ id=53,
+ color=[102, 178, 255]),
+ 54:
+ dict(
+ link=('right_middle_finger_third_joint', 'right_middle_finger2'),
+ id=54,
+ color=[102, 178, 255]),
+ 55:
+ dict(
+ link=('right_middle_finger2', 'right_middle_finger3'),
+ id=55,
+ color=[102, 178, 255]),
+ 56:
+ dict(
+ link=('right_middle_finger3', 'right_middle_finger4'),
+ id=56,
+ color=[102, 178, 255]),
+ 57:
+ dict(
+ link=('right_wrist', 'right_ring_finger_third_joint'),
+ id=57,
+ color=[255, 51, 51]),
+ 58:
+ dict(
+ link=('right_ring_finger_third_joint', 'right_ring_finger2'),
+ id=58,
+ color=[255, 51, 51]),
+ 59:
+ dict(
+ link=('right_ring_finger2', 'right_ring_finger3'),
+ id=59,
+ color=[255, 51, 51]),
+ 60:
+ dict(
+ link=('right_ring_finger3', 'right_ring_finger4'),
+ id=60,
+ color=[255, 51, 51]),
+ 61:
+ dict(
+ link=('right_wrist', 'right_pinky_finger_third_joint'),
+ id=61,
+ color=[0, 255, 0]),
+ 62:
+ dict(
+ link=('right_pinky_finger_third_joint', 'right_pinky_finger2'),
+ id=62,
+ color=[0, 255, 0]),
+ 63:
+ dict(
+ link=('right_pinky_finger2', 'right_pinky_finger3'),
+ id=63,
+ color=[0, 255, 0]),
+ 64:
+ dict(
+ link=('right_pinky_finger3', 'right_pinky_finger4'),
+ id=64,
+ color=[0, 255, 0])
+ },
+ joint_weights=[1.] * 116,
+ body_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',
+ ],
+ foot_keypoint_names=[
+ 'left_big_toe',
+ 'left_small_toe',
+ 'left_heel',
+ 'right_big_toe',
+ 'right_small_toe',
+ 'right_heel'
+ ],
+ left_hand_keypoint_names=[
+ 'left_thumb4',
+ 'left_thumb3',
+ 'left_thumb2',
+ 'left_thumb_third_joint',
+ 'left_forefinger4',
+ 'left_forefinger3',
+ 'left_forefinger2',
+ 'left_forefinger_third_joint',
+ 'left_middle_finger4',
+ 'left_middle_finger3',
+ 'left_middle_finger2',
+ 'left_middle_finger_third_joint',
+ 'left_ring_finger4',
+ 'left_ring_finger3',
+ 'left_ring_finger2',
+ 'left_ring_finger_third_joint',
+ 'left_pinky_finger4',
+ 'left_pinky_finger3',
+ 'left_pinky_finger2',
+ 'left_pinky_finger_third_joint'
+ ],
+ right_hand_keypoint_names=[
+ 'right_thumb4',
+ 'right_thumb3',
+ 'right_thumb2',
+ 'right_thumb_third_joint',
+ 'right_forefinger4',
+ 'right_forefinger3',
+ 'right_forefinger2',
+ 'right_forefinger_third_joint',
+ 'right_middle_finger4',
+ 'right_middle_finger3',
+ 'right_middle_finger2',
+ 'right_middle_finger_third_joint',
+ 'right_ring_finger4',
+ 'right_ring_finger3',
+ 'right_ring_finger2',
+ 'right_ring_finger_third_joint',
+ 'right_pinky_finger4',
+ 'right_pinky_finger3',
+ 'right_pinky_finger2',
+ 'right_pinky_finger_third_joint'
+ ],
+ ## 7 of them
+ extra_keypoint_names=[
+ 'neck',
+ 'left_olecranon',
+ 'right_olecranon',
+ 'left_cubital_fossa',
+ 'right_cubital_fossa',
+ 'left_acromion',
+ 'right_acromion',
+ ],
+ face_keypoint_names = [
+ 'center_of_glabella',
+ 'tip_of_chin',
+ 'upper_startpoint_of_r_eyebrow',
+ 'end_of_r_eyebrow',
+ 'upper_midpoint_1_of_r_eyebrow',
+ 'upper_midpoint_2_of_r_eyebrow',
+ 'upper_midpoint_3_of_r_eyebrow',
+ 'upper_startpoint_of_l_eyebrow',
+ 'end_of_l_eyebrow',
+ 'upper_midpoint_1_of_l_eyebrow',
+ 'upper_midpoint_2_of_l_eyebrow',
+ 'upper_midpoint_3_of_l_eyebrow',
+ 'center_of_nose_root',
+ 'tip_of_nose_bridge',
+ 'midpoint_1_of_nose_bridge',
+ 'midpoint_2_of_nose_bridge',
+ 'midpoint_3_of_nose_bridge',
+ 'center_of_labiomental_groove',
+ 'l_inner_end_of_upper_lash_line',
+ 'l_outer_end_of_upper_lash_line',
+ 'l_centerpoint_of_upper_lash_line',
+ 'l_inner_end_of_lower_lash_line',
+ 'l_outer_end_of_lower_lash_line',
+ 'l_centerpoint_of_lower_lash_line',
+ 'r_inner_end_of_upper_lash_line',
+ 'r_outer_end_of_upper_lash_line',
+ 'r_centerpoint_of_upper_lash_line',
+ 'r_inner_end_of_lower_lash_line',
+ 'r_outer_end_of_lower_lash_line',
+ 'r_centerpoint_of_lower_lash_line',
+ 'r_outer_corner_of_mouth',
+ 'l_outer_corner_of_mouth',
+ 'center_of_cupid_bow',
+ 'center_of_lower_outer_lip',
+ 'midpoint_1_of_upper_outer_lip',
+ 'midpoint_2_of_upper_outer_lip',
+ 'midpoint_1_of_lower_outer_lip',
+ 'midpoint_2_of_lower_outer_lip',
+ 'r_inner_corner_of_mouth',
+ 'l_inner_corner_of_mouth',
+ 'center_of_upper_inner_lip',
+ 'center_of_lower_inner_lip',
+ 'midpoint_1_of_upper_inner_lip',
+ 'midpoint_2_of_upper_inner_lip',
+ 'midpoint_1_of_lower_inner_lip',
+ 'midpoint_2_of_lower_inner_lip'
+ ]
+)
+
+##------------------------------------------------------------------------------------------------------------------
+inverse_original_keypoint_info = {name: id for (id, name) in dataset_info['original_keypoint_info'].items()}
+
+## create index to original mapping
+dataset_info['idx_to_original_idx_mapping'] = {}
+for keypoint_index, keypoint_info in dataset_info['keypoint_info'].items():
+ keypoint_name = keypoint_info['name']
+ dataset_info['idx_to_original_idx_mapping'][keypoint_index] = inverse_original_keypoint_info[keypoint_name]
+
+##------------------------------------------------------------------------------------------------------------------
+## reconfigure in the order of coco_whole_body
+coco_wholebody_keypoint_info = {keypoint_info['name']: keypoint_info for (keypoint_index, keypoint_info) in coco_wholebody_info['keypoint_info'].items()}
+coco_wholebody_to_goliath_mapping = {} ## coco_wholebody_index to goliath_index
+coco_wholebody_to_goliath_keypoint_info = {}
+
+## find out common keypoints between goliath and coco_whole_body
+for (keypoint_index, keypoint_info) in dataset_info['keypoint_info'].items():
+ keypoint_name = keypoint_info['name']
+ keypoint_index_ = keypoint_info['id']
+ assert(keypoint_index == keypoint_index_)
+
+ if keypoint_name in coco_wholebody_keypoint_info.keys():
+ coco_wholebody_to_goliath_keypoint_info[keypoint_name] = coco_wholebody_keypoint_info[keypoint_name]
+ coco_wholebody_to_goliath_mapping[coco_wholebody_keypoint_info[keypoint_name]['id']] = keypoint_info['id']
+
+dataset_info['coco_wholebody_to_goliath_mapping'] = coco_wholebody_to_goliath_mapping ## store the cocowholebody indices
+dataset_info['coco_wholebody_to_goliath_keypoint_info'] = coco_wholebody_to_goliath_keypoint_info
+
+##------------------------------------------------------------------------------------------------------------------
+coco_wholebody_sigmas = {}
+
+## compute the coco_wholebody_sigmas
+for keypoint_index, keypoint_info in coco_wholebody_info['keypoint_info'].items():
+ coco_wholebody_sigmas[keypoint_info['name']] = coco_wholebody_info['sigmas'][keypoint_info['id']]
+
+default_sigma = 0.010 ## for mostly face keypoints
+dataset_info['sigmas'] = [default_sigma]*len(dataset_info['keypoint_info'])
+
+## we copy sigmas from coco_wholebody. Rest are assigned as below:
+custom_sigmas = {
+ 'left_thumb_third_joint': 0.022,
+ 'left_forefinger_third_joint': 0.026,
+ 'left_middle_finger_third_joint': 0.018,
+ 'left_ring_finger_third_joint': 0.017,
+ 'left_pinky_finger_third_joint': 0.02,
+ 'right_thumb_third_joint': 0.022,
+ 'right_forefinger_third_joint': 0.026,
+ 'right_middle_finger_third_joint': 0.018,
+ 'right_ring_finger_third_joint': 0.017,
+ 'right_pinky_finger_third_joint': 0.02,
+ 'neck': 0.079, ## same as shoulder
+ 'left_olecranon': 0.072, ## same as elbow
+ 'right_olecranon': 0.072, ## same as elbow
+ 'left_cubital_fossa': 0.072, ## same as elbow
+ 'right_cubital_fossa': 0.072, ## same as elbow
+ 'left_acromion': 0.079, ## same as shoulder
+ 'right_acromion': 0.079, ## same as shoulder
+}
+
+## copy custom sigmas
+for keypoint_name, sigma in custom_sigmas.items():
+ keypoint_id = -1
+
+ ## search for keypoint id from keypoint name
+ for keypoint_id_ in dataset_info['keypoint_info'].keys():
+ if dataset_info['keypoint_info'][keypoint_id_]['name'] == keypoint_name:
+ keypoint_id = keypoint_id_
+ break
+
+ if keypoint_id != -1:
+ keypoint_info = dataset_info['keypoint_info'][keypoint_id]
+ assert(keypoint_info['name'] == keypoint_name)
+ assert(keypoint_info['id'] == keypoint_id)
+ dataset_info['sigmas'][keypoint_info['id']] = sigma
+
+## copy coco_wholebody sigmas
+for keypoint_index, keypoint_info in dataset_info['keypoint_info'].items():
+ if keypoint_info['name'] in coco_wholebody_sigmas.keys():
+ dataset_info['sigmas'][keypoint_info['id']] = coco_wholebody_sigmas[keypoint_info['name']]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/h36m.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/h36m.py
new file mode 100644
index 0000000000000000000000000000000000000000..c690e4cd34952f4d81727324357b636464d7b6e5
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/h36m.py
@@ -0,0 +1,158 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='h36m',
+ paper_info=dict(
+ author='Ionescu, Catalin and Papava, Dragos and '
+ 'Olaru, Vlad and Sminchisescu, Cristian',
+ title='Human3.6M: Large Scale Datasets and Predictive '
+ 'Methods for 3D Human Sensing in Natural Environments',
+ container='IEEE Transactions on Pattern Analysis and '
+ 'Machine Intelligence',
+ year='2014',
+ homepage='http://vision.imar.ro/human3.6m/description.php',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='root', id=0, color=[51, 153, 255], type='lower', swap=''),
+ 1:
+ dict(
+ name='right_hip',
+ id=1,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 2:
+ dict(
+ name='right_knee',
+ id=2,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 3:
+ dict(
+ name='right_foot',
+ id=3,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_foot'),
+ 4:
+ dict(
+ name='left_hip',
+ id=4,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 5:
+ dict(
+ name='left_knee',
+ id=5,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 6:
+ dict(
+ name='left_foot',
+ id=6,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_foot'),
+ 7:
+ dict(name='spine', id=7, color=[51, 153, 255], type='upper', swap=''),
+ 8:
+ dict(name='thorax', id=8, color=[51, 153, 255], type='upper', swap=''),
+ 9:
+ dict(
+ name='neck_base',
+ id=9,
+ color=[51, 153, 255],
+ type='upper',
+ swap=''),
+ 10:
+ dict(name='head', id=10, color=[51, 153, 255], type='upper', swap=''),
+ 11:
+ dict(
+ name='left_shoulder',
+ id=11,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 12:
+ dict(
+ name='left_elbow',
+ id=12,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 13:
+ dict(
+ name='left_wrist',
+ id=13,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 14:
+ dict(
+ name='right_shoulder',
+ id=14,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 15:
+ dict(
+ name='right_elbow',
+ id=15,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 16:
+ dict(
+ name='right_wrist',
+ id=16,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('root', 'left_hip'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_hip', 'left_knee'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('left_knee', 'left_foot'), id=2, color=[0, 255, 0]),
+ 3:
+ dict(link=('root', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('right_hip', 'right_knee'), id=4, color=[255, 128, 0]),
+ 5:
+ dict(link=('right_knee', 'right_foot'), id=5, color=[255, 128, 0]),
+ 6:
+ dict(link=('root', 'spine'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(link=('spine', 'thorax'), id=7, color=[51, 153, 255]),
+ 8:
+ dict(link=('thorax', 'neck_base'), id=8, color=[51, 153, 255]),
+ 9:
+ dict(link=('neck_base', 'head'), id=9, color=[51, 153, 255]),
+ 10:
+ dict(link=('thorax', 'left_shoulder'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('left_shoulder', 'left_elbow'), id=11, color=[0, 255, 0]),
+ 12:
+ dict(link=('left_elbow', 'left_wrist'), id=12, color=[0, 255, 0]),
+ 13:
+ dict(link=('thorax', 'right_shoulder'), id=13, color=[255, 128, 0]),
+ 14:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=14, color=[255, 128,
+ 0]),
+ 15:
+ dict(link=('right_elbow', 'right_wrist'), id=15, color=[255, 128, 0])
+ },
+ joint_weights=[1.] * 17,
+ sigmas=[],
+ stats_info=dict(bbox_center=(528., 427.), bbox_scale=400.))
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/halpe.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/halpe.py
new file mode 100644
index 0000000000000000000000000000000000000000..1265293642c5ec685b1d17e9a332fb9a5f3ebf4b
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/halpe.py
@@ -0,0 +1,1163 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='halpe',
+ paper_info=dict(
+ author='Li, Yong-Lu and Xu, Liang and Liu, Xinpeng and Huang, Xijie'
+ ' and Xu, Yue and Wang, Shiyi and Fang, Hao-Shu'
+ ' and Ma, Ze and Chen, Mingyang and Lu, Cewu',
+ title='PaStaNet: Toward Human Activity Knowledge Engine',
+ container='CVPR',
+ year='2020',
+ homepage='https://github.com/Fang-Haoshu/Halpe-FullBody/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1:
+ dict(
+ name='left_eye',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_eye'),
+ 2:
+ dict(
+ name='right_eye',
+ id=2,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_eye'),
+ 3:
+ dict(
+ name='left_ear',
+ id=3,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 4:
+ dict(
+ name='right_ear',
+ id=4,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='right_shoulder',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 7:
+ dict(
+ name='left_elbow',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 8:
+ dict(
+ name='right_elbow',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 9:
+ dict(
+ name='left_wrist',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='right_hip',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 13:
+ dict(
+ name='left_knee',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 14:
+ dict(
+ name='right_knee',
+ id=14,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 15:
+ dict(
+ name='left_ankle',
+ id=15,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 16:
+ dict(
+ name='right_ankle',
+ id=16,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle'),
+ 17:
+ dict(name='head', id=17, color=[255, 128, 0], type='upper', swap=''),
+ 18:
+ dict(name='neck', id=18, color=[255, 128, 0], type='upper', swap=''),
+ 19:
+ dict(name='hip', id=19, color=[255, 128, 0], type='lower', swap=''),
+ 20:
+ dict(
+ name='left_big_toe',
+ id=20,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_big_toe'),
+ 21:
+ dict(
+ name='right_big_toe',
+ id=21,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_big_toe'),
+ 22:
+ dict(
+ name='left_small_toe',
+ id=22,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_small_toe'),
+ 23:
+ dict(
+ name='right_small_toe',
+ id=23,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_small_toe'),
+ 24:
+ dict(
+ name='left_heel',
+ id=24,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_heel'),
+ 25:
+ dict(
+ name='right_heel',
+ id=25,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_heel'),
+ 26:
+ dict(
+ name='face-0',
+ id=26,
+ color=[255, 255, 255],
+ type='',
+ swap='face-16'),
+ 27:
+ dict(
+ name='face-1',
+ id=27,
+ color=[255, 255, 255],
+ type='',
+ swap='face-15'),
+ 28:
+ dict(
+ name='face-2',
+ id=28,
+ color=[255, 255, 255],
+ type='',
+ swap='face-14'),
+ 29:
+ dict(
+ name='face-3',
+ id=29,
+ color=[255, 255, 255],
+ type='',
+ swap='face-13'),
+ 30:
+ dict(
+ name='face-4',
+ id=30,
+ color=[255, 255, 255],
+ type='',
+ swap='face-12'),
+ 31:
+ dict(
+ name='face-5',
+ id=31,
+ color=[255, 255, 255],
+ type='',
+ swap='face-11'),
+ 32:
+ dict(
+ name='face-6',
+ id=32,
+ color=[255, 255, 255],
+ type='',
+ swap='face-10'),
+ 33:
+ dict(
+ name='face-7',
+ id=33,
+ color=[255, 255, 255],
+ type='',
+ swap='face-9'),
+ 34:
+ dict(name='face-8', id=34, color=[255, 255, 255], type='', swap=''),
+ 35:
+ dict(
+ name='face-9',
+ id=35,
+ color=[255, 255, 255],
+ type='',
+ swap='face-7'),
+ 36:
+ dict(
+ name='face-10',
+ id=36,
+ color=[255, 255, 255],
+ type='',
+ swap='face-6'),
+ 37:
+ dict(
+ name='face-11',
+ id=37,
+ color=[255, 255, 255],
+ type='',
+ swap='face-5'),
+ 38:
+ dict(
+ name='face-12',
+ id=38,
+ color=[255, 255, 255],
+ type='',
+ swap='face-4'),
+ 39:
+ dict(
+ name='face-13',
+ id=39,
+ color=[255, 255, 255],
+ type='',
+ swap='face-3'),
+ 40:
+ dict(
+ name='face-14',
+ id=40,
+ color=[255, 255, 255],
+ type='',
+ swap='face-2'),
+ 41:
+ dict(
+ name='face-15',
+ id=41,
+ color=[255, 255, 255],
+ type='',
+ swap='face-1'),
+ 42:
+ dict(
+ name='face-16',
+ id=42,
+ color=[255, 255, 255],
+ type='',
+ swap='face-0'),
+ 43:
+ dict(
+ name='face-17',
+ id=43,
+ color=[255, 255, 255],
+ type='',
+ swap='face-26'),
+ 44:
+ dict(
+ name='face-18',
+ id=44,
+ color=[255, 255, 255],
+ type='',
+ swap='face-25'),
+ 45:
+ dict(
+ name='face-19',
+ id=45,
+ color=[255, 255, 255],
+ type='',
+ swap='face-24'),
+ 46:
+ dict(
+ name='face-20',
+ id=46,
+ color=[255, 255, 255],
+ type='',
+ swap='face-23'),
+ 47:
+ dict(
+ name='face-21',
+ id=47,
+ color=[255, 255, 255],
+ type='',
+ swap='face-22'),
+ 48:
+ dict(
+ name='face-22',
+ id=48,
+ color=[255, 255, 255],
+ type='',
+ swap='face-21'),
+ 49:
+ dict(
+ name='face-23',
+ id=49,
+ color=[255, 255, 255],
+ type='',
+ swap='face-20'),
+ 50:
+ dict(
+ name='face-24',
+ id=50,
+ color=[255, 255, 255],
+ type='',
+ swap='face-19'),
+ 51:
+ dict(
+ name='face-25',
+ id=51,
+ color=[255, 255, 255],
+ type='',
+ swap='face-18'),
+ 52:
+ dict(
+ name='face-26',
+ id=52,
+ color=[255, 255, 255],
+ type='',
+ swap='face-17'),
+ 53:
+ dict(name='face-27', id=53, color=[255, 255, 255], type='', swap=''),
+ 54:
+ dict(name='face-28', id=54, color=[255, 255, 255], type='', swap=''),
+ 55:
+ dict(name='face-29', id=55, color=[255, 255, 255], type='', swap=''),
+ 56:
+ dict(name='face-30', id=56, color=[255, 255, 255], type='', swap=''),
+ 57:
+ dict(
+ name='face-31',
+ id=57,
+ color=[255, 255, 255],
+ type='',
+ swap='face-35'),
+ 58:
+ dict(
+ name='face-32',
+ id=58,
+ color=[255, 255, 255],
+ type='',
+ swap='face-34'),
+ 59:
+ dict(name='face-33', id=59, color=[255, 255, 255], type='', swap=''),
+ 60:
+ dict(
+ name='face-34',
+ id=60,
+ color=[255, 255, 255],
+ type='',
+ swap='face-32'),
+ 61:
+ dict(
+ name='face-35',
+ id=61,
+ color=[255, 255, 255],
+ type='',
+ swap='face-31'),
+ 62:
+ dict(
+ name='face-36',
+ id=62,
+ color=[255, 255, 255],
+ type='',
+ swap='face-45'),
+ 63:
+ dict(
+ name='face-37',
+ id=63,
+ color=[255, 255, 255],
+ type='',
+ swap='face-44'),
+ 64:
+ dict(
+ name='face-38',
+ id=64,
+ color=[255, 255, 255],
+ type='',
+ swap='face-43'),
+ 65:
+ dict(
+ name='face-39',
+ id=65,
+ color=[255, 255, 255],
+ type='',
+ swap='face-42'),
+ 66:
+ dict(
+ name='face-40',
+ id=66,
+ color=[255, 255, 255],
+ type='',
+ swap='face-47'),
+ 67:
+ dict(
+ name='face-41',
+ id=67,
+ color=[255, 255, 255],
+ type='',
+ swap='face-46'),
+ 68:
+ dict(
+ name='face-42',
+ id=68,
+ color=[255, 255, 255],
+ type='',
+ swap='face-39'),
+ 69:
+ dict(
+ name='face-43',
+ id=69,
+ color=[255, 255, 255],
+ type='',
+ swap='face-38'),
+ 70:
+ dict(
+ name='face-44',
+ id=70,
+ color=[255, 255, 255],
+ type='',
+ swap='face-37'),
+ 71:
+ dict(
+ name='face-45',
+ id=71,
+ color=[255, 255, 255],
+ type='',
+ swap='face-36'),
+ 72:
+ dict(
+ name='face-46',
+ id=72,
+ color=[255, 255, 255],
+ type='',
+ swap='face-41'),
+ 73:
+ dict(
+ name='face-47',
+ id=73,
+ color=[255, 255, 255],
+ type='',
+ swap='face-40'),
+ 74:
+ dict(
+ name='face-48',
+ id=74,
+ color=[255, 255, 255],
+ type='',
+ swap='face-54'),
+ 75:
+ dict(
+ name='face-49',
+ id=75,
+ color=[255, 255, 255],
+ type='',
+ swap='face-53'),
+ 76:
+ dict(
+ name='face-50',
+ id=76,
+ color=[255, 255, 255],
+ type='',
+ swap='face-52'),
+ 77:
+ dict(name='face-51', id=77, color=[255, 255, 255], type='', swap=''),
+ 78:
+ dict(
+ name='face-52',
+ id=78,
+ color=[255, 255, 255],
+ type='',
+ swap='face-50'),
+ 79:
+ dict(
+ name='face-53',
+ id=79,
+ color=[255, 255, 255],
+ type='',
+ swap='face-49'),
+ 80:
+ dict(
+ name='face-54',
+ id=80,
+ color=[255, 255, 255],
+ type='',
+ swap='face-48'),
+ 81:
+ dict(
+ name='face-55',
+ id=81,
+ color=[255, 255, 255],
+ type='',
+ swap='face-59'),
+ 82:
+ dict(
+ name='face-56',
+ id=82,
+ color=[255, 255, 255],
+ type='',
+ swap='face-58'),
+ 83:
+ dict(name='face-57', id=83, color=[255, 255, 255], type='', swap=''),
+ 84:
+ dict(
+ name='face-58',
+ id=84,
+ color=[255, 255, 255],
+ type='',
+ swap='face-56'),
+ 85:
+ dict(
+ name='face-59',
+ id=85,
+ color=[255, 255, 255],
+ type='',
+ swap='face-55'),
+ 86:
+ dict(
+ name='face-60',
+ id=86,
+ color=[255, 255, 255],
+ type='',
+ swap='face-64'),
+ 87:
+ dict(
+ name='face-61',
+ id=87,
+ color=[255, 255, 255],
+ type='',
+ swap='face-63'),
+ 88:
+ dict(name='face-62', id=88, color=[255, 255, 255], type='', swap=''),
+ 89:
+ dict(
+ name='face-63',
+ id=89,
+ color=[255, 255, 255],
+ type='',
+ swap='face-61'),
+ 90:
+ dict(
+ name='face-64',
+ id=90,
+ color=[255, 255, 255],
+ type='',
+ swap='face-60'),
+ 91:
+ dict(
+ name='face-65',
+ id=91,
+ color=[255, 255, 255],
+ type='',
+ swap='face-67'),
+ 92:
+ dict(name='face-66', id=92, color=[255, 255, 255], type='', swap=''),
+ 93:
+ dict(
+ name='face-67',
+ id=93,
+ color=[255, 255, 255],
+ type='',
+ swap='face-65'),
+ 94:
+ dict(
+ name='left_hand_root',
+ id=94,
+ color=[255, 255, 255],
+ type='',
+ swap='right_hand_root'),
+ 95:
+ dict(
+ name='left_thumb1',
+ id=95,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb1'),
+ 96:
+ dict(
+ name='left_thumb2',
+ id=96,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb2'),
+ 97:
+ dict(
+ name='left_thumb3',
+ id=97,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb3'),
+ 98:
+ dict(
+ name='left_thumb4',
+ id=98,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb4'),
+ 99:
+ dict(
+ name='left_forefinger1',
+ id=99,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger1'),
+ 100:
+ dict(
+ name='left_forefinger2',
+ id=100,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger2'),
+ 101:
+ dict(
+ name='left_forefinger3',
+ id=101,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger3'),
+ 102:
+ dict(
+ name='left_forefinger4',
+ id=102,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger4'),
+ 103:
+ dict(
+ name='left_middle_finger1',
+ id=103,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger1'),
+ 104:
+ dict(
+ name='left_middle_finger2',
+ id=104,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger2'),
+ 105:
+ dict(
+ name='left_middle_finger3',
+ id=105,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger3'),
+ 106:
+ dict(
+ name='left_middle_finger4',
+ id=106,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger4'),
+ 107:
+ dict(
+ name='left_ring_finger1',
+ id=107,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger1'),
+ 108:
+ dict(
+ name='left_ring_finger2',
+ id=108,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger2'),
+ 109:
+ dict(
+ name='left_ring_finger3',
+ id=109,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger3'),
+ 110:
+ dict(
+ name='left_ring_finger4',
+ id=110,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger4'),
+ 111:
+ dict(
+ name='left_pinky_finger1',
+ id=111,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger1'),
+ 112:
+ dict(
+ name='left_pinky_finger2',
+ id=112,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger2'),
+ 113:
+ dict(
+ name='left_pinky_finger3',
+ id=113,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger3'),
+ 114:
+ dict(
+ name='left_pinky_finger4',
+ id=114,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger4'),
+ 115:
+ dict(
+ name='right_hand_root',
+ id=115,
+ color=[255, 255, 255],
+ type='',
+ swap='left_hand_root'),
+ 116:
+ dict(
+ name='right_thumb1',
+ id=116,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb1'),
+ 117:
+ dict(
+ name='right_thumb2',
+ id=117,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb2'),
+ 118:
+ dict(
+ name='right_thumb3',
+ id=118,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb3'),
+ 119:
+ dict(
+ name='right_thumb4',
+ id=119,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb4'),
+ 120:
+ dict(
+ name='right_forefinger1',
+ id=120,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger1'),
+ 121:
+ dict(
+ name='right_forefinger2',
+ id=121,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger2'),
+ 122:
+ dict(
+ name='right_forefinger3',
+ id=122,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger3'),
+ 123:
+ dict(
+ name='right_forefinger4',
+ id=123,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger4'),
+ 124:
+ dict(
+ name='right_middle_finger1',
+ id=124,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger1'),
+ 125:
+ dict(
+ name='right_middle_finger2',
+ id=125,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger2'),
+ 126:
+ dict(
+ name='right_middle_finger3',
+ id=126,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger3'),
+ 127:
+ dict(
+ name='right_middle_finger4',
+ id=127,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger4'),
+ 128:
+ dict(
+ name='right_ring_finger1',
+ id=128,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger1'),
+ 129:
+ dict(
+ name='right_ring_finger2',
+ id=129,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger2'),
+ 130:
+ dict(
+ name='right_ring_finger3',
+ id=130,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger3'),
+ 131:
+ dict(
+ name='right_ring_finger4',
+ id=131,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger4'),
+ 132:
+ dict(
+ name='right_pinky_finger1',
+ id=132,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger1'),
+ 133:
+ dict(
+ name='right_pinky_finger2',
+ id=133,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger2'),
+ 134:
+ dict(
+ name='right_pinky_finger3',
+ id=134,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger3'),
+ 135:
+ dict(
+ name='right_pinky_finger4',
+ id=135,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger4')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('left_hip', 'hip'), id=2, color=[0, 255, 0]),
+ 3:
+ dict(link=('right_ankle', 'right_knee'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('right_knee', 'right_hip'), id=4, color=[255, 128, 0]),
+ 5:
+ dict(link=('right_hip', 'hip'), id=5, color=[255, 128, 0]),
+ 6:
+ dict(link=('head', 'neck'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(link=('neck', 'hip'), id=7, color=[51, 153, 255]),
+ 8:
+ dict(link=('neck', 'left_shoulder'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(link=('left_shoulder', 'left_elbow'), id=9, color=[0, 255, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('neck', 'right_shoulder'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=12, color=[255, 128,
+ 0]),
+ 13:
+ dict(link=('right_elbow', 'right_wrist'), id=13, color=[255, 128, 0]),
+ 14:
+ dict(link=('left_eye', 'right_eye'), id=14, color=[51, 153, 255]),
+ 15:
+ dict(link=('nose', 'left_eye'), id=15, color=[51, 153, 255]),
+ 16:
+ dict(link=('nose', 'right_eye'), id=16, color=[51, 153, 255]),
+ 17:
+ dict(link=('left_eye', 'left_ear'), id=17, color=[51, 153, 255]),
+ 18:
+ dict(link=('right_eye', 'right_ear'), id=18, color=[51, 153, 255]),
+ 19:
+ dict(link=('left_ear', 'left_shoulder'), id=19, color=[51, 153, 255]),
+ 20:
+ dict(
+ link=('right_ear', 'right_shoulder'), id=20, color=[51, 153, 255]),
+ 21:
+ dict(link=('left_ankle', 'left_big_toe'), id=21, color=[0, 255, 0]),
+ 22:
+ dict(link=('left_ankle', 'left_small_toe'), id=22, color=[0, 255, 0]),
+ 23:
+ dict(link=('left_ankle', 'left_heel'), id=23, color=[0, 255, 0]),
+ 24:
+ dict(
+ link=('right_ankle', 'right_big_toe'), id=24, color=[255, 128, 0]),
+ 25:
+ dict(
+ link=('right_ankle', 'right_small_toe'),
+ id=25,
+ color=[255, 128, 0]),
+ 26:
+ dict(link=('right_ankle', 'right_heel'), id=26, color=[255, 128, 0]),
+ 27:
+ dict(link=('left_wrist', 'left_thumb1'), id=27, color=[255, 128, 0]),
+ 28:
+ dict(link=('left_thumb1', 'left_thumb2'), id=28, color=[255, 128, 0]),
+ 29:
+ dict(link=('left_thumb2', 'left_thumb3'), id=29, color=[255, 128, 0]),
+ 30:
+ dict(link=('left_thumb3', 'left_thumb4'), id=30, color=[255, 128, 0]),
+ 31:
+ dict(
+ link=('left_wrist', 'left_forefinger1'),
+ id=31,
+ color=[255, 153, 255]),
+ 32:
+ dict(
+ link=('left_forefinger1', 'left_forefinger2'),
+ id=32,
+ color=[255, 153, 255]),
+ 33:
+ dict(
+ link=('left_forefinger2', 'left_forefinger3'),
+ id=33,
+ color=[255, 153, 255]),
+ 34:
+ dict(
+ link=('left_forefinger3', 'left_forefinger4'),
+ id=34,
+ color=[255, 153, 255]),
+ 35:
+ dict(
+ link=('left_wrist', 'left_middle_finger1'),
+ id=35,
+ color=[102, 178, 255]),
+ 36:
+ dict(
+ link=('left_middle_finger1', 'left_middle_finger2'),
+ id=36,
+ color=[102, 178, 255]),
+ 37:
+ dict(
+ link=('left_middle_finger2', 'left_middle_finger3'),
+ id=37,
+ color=[102, 178, 255]),
+ 38:
+ dict(
+ link=('left_middle_finger3', 'left_middle_finger4'),
+ id=38,
+ color=[102, 178, 255]),
+ 39:
+ dict(
+ link=('left_wrist', 'left_ring_finger1'),
+ id=39,
+ color=[255, 51, 51]),
+ 40:
+ dict(
+ link=('left_ring_finger1', 'left_ring_finger2'),
+ id=40,
+ color=[255, 51, 51]),
+ 41:
+ dict(
+ link=('left_ring_finger2', 'left_ring_finger3'),
+ id=41,
+ color=[255, 51, 51]),
+ 42:
+ dict(
+ link=('left_ring_finger3', 'left_ring_finger4'),
+ id=42,
+ color=[255, 51, 51]),
+ 43:
+ dict(
+ link=('left_wrist', 'left_pinky_finger1'),
+ id=43,
+ color=[0, 255, 0]),
+ 44:
+ dict(
+ link=('left_pinky_finger1', 'left_pinky_finger2'),
+ id=44,
+ color=[0, 255, 0]),
+ 45:
+ dict(
+ link=('left_pinky_finger2', 'left_pinky_finger3'),
+ id=45,
+ color=[0, 255, 0]),
+ 46:
+ dict(
+ link=('left_pinky_finger3', 'left_pinky_finger4'),
+ id=46,
+ color=[0, 255, 0]),
+ 47:
+ dict(link=('right_wrist', 'right_thumb1'), id=47, color=[255, 128, 0]),
+ 48:
+ dict(
+ link=('right_thumb1', 'right_thumb2'), id=48, color=[255, 128, 0]),
+ 49:
+ dict(
+ link=('right_thumb2', 'right_thumb3'), id=49, color=[255, 128, 0]),
+ 50:
+ dict(
+ link=('right_thumb3', 'right_thumb4'), id=50, color=[255, 128, 0]),
+ 51:
+ dict(
+ link=('right_wrist', 'right_forefinger1'),
+ id=51,
+ color=[255, 153, 255]),
+ 52:
+ dict(
+ link=('right_forefinger1', 'right_forefinger2'),
+ id=52,
+ color=[255, 153, 255]),
+ 53:
+ dict(
+ link=('right_forefinger2', 'right_forefinger3'),
+ id=53,
+ color=[255, 153, 255]),
+ 54:
+ dict(
+ link=('right_forefinger3', 'right_forefinger4'),
+ id=54,
+ color=[255, 153, 255]),
+ 55:
+ dict(
+ link=('right_wrist', 'right_middle_finger1'),
+ id=55,
+ color=[102, 178, 255]),
+ 56:
+ dict(
+ link=('right_middle_finger1', 'right_middle_finger2'),
+ id=56,
+ color=[102, 178, 255]),
+ 57:
+ dict(
+ link=('right_middle_finger2', 'right_middle_finger3'),
+ id=57,
+ color=[102, 178, 255]),
+ 58:
+ dict(
+ link=('right_middle_finger3', 'right_middle_finger4'),
+ id=58,
+ color=[102, 178, 255]),
+ 59:
+ dict(
+ link=('right_wrist', 'right_ring_finger1'),
+ id=59,
+ color=[255, 51, 51]),
+ 60:
+ dict(
+ link=('right_ring_finger1', 'right_ring_finger2'),
+ id=60,
+ color=[255, 51, 51]),
+ 61:
+ dict(
+ link=('right_ring_finger2', 'right_ring_finger3'),
+ id=61,
+ color=[255, 51, 51]),
+ 62:
+ dict(
+ link=('right_ring_finger3', 'right_ring_finger4'),
+ id=62,
+ color=[255, 51, 51]),
+ 63:
+ dict(
+ link=('right_wrist', 'right_pinky_finger1'),
+ id=63,
+ color=[0, 255, 0]),
+ 64:
+ dict(
+ link=('right_pinky_finger1', 'right_pinky_finger2'),
+ id=64,
+ color=[0, 255, 0]),
+ 65:
+ dict(
+ link=('right_pinky_finger2', 'right_pinky_finger3'),
+ id=65,
+ color=[0, 255, 0]),
+ 66:
+ dict(
+ link=('right_pinky_finger3', 'right_pinky_finger4'),
+ id=66,
+ color=[0, 255, 0])
+ },
+ joint_weights=[1.] * 136,
+
+ # 'https://github.com/Fang-Haoshu/Halpe-FullBody/blob/master/'
+ # 'HalpeCOCOAPI/PythonAPI/halpecocotools/cocoeval.py#L245'
+ sigmas=[
+ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+ 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089, 0.08, 0.08, 0.08,
+ 0.089, 0.089, 0.089, 0.089, 0.089, 0.089, 0.015, 0.015, 0.015, 0.015,
+ 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015,
+ 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015,
+ 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015,
+ 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015,
+ 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015,
+ 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015,
+ 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015,
+ 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015,
+ 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015,
+ 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015,
+ 0.015, 0.015, 0.015, 0.015, 0.015, 0.015
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/halpe26.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/halpe26.py
new file mode 100644
index 0000000000000000000000000000000000000000..52c8bc83b10696cd512c076da9c0b5ef4abd5bb1
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/halpe26.py
@@ -0,0 +1,280 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='halpe26',
+ paper_info=dict(
+ author='Li, Yong-Lu and Xu, Liang and Liu, Xinpeng and Huang, Xijie'
+ ' and Xu, Yue and Wang, Shiyi and Fang, Hao-Shu'
+ ' and Ma, Ze and Chen, Mingyang and Lu, Cewu',
+ title='PaStaNet: Toward Human Activity Knowledge Engine',
+ container='CVPR',
+ year='2020',
+ homepage='https://github.com/Fang-Haoshu/Halpe-FullBody/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1:
+ dict(
+ name='left_eye',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_eye'),
+ 2:
+ dict(
+ name='right_eye',
+ id=2,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_eye'),
+ 3:
+ dict(
+ name='left_ear',
+ id=3,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 4:
+ dict(
+ name='right_ear',
+ id=4,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='right_shoulder',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 7:
+ dict(
+ name='left_elbow',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 8:
+ dict(
+ name='right_elbow',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 9:
+ dict(
+ name='left_wrist',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='right_hip',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 13:
+ dict(
+ name='left_knee',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 14:
+ dict(
+ name='right_knee',
+ id=14,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 15:
+ dict(
+ name='left_ankle',
+ id=15,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 16:
+ dict(
+ name='right_ankle',
+ id=16,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle'),
+ 17:
+ dict(name='head', id=17, color=[255, 128, 0], type='upper', swap=''),
+ 18:
+ dict(name='neck', id=18, color=[255, 128, 0], type='upper', swap=''),
+ 19:
+ dict(name='hip', id=19, color=[255, 128, 0], type='lower', swap=''),
+ 20:
+ dict(
+ name='left_big_toe',
+ id=20,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_big_toe'),
+ 21:
+ dict(
+ name='right_big_toe',
+ id=21,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_big_toe'),
+ 22:
+ dict(
+ name='left_small_toe',
+ id=22,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_small_toe'),
+ 23:
+ dict(
+ name='right_small_toe',
+ id=23,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_small_toe'),
+ 24:
+ dict(
+ name='left_heel',
+ id=24,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_heel'),
+ 25:
+ dict(
+ name='right_heel',
+ id=25,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_heel')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('left_hip', 'hip'), id=2, color=[0, 255, 0]),
+ 3:
+ dict(link=('right_ankle', 'right_knee'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('right_knee', 'right_hip'), id=4, color=[255, 128, 0]),
+ 5:
+ dict(link=('right_hip', 'hip'), id=5, color=[255, 128, 0]),
+ 6:
+ dict(link=('head', 'neck'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(link=('neck', 'hip'), id=7, color=[51, 153, 255]),
+ 8:
+ dict(link=('neck', 'left_shoulder'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(link=('left_shoulder', 'left_elbow'), id=9, color=[0, 255, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('neck', 'right_shoulder'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=12, color=[255, 128,
+ 0]),
+ 13:
+ dict(link=('right_elbow', 'right_wrist'), id=13, color=[255, 128, 0]),
+ 14:
+ dict(link=('left_eye', 'right_eye'), id=14, color=[51, 153, 255]),
+ 15:
+ dict(link=('nose', 'left_eye'), id=15, color=[51, 153, 255]),
+ 16:
+ dict(link=('nose', 'right_eye'), id=16, color=[51, 153, 255]),
+ 17:
+ dict(link=('left_eye', 'left_ear'), id=17, color=[51, 153, 255]),
+ 18:
+ dict(link=('right_eye', 'right_ear'), id=18, color=[51, 153, 255]),
+ 19:
+ dict(link=('left_ear', 'left_shoulder'), id=19, color=[51, 153, 255]),
+ 20:
+ dict(
+ link=('right_ear', 'right_shoulder'), id=20, color=[51, 153, 255]),
+ 21:
+ dict(link=('left_ankle', 'left_big_toe'), id=21, color=[0, 255, 0]),
+ 22:
+ dict(link=('left_ankle', 'left_small_toe'), id=22, color=[0, 255, 0]),
+ 23:
+ dict(link=('left_ankle', 'left_heel'), id=23, color=[0, 255, 0]),
+ 24:
+ dict(
+ link=('right_ankle', 'right_big_toe'), id=24, color=[255, 128, 0]),
+ 25:
+ dict(
+ link=('right_ankle', 'right_small_toe'),
+ id=25,
+ color=[255, 128, 0]),
+ 26:
+ dict(link=('right_ankle', 'right_heel'), id=26, color=[255, 128, 0]),
+ },
+ # the joint_weights is modified by MMPose Team
+ joint_weights=[
+ 1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.5, 1.5, 1., 1., 1.2, 1.2, 1.5,
+ 1.5
+ ] + [1., 1., 1.2] + [1.5] * 6,
+
+ # 'https://github.com/Fang-Haoshu/Halpe-FullBody/blob/master/'
+ # 'HalpeCOCOAPI/PythonAPI/halpecocotools/cocoeval.py#L245'
+ sigmas=[
+ 0.026,
+ 0.025,
+ 0.025,
+ 0.035,
+ 0.035,
+ 0.079,
+ 0.079,
+ 0.072,
+ 0.072,
+ 0.062,
+ 0.062,
+ 0.107,
+ 0.107,
+ 0.087,
+ 0.087,
+ 0.089,
+ 0.089,
+ 0.026,
+ 0.026,
+ 0.066,
+ 0.079,
+ 0.079,
+ 0.079,
+ 0.079,
+ 0.079,
+ 0.079,
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/horse10.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/horse10.py
new file mode 100644
index 0000000000000000000000000000000000000000..3289b15ee4dfc47cb2af1cafa4977b2d5ab9500d
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/horse10.py
@@ -0,0 +1,207 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='horse10',
+ paper_info=dict(
+ author='Mathis, Alexander and Biasi, Thomas and '
+ 'Schneider, Steffen and '
+ 'Yuksekgonul, Mert and Rogers, Byron and '
+ 'Bethge, Matthias and '
+ 'Mathis, Mackenzie W',
+ title='Pretraining boosts out-of-domain robustness '
+ 'for pose estimation',
+ container='Proceedings of the IEEE/CVF Winter Conference on '
+ 'Applications of Computer Vision',
+ year='2021',
+ homepage='http://www.mackenziemathislab.org/horse10',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='Nose', id=0, color=[255, 153, 255], type='upper', swap=''),
+ 1:
+ dict(name='Eye', id=1, color=[255, 153, 255], type='upper', swap=''),
+ 2:
+ dict(
+ name='Nearknee',
+ id=2,
+ color=[255, 102, 255],
+ type='upper',
+ swap=''),
+ 3:
+ dict(
+ name='Nearfrontfetlock',
+ id=3,
+ color=[255, 102, 255],
+ type='upper',
+ swap=''),
+ 4:
+ dict(
+ name='Nearfrontfoot',
+ id=4,
+ color=[255, 102, 255],
+ type='upper',
+ swap=''),
+ 5:
+ dict(
+ name='Offknee', id=5, color=[255, 102, 255], type='upper',
+ swap=''),
+ 6:
+ dict(
+ name='Offfrontfetlock',
+ id=6,
+ color=[255, 102, 255],
+ type='upper',
+ swap=''),
+ 7:
+ dict(
+ name='Offfrontfoot',
+ id=7,
+ color=[255, 102, 255],
+ type='upper',
+ swap=''),
+ 8:
+ dict(
+ name='Shoulder',
+ id=8,
+ color=[255, 153, 255],
+ type='upper',
+ swap=''),
+ 9:
+ dict(
+ name='Midshoulder',
+ id=9,
+ color=[255, 153, 255],
+ type='upper',
+ swap=''),
+ 10:
+ dict(
+ name='Elbow', id=10, color=[255, 153, 255], type='upper', swap=''),
+ 11:
+ dict(
+ name='Girth', id=11, color=[255, 153, 255], type='upper', swap=''),
+ 12:
+ dict(
+ name='Wither', id=12, color=[255, 153, 255], type='upper',
+ swap=''),
+ 13:
+ dict(
+ name='Nearhindhock',
+ id=13,
+ color=[255, 51, 255],
+ type='lower',
+ swap=''),
+ 14:
+ dict(
+ name='Nearhindfetlock',
+ id=14,
+ color=[255, 51, 255],
+ type='lower',
+ swap=''),
+ 15:
+ dict(
+ name='Nearhindfoot',
+ id=15,
+ color=[255, 51, 255],
+ type='lower',
+ swap=''),
+ 16:
+ dict(name='Hip', id=16, color=[255, 153, 255], type='lower', swap=''),
+ 17:
+ dict(
+ name='Stifle', id=17, color=[255, 153, 255], type='lower',
+ swap=''),
+ 18:
+ dict(
+ name='Offhindhock',
+ id=18,
+ color=[255, 51, 255],
+ type='lower',
+ swap=''),
+ 19:
+ dict(
+ name='Offhindfetlock',
+ id=19,
+ color=[255, 51, 255],
+ type='lower',
+ swap=''),
+ 20:
+ dict(
+ name='Offhindfoot',
+ id=20,
+ color=[255, 51, 255],
+ type='lower',
+ swap=''),
+ 21:
+ dict(
+ name='Ischium',
+ id=21,
+ color=[255, 153, 255],
+ type='lower',
+ swap='')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('Nose', 'Eye'), id=0, color=[255, 153, 255]),
+ 1:
+ dict(link=('Eye', 'Wither'), id=1, color=[255, 153, 255]),
+ 2:
+ dict(link=('Wither', 'Hip'), id=2, color=[255, 153, 255]),
+ 3:
+ dict(link=('Hip', 'Ischium'), id=3, color=[255, 153, 255]),
+ 4:
+ dict(link=('Ischium', 'Stifle'), id=4, color=[255, 153, 255]),
+ 5:
+ dict(link=('Stifle', 'Girth'), id=5, color=[255, 153, 255]),
+ 6:
+ dict(link=('Girth', 'Elbow'), id=6, color=[255, 153, 255]),
+ 7:
+ dict(link=('Elbow', 'Shoulder'), id=7, color=[255, 153, 255]),
+ 8:
+ dict(link=('Shoulder', 'Midshoulder'), id=8, color=[255, 153, 255]),
+ 9:
+ dict(link=('Midshoulder', 'Wither'), id=9, color=[255, 153, 255]),
+ 10:
+ dict(
+ link=('Nearknee', 'Nearfrontfetlock'),
+ id=10,
+ color=[255, 102, 255]),
+ 11:
+ dict(
+ link=('Nearfrontfetlock', 'Nearfrontfoot'),
+ id=11,
+ color=[255, 102, 255]),
+ 12:
+ dict(
+ link=('Offknee', 'Offfrontfetlock'), id=12, color=[255, 102, 255]),
+ 13:
+ dict(
+ link=('Offfrontfetlock', 'Offfrontfoot'),
+ id=13,
+ color=[255, 102, 255]),
+ 14:
+ dict(
+ link=('Nearhindhock', 'Nearhindfetlock'),
+ id=14,
+ color=[255, 51, 255]),
+ 15:
+ dict(
+ link=('Nearhindfetlock', 'Nearhindfoot'),
+ id=15,
+ color=[255, 51, 255]),
+ 16:
+ dict(
+ link=('Offhindhock', 'Offhindfetlock'),
+ id=16,
+ color=[255, 51, 255]),
+ 17:
+ dict(
+ link=('Offhindfetlock', 'Offhindfoot'),
+ id=17,
+ color=[255, 51, 255])
+ },
+ joint_weights=[1.] * 22,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/humanart.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/humanart.py
new file mode 100644
index 0000000000000000000000000000000000000000..d29c7f954f280777cb124db3aff3fcacba9dfb26
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/humanart.py
@@ -0,0 +1,187 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='Human-Art',
+ paper_info=dict(
+ author='Ju, Xuan and Zeng, Ailing and '
+ 'Wang, Jianan and Xu, Qiang and Zhang, Lei',
+ title='Human-Art: A Versatile Human-Centric Dataset '
+ 'Bridging Natural and Artificial Scenes',
+ container='Proceedings of the IEEE/CVF Conference on '
+ 'Computer Vision and Pattern Recognition',
+ year='2023',
+ homepage='https://idea-research.github.io/HumanArt/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1:
+ dict(
+ name='left_eye',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_eye'),
+ 2:
+ dict(
+ name='right_eye',
+ id=2,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_eye'),
+ 3:
+ dict(
+ name='left_ear',
+ id=3,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 4:
+ dict(
+ name='right_ear',
+ id=4,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='right_shoulder',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 7:
+ dict(
+ name='left_elbow',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 8:
+ dict(
+ name='right_elbow',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 9:
+ dict(
+ name='left_wrist',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='right_hip',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 13:
+ dict(
+ name='left_knee',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 14:
+ dict(
+ name='right_knee',
+ id=14,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 15:
+ dict(
+ name='left_ankle',
+ id=15,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 16:
+ dict(
+ name='right_ankle',
+ id=16,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+ 6:
+ dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(
+ link=('left_shoulder', 'right_shoulder'),
+ id=7,
+ color=[51, 153, 255]),
+ 8:
+ dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('left_eye', 'right_eye'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('nose', 'left_eye'), id=13, color=[51, 153, 255]),
+ 14:
+ dict(link=('nose', 'right_eye'), id=14, color=[51, 153, 255]),
+ 15:
+ dict(link=('left_eye', 'left_ear'), id=15, color=[51, 153, 255]),
+ 16:
+ dict(link=('right_eye', 'right_ear'), id=16, color=[51, 153, 255]),
+ 17:
+ dict(link=('left_ear', 'left_shoulder'), id=17, color=[51, 153, 255]),
+ 18:
+ dict(
+ link=('right_ear', 'right_shoulder'), id=18, color=[51, 153, 255])
+ },
+ joint_weights=[
+ 1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.5, 1.5, 1., 1., 1.2, 1.2, 1.5,
+ 1.5
+ ],
+ sigmas=[
+ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+ 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/humanart_aic.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/humanart_aic.py
new file mode 100644
index 0000000000000000000000000000000000000000..086e8d03b8da36ad2f7ffe9ea69c37770397fbea
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/humanart_aic.py
@@ -0,0 +1,211 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='humanart',
+ paper_info=[
+ dict(
+ author='Ju, Xuan and Zeng, Ailing and '
+ 'Wang, Jianan and Xu, Qiang and Zhang, '
+ 'Lei',
+ title='Human-Art: A Versatile Human-Centric Dataset '
+ 'Bridging Natural and Artificial Scenes',
+ container='CVPR',
+ year='2023',
+ homepage='https://idea-research.github.io/HumanArt/',
+ ),
+ dict(
+ author='Wu, Jiahong and Zheng, He and Zhao, Bo and '
+ 'Li, Yixin and Yan, Baoming and Liang, Rui and '
+ 'Wang, Wenjia and Zhou, Shipei and Lin, Guosen and '
+ 'Fu, Yanwei and others',
+ title='Ai challenger: A large-scale dataset for going '
+ 'deeper in image understanding',
+ container='arXiv',
+ year='2017',
+ homepage='https://github.com/AIChallenger/AI_Challenger_2017',
+ ),
+ ],
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1:
+ dict(
+ name='left_eye',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_eye'),
+ 2:
+ dict(
+ name='right_eye',
+ id=2,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_eye'),
+ 3:
+ dict(
+ name='left_ear',
+ id=3,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 4:
+ dict(
+ name='right_ear',
+ id=4,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='right_shoulder',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 7:
+ dict(
+ name='left_elbow',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 8:
+ dict(
+ name='right_elbow',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 9:
+ dict(
+ name='left_wrist',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='right_hip',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 13:
+ dict(
+ name='left_knee',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 14:
+ dict(
+ name='right_knee',
+ id=14,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 15:
+ dict(
+ name='left_ankle',
+ id=15,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 16:
+ dict(
+ name='right_ankle',
+ id=16,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle'),
+ 17:
+ dict(
+ name='head_top',
+ id=17,
+ color=[51, 153, 255],
+ type='upper',
+ swap=''),
+ 18:
+ dict(name='neck', id=18, color=[51, 153, 255], type='upper', swap='')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+ 6:
+ dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(
+ link=('left_shoulder', 'right_shoulder'),
+ id=7,
+ color=[51, 153, 255]),
+ 8:
+ dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('left_eye', 'right_eye'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('nose', 'left_eye'), id=13, color=[51, 153, 255]),
+ 14:
+ dict(link=('nose', 'right_eye'), id=14, color=[51, 153, 255]),
+ 15:
+ dict(link=('left_eye', 'left_ear'), id=15, color=[51, 153, 255]),
+ 16:
+ dict(link=('right_eye', 'right_ear'), id=16, color=[51, 153, 255]),
+ 17:
+ dict(link=('left_ear', 'left_shoulder'), id=17, color=[51, 153, 255]),
+ 18:
+ dict(
+ link=('right_ear', 'right_shoulder'), id=18, color=[51, 153, 255]),
+ 19:
+ dict(link=('head_top', 'neck'), id=11, color=[51, 153, 255]),
+ },
+ joint_weights=[
+ 1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.5, 1.5, 1., 1., 1.2, 1.2, 1.5,
+ 1.5, 1.5
+ ],
+ sigmas=[
+ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+ 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089, 0.026, 0.026
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/interhand2d.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/interhand2d.py
new file mode 100644
index 0000000000000000000000000000000000000000..656bc55939a43c0e7f46a5c80c95b0b70b95cafb
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/interhand2d.py
@@ -0,0 +1,148 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='interhand2d',
+ paper_info=dict(
+ author='Moon, Gyeongsik and Yu, Shoou-I and Wen, He and '
+ 'Shiratori, Takaaki and Lee, Kyoung Mu',
+ title='InterHand2.6M: A dataset and baseline for 3D '
+ 'interacting hand pose estimation from a single RGB image',
+ container='arXiv',
+ year='2020',
+ homepage='https://mks0601.github.io/InterHand2.6M/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='thumb4', id=0, color=[255, 128, 0], type='', swap=''),
+ 1:
+ dict(name='thumb3', id=1, color=[255, 128, 0], type='', swap=''),
+ 2:
+ dict(name='thumb2', id=2, color=[255, 128, 0], type='', swap=''),
+ 3:
+ dict(name='thumb1', id=3, color=[255, 128, 0], type='', swap=''),
+ 4:
+ dict(
+ name='forefinger4', id=4, color=[255, 153, 255], type='', swap=''),
+ 5:
+ dict(
+ name='forefinger3', id=5, color=[255, 153, 255], type='', swap=''),
+ 6:
+ dict(
+ name='forefinger2', id=6, color=[255, 153, 255], type='', swap=''),
+ 7:
+ dict(
+ name='forefinger1', id=7, color=[255, 153, 255], type='', swap=''),
+ 8:
+ dict(
+ name='middle_finger4',
+ id=8,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 9:
+ dict(
+ name='middle_finger3',
+ id=9,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 10:
+ dict(
+ name='middle_finger2',
+ id=10,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 11:
+ dict(
+ name='middle_finger1',
+ id=11,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 12:
+ dict(
+ name='ring_finger4', id=12, color=[255, 51, 51], type='', swap=''),
+ 13:
+ dict(
+ name='ring_finger3', id=13, color=[255, 51, 51], type='', swap=''),
+ 14:
+ dict(
+ name='ring_finger2', id=14, color=[255, 51, 51], type='', swap=''),
+ 15:
+ dict(
+ name='ring_finger1', id=15, color=[255, 51, 51], type='', swap=''),
+ 16:
+ dict(name='pinky_finger4', id=16, color=[0, 255, 0], type='', swap=''),
+ 17:
+ dict(name='pinky_finger3', id=17, color=[0, 255, 0], type='', swap=''),
+ 18:
+ dict(name='pinky_finger2', id=18, color=[0, 255, 0], type='', swap=''),
+ 19:
+ dict(name='pinky_finger1', id=19, color=[0, 255, 0], type='', swap=''),
+ 20:
+ dict(name='wrist', id=20, color=[255, 255, 255], type='', swap='')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('wrist', 'thumb1'), id=0, color=[255, 128, 0]),
+ 1:
+ dict(link=('thumb1', 'thumb2'), id=1, color=[255, 128, 0]),
+ 2:
+ dict(link=('thumb2', 'thumb3'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('thumb3', 'thumb4'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('wrist', 'forefinger1'), id=4, color=[255, 153, 255]),
+ 5:
+ dict(link=('forefinger1', 'forefinger2'), id=5, color=[255, 153, 255]),
+ 6:
+ dict(link=('forefinger2', 'forefinger3'), id=6, color=[255, 153, 255]),
+ 7:
+ dict(link=('forefinger3', 'forefinger4'), id=7, color=[255, 153, 255]),
+ 8:
+ dict(link=('wrist', 'middle_finger1'), id=8, color=[102, 178, 255]),
+ 9:
+ dict(
+ link=('middle_finger1', 'middle_finger2'),
+ id=9,
+ color=[102, 178, 255]),
+ 10:
+ dict(
+ link=('middle_finger2', 'middle_finger3'),
+ id=10,
+ color=[102, 178, 255]),
+ 11:
+ dict(
+ link=('middle_finger3', 'middle_finger4'),
+ id=11,
+ color=[102, 178, 255]),
+ 12:
+ dict(link=('wrist', 'ring_finger1'), id=12, color=[255, 51, 51]),
+ 13:
+ dict(
+ link=('ring_finger1', 'ring_finger2'), id=13, color=[255, 51, 51]),
+ 14:
+ dict(
+ link=('ring_finger2', 'ring_finger3'), id=14, color=[255, 51, 51]),
+ 15:
+ dict(
+ link=('ring_finger3', 'ring_finger4'), id=15, color=[255, 51, 51]),
+ 16:
+ dict(link=('wrist', 'pinky_finger1'), id=16, color=[0, 255, 0]),
+ 17:
+ dict(
+ link=('pinky_finger1', 'pinky_finger2'), id=17, color=[0, 255, 0]),
+ 18:
+ dict(
+ link=('pinky_finger2', 'pinky_finger3'), id=18, color=[0, 255, 0]),
+ 19:
+ dict(
+ link=('pinky_finger3', 'pinky_finger4'), id=19, color=[0, 255, 0])
+ },
+ joint_weights=[1.] * 21,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/interhand3d.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/interhand3d.py
new file mode 100644
index 0000000000000000000000000000000000000000..1af33a811de393df8071c2f87f2012d0ef0ba2f8
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/interhand3d.py
@@ -0,0 +1,493 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='interhand3d',
+ paper_info=dict(
+ author='Moon, Gyeongsik and Yu, Shoou-I and Wen, He and '
+ 'Shiratori, Takaaki and Lee, Kyoung Mu',
+ title='InterHand2.6M: A dataset and baseline for 3D '
+ 'interacting hand pose estimation from a single RGB image',
+ container='arXiv',
+ year='2020',
+ homepage='https://mks0601.github.io/InterHand2.6M/',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='right_thumb4',
+ id=0,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb4'),
+ 1:
+ dict(
+ name='right_thumb3',
+ id=1,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb3'),
+ 2:
+ dict(
+ name='right_thumb2',
+ id=2,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb2'),
+ 3:
+ dict(
+ name='right_thumb1',
+ id=3,
+ color=[255, 128, 0],
+ type='',
+ swap='left_thumb1'),
+ 4:
+ dict(
+ name='right_forefinger4',
+ id=4,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger4'),
+ 5:
+ dict(
+ name='right_forefinger3',
+ id=5,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger3'),
+ 6:
+ dict(
+ name='right_forefinger2',
+ id=6,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger2'),
+ 7:
+ dict(
+ name='right_forefinger1',
+ id=7,
+ color=[255, 153, 255],
+ type='',
+ swap='left_forefinger1'),
+ 8:
+ dict(
+ name='right_middle_finger4',
+ id=8,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger4'),
+ 9:
+ dict(
+ name='right_middle_finger3',
+ id=9,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger3'),
+ 10:
+ dict(
+ name='right_middle_finger2',
+ id=10,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger2'),
+ 11:
+ dict(
+ name='right_middle_finger1',
+ id=11,
+ color=[102, 178, 255],
+ type='',
+ swap='left_middle_finger1'),
+ 12:
+ dict(
+ name='right_ring_finger4',
+ id=12,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger4'),
+ 13:
+ dict(
+ name='right_ring_finger3',
+ id=13,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger3'),
+ 14:
+ dict(
+ name='right_ring_finger2',
+ id=14,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger2'),
+ 15:
+ dict(
+ name='right_ring_finger1',
+ id=15,
+ color=[255, 51, 51],
+ type='',
+ swap='left_ring_finger1'),
+ 16:
+ dict(
+ name='right_pinky_finger4',
+ id=16,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger4'),
+ 17:
+ dict(
+ name='right_pinky_finger3',
+ id=17,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger3'),
+ 18:
+ dict(
+ name='right_pinky_finger2',
+ id=18,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger2'),
+ 19:
+ dict(
+ name='right_pinky_finger1',
+ id=19,
+ color=[0, 255, 0],
+ type='',
+ swap='left_pinky_finger1'),
+ 20:
+ dict(
+ name='right_wrist',
+ id=20,
+ color=[255, 255, 255],
+ type='',
+ swap='left_wrist'),
+ 21:
+ dict(
+ name='left_thumb4',
+ id=21,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb4'),
+ 22:
+ dict(
+ name='left_thumb3',
+ id=22,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb3'),
+ 23:
+ dict(
+ name='left_thumb2',
+ id=23,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb2'),
+ 24:
+ dict(
+ name='left_thumb1',
+ id=24,
+ color=[255, 128, 0],
+ type='',
+ swap='right_thumb1'),
+ 25:
+ dict(
+ name='left_forefinger4',
+ id=25,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger4'),
+ 26:
+ dict(
+ name='left_forefinger3',
+ id=26,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger3'),
+ 27:
+ dict(
+ name='left_forefinger2',
+ id=27,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger2'),
+ 28:
+ dict(
+ name='left_forefinger1',
+ id=28,
+ color=[255, 153, 255],
+ type='',
+ swap='right_forefinger1'),
+ 29:
+ dict(
+ name='left_middle_finger4',
+ id=29,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger4'),
+ 30:
+ dict(
+ name='left_middle_finger3',
+ id=30,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger3'),
+ 31:
+ dict(
+ name='left_middle_finger2',
+ id=31,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger2'),
+ 32:
+ dict(
+ name='left_middle_finger1',
+ id=32,
+ color=[102, 178, 255],
+ type='',
+ swap='right_middle_finger1'),
+ 33:
+ dict(
+ name='left_ring_finger4',
+ id=33,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger4'),
+ 34:
+ dict(
+ name='left_ring_finger3',
+ id=34,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger3'),
+ 35:
+ dict(
+ name='left_ring_finger2',
+ id=35,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger2'),
+ 36:
+ dict(
+ name='left_ring_finger1',
+ id=36,
+ color=[255, 51, 51],
+ type='',
+ swap='right_ring_finger1'),
+ 37:
+ dict(
+ name='left_pinky_finger4',
+ id=37,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger4'),
+ 38:
+ dict(
+ name='left_pinky_finger3',
+ id=38,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger3'),
+ 39:
+ dict(
+ name='left_pinky_finger2',
+ id=39,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger2'),
+ 40:
+ dict(
+ name='left_pinky_finger1',
+ id=40,
+ color=[0, 255, 0],
+ type='',
+ swap='right_pinky_finger1'),
+ 41:
+ dict(
+ name='left_wrist',
+ id=41,
+ color=[255, 255, 255],
+ type='',
+ swap='right_wrist'),
+ },
+ skeleton_info={
+ 0:
+ dict(link=('right_wrist', 'right_thumb1'), id=0, color=[255, 128, 0]),
+ 1:
+ dict(link=('right_thumb1', 'right_thumb2'), id=1, color=[255, 128, 0]),
+ 2:
+ dict(link=('right_thumb2', 'right_thumb3'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_thumb3', 'right_thumb4'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(
+ link=('right_wrist', 'right_forefinger1'),
+ id=4,
+ color=[255, 153, 255]),
+ 5:
+ dict(
+ link=('right_forefinger1', 'right_forefinger2'),
+ id=5,
+ color=[255, 153, 255]),
+ 6:
+ dict(
+ link=('right_forefinger2', 'right_forefinger3'),
+ id=6,
+ color=[255, 153, 255]),
+ 7:
+ dict(
+ link=('right_forefinger3', 'right_forefinger4'),
+ id=7,
+ color=[255, 153, 255]),
+ 8:
+ dict(
+ link=('right_wrist', 'right_middle_finger1'),
+ id=8,
+ color=[102, 178, 255]),
+ 9:
+ dict(
+ link=('right_middle_finger1', 'right_middle_finger2'),
+ id=9,
+ color=[102, 178, 255]),
+ 10:
+ dict(
+ link=('right_middle_finger2', 'right_middle_finger3'),
+ id=10,
+ color=[102, 178, 255]),
+ 11:
+ dict(
+ link=('right_middle_finger3', 'right_middle_finger4'),
+ id=11,
+ color=[102, 178, 255]),
+ 12:
+ dict(
+ link=('right_wrist', 'right_ring_finger1'),
+ id=12,
+ color=[255, 51, 51]),
+ 13:
+ dict(
+ link=('right_ring_finger1', 'right_ring_finger2'),
+ id=13,
+ color=[255, 51, 51]),
+ 14:
+ dict(
+ link=('right_ring_finger2', 'right_ring_finger3'),
+ id=14,
+ color=[255, 51, 51]),
+ 15:
+ dict(
+ link=('right_ring_finger3', 'right_ring_finger4'),
+ id=15,
+ color=[255, 51, 51]),
+ 16:
+ dict(
+ link=('right_wrist', 'right_pinky_finger1'),
+ id=16,
+ color=[0, 255, 0]),
+ 17:
+ dict(
+ link=('right_pinky_finger1', 'right_pinky_finger2'),
+ id=17,
+ color=[0, 255, 0]),
+ 18:
+ dict(
+ link=('right_pinky_finger2', 'right_pinky_finger3'),
+ id=18,
+ color=[0, 255, 0]),
+ 19:
+ dict(
+ link=('right_pinky_finger3', 'right_pinky_finger4'),
+ id=19,
+ color=[0, 255, 0]),
+ 20:
+ dict(link=('left_wrist', 'left_thumb1'), id=20, color=[255, 128, 0]),
+ 21:
+ dict(link=('left_thumb1', 'left_thumb2'), id=21, color=[255, 128, 0]),
+ 22:
+ dict(link=('left_thumb2', 'left_thumb3'), id=22, color=[255, 128, 0]),
+ 23:
+ dict(link=('left_thumb3', 'left_thumb4'), id=23, color=[255, 128, 0]),
+ 24:
+ dict(
+ link=('left_wrist', 'left_forefinger1'),
+ id=24,
+ color=[255, 153, 255]),
+ 25:
+ dict(
+ link=('left_forefinger1', 'left_forefinger2'),
+ id=25,
+ color=[255, 153, 255]),
+ 26:
+ dict(
+ link=('left_forefinger2', 'left_forefinger3'),
+ id=26,
+ color=[255, 153, 255]),
+ 27:
+ dict(
+ link=('left_forefinger3', 'left_forefinger4'),
+ id=27,
+ color=[255, 153, 255]),
+ 28:
+ dict(
+ link=('left_wrist', 'left_middle_finger1'),
+ id=28,
+ color=[102, 178, 255]),
+ 29:
+ dict(
+ link=('left_middle_finger1', 'left_middle_finger2'),
+ id=29,
+ color=[102, 178, 255]),
+ 30:
+ dict(
+ link=('left_middle_finger2', 'left_middle_finger3'),
+ id=30,
+ color=[102, 178, 255]),
+ 31:
+ dict(
+ link=('left_middle_finger3', 'left_middle_finger4'),
+ id=31,
+ color=[102, 178, 255]),
+ 32:
+ dict(
+ link=('left_wrist', 'left_ring_finger1'),
+ id=32,
+ color=[255, 51, 51]),
+ 33:
+ dict(
+ link=('left_ring_finger1', 'left_ring_finger2'),
+ id=33,
+ color=[255, 51, 51]),
+ 34:
+ dict(
+ link=('left_ring_finger2', 'left_ring_finger3'),
+ id=34,
+ color=[255, 51, 51]),
+ 35:
+ dict(
+ link=('left_ring_finger3', 'left_ring_finger4'),
+ id=35,
+ color=[255, 51, 51]),
+ 36:
+ dict(
+ link=('left_wrist', 'left_pinky_finger1'),
+ id=36,
+ color=[0, 255, 0]),
+ 37:
+ dict(
+ link=('left_pinky_finger1', 'left_pinky_finger2'),
+ id=37,
+ color=[0, 255, 0]),
+ 38:
+ dict(
+ link=('left_pinky_finger2', 'left_pinky_finger3'),
+ id=38,
+ color=[0, 255, 0]),
+ 39:
+ dict(
+ link=('left_pinky_finger3', 'left_pinky_finger4'),
+ id=39,
+ color=[0, 255, 0]),
+ },
+ joint_weights=[1.] * 42,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/jhmdb.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/jhmdb.py
new file mode 100644
index 0000000000000000000000000000000000000000..91b45150e2df62b1f9864921cb74225e8a272952
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/jhmdb.py
@@ -0,0 +1,135 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='jhmdb',
+ paper_info=dict(
+ author='H. Jhuang and J. Gall and S. Zuffi and '
+ 'C. Schmid and M. J. Black',
+ title='Towards understanding action recognition',
+ container='International Conf. on Computer Vision (ICCV)',
+ year='2013',
+ homepage='http://jhmdb.is.tue.mpg.de/dataset',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='neck', id=0, color=[255, 128, 0], type='upper', swap=''),
+ 1:
+ dict(name='belly', id=1, color=[255, 128, 0], type='upper', swap=''),
+ 2:
+ dict(name='head', id=2, color=[255, 128, 0], type='upper', swap=''),
+ 3:
+ dict(
+ name='right_shoulder',
+ id=3,
+ color=[0, 255, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 4:
+ dict(
+ name='left_shoulder',
+ id=4,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 5:
+ dict(
+ name='right_hip',
+ id=5,
+ color=[0, 255, 0],
+ type='lower',
+ swap='left_hip'),
+ 6:
+ dict(
+ name='left_hip',
+ id=6,
+ color=[51, 153, 255],
+ type='lower',
+ swap='right_hip'),
+ 7:
+ dict(
+ name='right_elbow',
+ id=7,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_elbow'),
+ 8:
+ dict(
+ name='left_elbow',
+ id=8,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_elbow'),
+ 9:
+ dict(
+ name='right_knee',
+ id=9,
+ color=[51, 153, 255],
+ type='lower',
+ swap='left_knee'),
+ 10:
+ dict(
+ name='left_knee',
+ id=10,
+ color=[255, 128, 0],
+ type='lower',
+ swap='right_knee'),
+ 11:
+ dict(
+ name='right_wrist',
+ id=11,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 12:
+ dict(
+ name='left_wrist',
+ id=12,
+ color=[255, 128, 0],
+ type='upper',
+ swap='right_wrist'),
+ 13:
+ dict(
+ name='right_ankle',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='left_ankle'),
+ 14:
+ dict(
+ name='left_ankle',
+ id=14,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle')
+ },
+ skeleton_info={
+ 0: dict(link=('right_ankle', 'right_knee'), id=0, color=[255, 128, 0]),
+ 1: dict(link=('right_knee', 'right_hip'), id=1, color=[255, 128, 0]),
+ 2: dict(link=('right_hip', 'belly'), id=2, color=[255, 128, 0]),
+ 3: dict(link=('belly', 'left_hip'), id=3, color=[0, 255, 0]),
+ 4: dict(link=('left_hip', 'left_knee'), id=4, color=[0, 255, 0]),
+ 5: dict(link=('left_knee', 'left_ankle'), id=5, color=[0, 255, 0]),
+ 6: dict(link=('belly', 'neck'), id=6, color=[51, 153, 255]),
+ 7: dict(link=('neck', 'head'), id=7, color=[51, 153, 255]),
+ 8: dict(link=('neck', 'right_shoulder'), id=8, color=[255, 128, 0]),
+ 9: dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('right_elbow', 'right_wrist'), id=10, color=[255, 128, 0]),
+ 11: dict(link=('neck', 'left_shoulder'), id=11, color=[0, 255, 0]),
+ 12:
+ dict(link=('left_shoulder', 'left_elbow'), id=12, color=[0, 255, 0]),
+ 13: dict(link=('left_elbow', 'left_wrist'), id=13, color=[0, 255, 0])
+ },
+ joint_weights=[
+ 1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.2, 1.2, 1.5, 1.5, 1.5, 1.5
+ ],
+ # Adapted from COCO dataset.
+ sigmas=[
+ 0.025, 0.107, 0.025, 0.079, 0.079, 0.107, 0.107, 0.072, 0.072, 0.087,
+ 0.087, 0.062, 0.062, 0.089, 0.089
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/lapa.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/lapa.py
new file mode 100644
index 0000000000000000000000000000000000000000..a1e4c157ebf29fcc2d233880cc030450ccaa428f
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/lapa.py
@@ -0,0 +1,694 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='lapa',
+ paper_info=dict(
+ author='Liu, Yinglu and Shi, Hailin and Shen, Hao and Si, '
+ 'Yue and Wang, Xiaobo and Mei, Tao',
+ title='A New Dataset and Boundary-Attention Semantic '
+ 'Segmentation for Face Parsing.',
+ container='Proceedings of the AAAI Conference on '
+ 'Artificial Intelligence 2020',
+ year='2020',
+ homepage='https://github.com/JDAI-CV/lapa-dataset',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='kpt-0', id=0, color=[255, 0, 0], type='upper',
+ swap='kpt-32'),
+ 1:
+ dict(
+ name='kpt-1', id=1, color=[255, 0, 0], type='upper',
+ swap='kpt-31'),
+ 2:
+ dict(
+ name='kpt-2', id=2, color=[255, 0, 0], type='upper',
+ swap='kpt-30'),
+ 3:
+ dict(
+ name='kpt-3', id=3, color=[255, 0, 0], type='lower',
+ swap='kpt-29'),
+ 4:
+ dict(
+ name='kpt-4', id=4, color=[255, 0, 0], type='lower',
+ swap='kpt-28'),
+ 5:
+ dict(
+ name='kpt-5', id=5, color=[255, 0, 0], type='lower',
+ swap='kpt-27'),
+ 6:
+ dict(
+ name='kpt-6', id=6, color=[255, 0, 0], type='lower',
+ swap='kpt-26'),
+ 7:
+ dict(
+ name='kpt-7', id=7, color=[255, 0, 0], type='lower',
+ swap='kpt-25'),
+ 8:
+ dict(
+ name='kpt-8', id=8, color=[255, 0, 0], type='lower',
+ swap='kpt-24'),
+ 9:
+ dict(
+ name='kpt-9', id=9, color=[255, 0, 0], type='lower',
+ swap='kpt-23'),
+ 10:
+ dict(
+ name='kpt-10',
+ id=10,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-22'),
+ 11:
+ dict(
+ name='kpt-11',
+ id=11,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-21'),
+ 12:
+ dict(
+ name='kpt-12',
+ id=12,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-20'),
+ 13:
+ dict(
+ name='kpt-13',
+ id=13,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-19'),
+ 14:
+ dict(
+ name='kpt-14',
+ id=14,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-18'),
+ 15:
+ dict(
+ name='kpt-15',
+ id=15,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-17'),
+ 16:
+ dict(name='kpt-16', id=16, color=[255, 0, 0], type='lower', swap=''),
+ 17:
+ dict(
+ name='kpt-17',
+ id=17,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-15'),
+ 18:
+ dict(
+ name='kpt-18',
+ id=18,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-14'),
+ 19:
+ dict(
+ name='kpt-19',
+ id=19,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-13'),
+ 20:
+ dict(
+ name='kpt-20',
+ id=20,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-12'),
+ 21:
+ dict(
+ name='kpt-21',
+ id=21,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-11'),
+ 22:
+ dict(
+ name='kpt-22',
+ id=22,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-10'),
+ 23:
+ dict(
+ name='kpt-23',
+ id=23,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-9'),
+ 24:
+ dict(
+ name='kpt-24',
+ id=24,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-8'),
+ 25:
+ dict(
+ name='kpt-25',
+ id=25,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-7'),
+ 26:
+ dict(
+ name='kpt-26',
+ id=26,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-6'),
+ 27:
+ dict(
+ name='kpt-27',
+ id=27,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-5'),
+ 28:
+ dict(
+ name='kpt-28',
+ id=28,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-4'),
+ 29:
+ dict(
+ name='kpt-29',
+ id=29,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-3'),
+ 30:
+ dict(
+ name='kpt-30',
+ id=30,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-2'),
+ 31:
+ dict(
+ name='kpt-31',
+ id=31,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-1'),
+ 32:
+ dict(
+ name='kpt-32',
+ id=32,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-0'),
+ 33:
+ dict(
+ name='kpt-33',
+ id=33,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-46'),
+ 34:
+ dict(
+ name='kpt-34',
+ id=34,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-45'),
+ 35:
+ dict(
+ name='kpt-35',
+ id=35,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-44'),
+ 36:
+ dict(
+ name='kpt-36',
+ id=36,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-43'),
+ 37:
+ dict(
+ name='kpt-37',
+ id=37,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-42'),
+ 38:
+ dict(
+ name='kpt-38',
+ id=38,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-50'),
+ 39:
+ dict(
+ name='kpt-39',
+ id=39,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-49'),
+ 40:
+ dict(
+ name='kpt-40',
+ id=40,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-48'),
+ 41:
+ dict(
+ name='kpt-41',
+ id=41,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-47'),
+ 42:
+ dict(
+ name='kpt-42',
+ id=42,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-37'),
+ 43:
+ dict(
+ name='kpt-43',
+ id=43,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-36'),
+ 44:
+ dict(
+ name='kpt-44',
+ id=44,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-35'),
+ 45:
+ dict(
+ name='kpt-45',
+ id=45,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-34'),
+ 46:
+ dict(
+ name='kpt-46',
+ id=46,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-33'),
+ 47:
+ dict(
+ name='kpt-47',
+ id=47,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-41'),
+ 48:
+ dict(
+ name='kpt-48',
+ id=48,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-40'),
+ 49:
+ dict(
+ name='kpt-49',
+ id=49,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-39'),
+ 50:
+ dict(
+ name='kpt-50',
+ id=50,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-38'),
+ 51:
+ dict(name='kpt-51', id=51, color=[255, 0, 0], type='upper', swap=''),
+ 52:
+ dict(name='kpt-52', id=52, color=[255, 0, 0], type='upper', swap=''),
+ 53:
+ dict(name='kpt-53', id=53, color=[255, 0, 0], type='lower', swap=''),
+ 54:
+ dict(name='kpt-54', id=54, color=[255, 0, 0], type='lower', swap=''),
+ 55:
+ dict(
+ name='kpt-55',
+ id=55,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-65'),
+ 56:
+ dict(
+ name='kpt-56',
+ id=56,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-64'),
+ 57:
+ dict(
+ name='kpt-57',
+ id=57,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-63'),
+ 58:
+ dict(
+ name='kpt-58',
+ id=58,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-62'),
+ 59:
+ dict(
+ name='kpt-59',
+ id=59,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-61'),
+ 60:
+ dict(name='kpt-60', id=60, color=[255, 0, 0], type='lower', swap=''),
+ 61:
+ dict(
+ name='kpt-61',
+ id=61,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-59'),
+ 62:
+ dict(
+ name='kpt-62',
+ id=62,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-58'),
+ 63:
+ dict(
+ name='kpt-63',
+ id=63,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-57'),
+ 64:
+ dict(
+ name='kpt-64',
+ id=64,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-56'),
+ 65:
+ dict(
+ name='kpt-65',
+ id=65,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-55'),
+ 66:
+ dict(
+ name='kpt-66',
+ id=66,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-79'),
+ 67:
+ dict(
+ name='kpt-67',
+ id=67,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-78'),
+ 68:
+ dict(
+ name='kpt-68',
+ id=68,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-77'),
+ 69:
+ dict(
+ name='kpt-69',
+ id=69,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-76'),
+ 70:
+ dict(
+ name='kpt-70',
+ id=70,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-75'),
+ 71:
+ dict(
+ name='kpt-71',
+ id=71,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-82'),
+ 72:
+ dict(
+ name='kpt-72',
+ id=72,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-81'),
+ 73:
+ dict(
+ name='kpt-73',
+ id=73,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-80'),
+ 74:
+ dict(
+ name='kpt-74',
+ id=74,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-83'),
+ 75:
+ dict(
+ name='kpt-75',
+ id=75,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-70'),
+ 76:
+ dict(
+ name='kpt-76',
+ id=76,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-69'),
+ 77:
+ dict(
+ name='kpt-77',
+ id=77,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-68'),
+ 78:
+ dict(
+ name='kpt-78',
+ id=78,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-67'),
+ 79:
+ dict(
+ name='kpt-79',
+ id=79,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-66'),
+ 80:
+ dict(
+ name='kpt-80',
+ id=80,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-73'),
+ 81:
+ dict(
+ name='kpt-81',
+ id=81,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-72'),
+ 82:
+ dict(
+ name='kpt-82',
+ id=82,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-71'),
+ 83:
+ dict(
+ name='kpt-83',
+ id=83,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-74'),
+ 84:
+ dict(
+ name='kpt-84',
+ id=84,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-90'),
+ 85:
+ dict(
+ name='kpt-85',
+ id=85,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-89'),
+ 86:
+ dict(
+ name='kpt-86',
+ id=86,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-88'),
+ 87:
+ dict(name='kpt-87', id=87, color=[255, 0, 0], type='lower', swap=''),
+ 88:
+ dict(
+ name='kpt-88',
+ id=88,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-86'),
+ 89:
+ dict(
+ name='kpt-89',
+ id=89,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-85'),
+ 90:
+ dict(
+ name='kpt-90',
+ id=90,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-84'),
+ 91:
+ dict(
+ name='kpt-91',
+ id=91,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-95'),
+ 92:
+ dict(
+ name='kpt-92',
+ id=92,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-94'),
+ 93:
+ dict(name='kpt-93', id=93, color=[255, 0, 0], type='lower', swap=''),
+ 94:
+ dict(
+ name='kpt-94',
+ id=94,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-92'),
+ 95:
+ dict(
+ name='kpt-95',
+ id=95,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-91'),
+ 96:
+ dict(
+ name='kpt-96',
+ id=96,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-100'),
+ 97:
+ dict(
+ name='kpt-97',
+ id=97,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-99'),
+ 98:
+ dict(name='kpt-98', id=98, color=[255, 0, 0], type='lower', swap=''),
+ 99:
+ dict(
+ name='kpt-99',
+ id=99,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-97'),
+ 100:
+ dict(
+ name='kpt-100',
+ id=100,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-96'),
+ 101:
+ dict(
+ name='kpt-101',
+ id=101,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-103'),
+ 102:
+ dict(name='kpt-102', id=102, color=[255, 0, 0], type='lower', swap=''),
+ 103:
+ dict(
+ name='kpt-103',
+ id=103,
+ color=[255, 0, 0],
+ type='lower',
+ swap='kpt-101'),
+ 104:
+ dict(
+ name='kpt-104',
+ id=104,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-105'),
+ 105:
+ dict(
+ name='kpt-105',
+ id=105,
+ color=[255, 0, 0],
+ type='upper',
+ swap='kpt-104')
+ },
+ skeleton_info={},
+ joint_weights=[
+ 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8,
+ 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8,
+ 0.8, 0.8, 0.8, 0.8, 0.8, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0,
+ 2.0, 2.0, 2.0, 2.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 1.0,
+ 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5,
+ 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.0, 1.0
+ ],
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/locust.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/locust.py
new file mode 100644
index 0000000000000000000000000000000000000000..137fea8a259f10b6d9c39526978b55fb7a153bf6
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/locust.py
@@ -0,0 +1,269 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='locust',
+ paper_info=dict(
+ author='Graving, Jacob M and Chae, Daniel and Naik, Hemal and '
+ 'Li, Liang and Koger, Benjamin and Costelloe, Blair R and '
+ 'Couzin, Iain D',
+ title='DeepPoseKit, a software toolkit for fast and robust '
+ 'animal pose estimation using deep learning',
+ container='Elife',
+ year='2019',
+ homepage='https://github.com/jgraving/DeepPoseKit-Data',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='head', id=0, color=[255, 255, 255], type='', swap=''),
+ 1:
+ dict(name='neck', id=1, color=[255, 255, 255], type='', swap=''),
+ 2:
+ dict(name='thorax', id=2, color=[255, 255, 255], type='', swap=''),
+ 3:
+ dict(name='abdomen1', id=3, color=[255, 255, 255], type='', swap=''),
+ 4:
+ dict(name='abdomen2', id=4, color=[255, 255, 255], type='', swap=''),
+ 5:
+ dict(
+ name='anttipL',
+ id=5,
+ color=[255, 255, 255],
+ type='',
+ swap='anttipR'),
+ 6:
+ dict(
+ name='antbaseL',
+ id=6,
+ color=[255, 255, 255],
+ type='',
+ swap='antbaseR'),
+ 7:
+ dict(name='eyeL', id=7, color=[255, 255, 255], type='', swap='eyeR'),
+ 8:
+ dict(
+ name='forelegL1',
+ id=8,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegR1'),
+ 9:
+ dict(
+ name='forelegL2',
+ id=9,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegR2'),
+ 10:
+ dict(
+ name='forelegL3',
+ id=10,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegR3'),
+ 11:
+ dict(
+ name='forelegL4',
+ id=11,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegR4'),
+ 12:
+ dict(
+ name='midlegL1',
+ id=12,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegR1'),
+ 13:
+ dict(
+ name='midlegL2',
+ id=13,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegR2'),
+ 14:
+ dict(
+ name='midlegL3',
+ id=14,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegR3'),
+ 15:
+ dict(
+ name='midlegL4',
+ id=15,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegR4'),
+ 16:
+ dict(
+ name='hindlegL1',
+ id=16,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegR1'),
+ 17:
+ dict(
+ name='hindlegL2',
+ id=17,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegR2'),
+ 18:
+ dict(
+ name='hindlegL3',
+ id=18,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegR3'),
+ 19:
+ dict(
+ name='hindlegL4',
+ id=19,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegR4'),
+ 20:
+ dict(
+ name='anttipR',
+ id=20,
+ color=[255, 255, 255],
+ type='',
+ swap='anttipL'),
+ 21:
+ dict(
+ name='antbaseR',
+ id=21,
+ color=[255, 255, 255],
+ type='',
+ swap='antbaseL'),
+ 22:
+ dict(name='eyeR', id=22, color=[255, 255, 255], type='', swap='eyeL'),
+ 23:
+ dict(
+ name='forelegR1',
+ id=23,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegL1'),
+ 24:
+ dict(
+ name='forelegR2',
+ id=24,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegL2'),
+ 25:
+ dict(
+ name='forelegR3',
+ id=25,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegL3'),
+ 26:
+ dict(
+ name='forelegR4',
+ id=26,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegL4'),
+ 27:
+ dict(
+ name='midlegR1',
+ id=27,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegL1'),
+ 28:
+ dict(
+ name='midlegR2',
+ id=28,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegL2'),
+ 29:
+ dict(
+ name='midlegR3',
+ id=29,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegL3'),
+ 30:
+ dict(
+ name='midlegR4',
+ id=30,
+ color=[255, 255, 255],
+ type='',
+ swap='midlegL4'),
+ 31:
+ dict(
+ name='hindlegR1',
+ id=31,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegL1'),
+ 32:
+ dict(
+ name='hindlegR2',
+ id=32,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegL2'),
+ 33:
+ dict(
+ name='hindlegR3',
+ id=33,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegL3'),
+ 34:
+ dict(
+ name='hindlegR4',
+ id=34,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegL4')
+ },
+ skeleton_info={
+ 0: dict(link=('neck', 'head'), id=0, color=[255, 255, 255]),
+ 1: dict(link=('thorax', 'neck'), id=1, color=[255, 255, 255]),
+ 2: dict(link=('abdomen1', 'thorax'), id=2, color=[255, 255, 255]),
+ 3: dict(link=('abdomen2', 'abdomen1'), id=3, color=[255, 255, 255]),
+ 4: dict(link=('antbaseL', 'anttipL'), id=4, color=[255, 255, 255]),
+ 5: dict(link=('eyeL', 'antbaseL'), id=5, color=[255, 255, 255]),
+ 6: dict(link=('forelegL2', 'forelegL1'), id=6, color=[255, 255, 255]),
+ 7: dict(link=('forelegL3', 'forelegL2'), id=7, color=[255, 255, 255]),
+ 8: dict(link=('forelegL4', 'forelegL3'), id=8, color=[255, 255, 255]),
+ 9: dict(link=('midlegL2', 'midlegL1'), id=9, color=[255, 255, 255]),
+ 10: dict(link=('midlegL3', 'midlegL2'), id=10, color=[255, 255, 255]),
+ 11: dict(link=('midlegL4', 'midlegL3'), id=11, color=[255, 255, 255]),
+ 12:
+ dict(link=('hindlegL2', 'hindlegL1'), id=12, color=[255, 255, 255]),
+ 13:
+ dict(link=('hindlegL3', 'hindlegL2'), id=13, color=[255, 255, 255]),
+ 14:
+ dict(link=('hindlegL4', 'hindlegL3'), id=14, color=[255, 255, 255]),
+ 15: dict(link=('antbaseR', 'anttipR'), id=15, color=[255, 255, 255]),
+ 16: dict(link=('eyeR', 'antbaseR'), id=16, color=[255, 255, 255]),
+ 17:
+ dict(link=('forelegR2', 'forelegR1'), id=17, color=[255, 255, 255]),
+ 18:
+ dict(link=('forelegR3', 'forelegR2'), id=18, color=[255, 255, 255]),
+ 19:
+ dict(link=('forelegR4', 'forelegR3'), id=19, color=[255, 255, 255]),
+ 20: dict(link=('midlegR2', 'midlegR1'), id=20, color=[255, 255, 255]),
+ 21: dict(link=('midlegR3', 'midlegR2'), id=21, color=[255, 255, 255]),
+ 22: dict(link=('midlegR4', 'midlegR3'), id=22, color=[255, 255, 255]),
+ 23:
+ dict(link=('hindlegR2', 'hindlegR1'), id=23, color=[255, 255, 255]),
+ 24:
+ dict(link=('hindlegR3', 'hindlegR2'), id=24, color=[255, 255, 255]),
+ 25:
+ dict(link=('hindlegR4', 'hindlegR3'), id=25, color=[255, 255, 255])
+ },
+ joint_weights=[1.] * 35,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/macaque.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/macaque.py
new file mode 100644
index 0000000000000000000000000000000000000000..4c542f9c7d63a87c88375456056b86b92c3f262a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/macaque.py
@@ -0,0 +1,189 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='macaque',
+ paper_info=dict(
+ author='Labuguen, Rollyn and Matsumoto, Jumpei and '
+ 'Negrete, Salvador and Nishimaru, Hiroshi and '
+ 'Nishijo, Hisao and Takada, Masahiko and '
+ 'Go, Yasuhiro and Inoue, Ken-ichi and Shibata, Tomohiro',
+ title='MacaquePose: A novel "in the wild" macaque monkey pose dataset '
+ 'for markerless motion capture',
+ container='bioRxiv',
+ year='2020',
+ homepage='http://www.pri.kyoto-u.ac.jp/datasets/'
+ 'macaquepose/index.html',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1:
+ dict(
+ name='left_eye',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_eye'),
+ 2:
+ dict(
+ name='right_eye',
+ id=2,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_eye'),
+ 3:
+ dict(
+ name='left_ear',
+ id=3,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 4:
+ dict(
+ name='right_ear',
+ id=4,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='right_shoulder',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 7:
+ dict(
+ name='left_elbow',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 8:
+ dict(
+ name='right_elbow',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 9:
+ dict(
+ name='left_wrist',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='right_hip',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 13:
+ dict(
+ name='left_knee',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 14:
+ dict(
+ name='right_knee',
+ id=14,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 15:
+ dict(
+ name='left_ankle',
+ id=15,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 16:
+ dict(
+ name='right_ankle',
+ id=16,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+ 6:
+ dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(
+ link=('left_shoulder', 'right_shoulder'),
+ id=7,
+ color=[51, 153, 255]),
+ 8:
+ dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('left_eye', 'right_eye'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('nose', 'left_eye'), id=13, color=[51, 153, 255]),
+ 14:
+ dict(link=('nose', 'right_eye'), id=14, color=[51, 153, 255]),
+ 15:
+ dict(link=('left_eye', 'left_ear'), id=15, color=[51, 153, 255]),
+ 16:
+ dict(link=('right_eye', 'right_ear'), id=16, color=[51, 153, 255]),
+ 17:
+ dict(link=('left_ear', 'left_shoulder'), id=17, color=[51, 153, 255]),
+ 18:
+ dict(
+ link=('right_ear', 'right_shoulder'), id=18, color=[51, 153, 255])
+ },
+ joint_weights=[
+ 1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.5, 1.5, 1., 1., 1.2, 1.2, 1.5,
+ 1.5
+ ],
+ sigmas=[
+ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+ 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mhp.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mhp.py
new file mode 100644
index 0000000000000000000000000000000000000000..fb7ce6b8559a4e5f6b5a9014c41d7b74a57bc576
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mhp.py
@@ -0,0 +1,162 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='mhp',
+ paper_info=dict(
+ author='Zhao, Jian and Li, Jianshu and Cheng, Yu and '
+ 'Sim, Terence and Yan, Shuicheng and Feng, Jiashi',
+ title='Understanding humans in crowded scenes: '
+ 'Deep nested adversarial learning and a '
+ 'new benchmark for multi-human parsing',
+ container='Proceedings of the 26th ACM '
+ 'international conference on Multimedia',
+ year='2018',
+ homepage='https://lv-mhp.github.io/dataset',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='right_ankle',
+ id=0,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle'),
+ 1:
+ dict(
+ name='right_knee',
+ id=1,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 2:
+ dict(
+ name='right_hip',
+ id=2,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 3:
+ dict(
+ name='left_hip',
+ id=3,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 4:
+ dict(
+ name='left_knee',
+ id=4,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 5:
+ dict(
+ name='left_ankle',
+ id=5,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 6:
+ dict(name='pelvis', id=6, color=[51, 153, 255], type='lower', swap=''),
+ 7:
+ dict(name='thorax', id=7, color=[51, 153, 255], type='upper', swap=''),
+ 8:
+ dict(
+ name='upper_neck',
+ id=8,
+ color=[51, 153, 255],
+ type='upper',
+ swap=''),
+ 9:
+ dict(
+ name='head_top', id=9, color=[51, 153, 255], type='upper',
+ swap=''),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='right_elbow',
+ id=11,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 12:
+ dict(
+ name='right_shoulder',
+ id=12,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 13:
+ dict(
+ name='left_shoulder',
+ id=13,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 14:
+ dict(
+ name='left_elbow',
+ id=14,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 15:
+ dict(
+ name='left_wrist',
+ id=15,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('right_ankle', 'right_knee'), id=0, color=[255, 128, 0]),
+ 1:
+ dict(link=('right_knee', 'right_hip'), id=1, color=[255, 128, 0]),
+ 2:
+ dict(link=('right_hip', 'pelvis'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('pelvis', 'left_hip'), id=3, color=[0, 255, 0]),
+ 4:
+ dict(link=('left_hip', 'left_knee'), id=4, color=[0, 255, 0]),
+ 5:
+ dict(link=('left_knee', 'left_ankle'), id=5, color=[0, 255, 0]),
+ 6:
+ dict(link=('pelvis', 'thorax'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(link=('thorax', 'upper_neck'), id=7, color=[51, 153, 255]),
+ 8:
+ dict(link=('upper_neck', 'head_top'), id=8, color=[51, 153, 255]),
+ 9:
+ dict(link=('upper_neck', 'right_shoulder'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=10, color=[255, 128,
+ 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('upper_neck', 'left_shoulder'), id=12, color=[0, 255, 0]),
+ 13:
+ dict(link=('left_shoulder', 'left_elbow'), id=13, color=[0, 255, 0]),
+ 14:
+ dict(link=('left_elbow', 'left_wrist'), id=14, color=[0, 255, 0])
+ },
+ joint_weights=[
+ 1.5, 1.2, 1., 1., 1.2, 1.5, 1., 1., 1., 1., 1.5, 1.2, 1., 1., 1.2, 1.5
+ ],
+ # Adapted from COCO dataset.
+ sigmas=[
+ 0.089, 0.083, 0.107, 0.107, 0.083, 0.089, 0.026, 0.026, 0.026, 0.026,
+ 0.062, 0.072, 0.179, 0.179, 0.072, 0.062
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpi_inf_3dhp.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpi_inf_3dhp.py
new file mode 100644
index 0000000000000000000000000000000000000000..36a1cdc2d2bd66a0a3eb7c1d9becd4bad1cd5065
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpi_inf_3dhp.py
@@ -0,0 +1,138 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='mpi_inf_3dhp',
+ paper_info=dict(
+ author='ehta, Dushyant and Rhodin, Helge and Casas, Dan and '
+ 'Fua, Pascal and Sotnychenko, Oleksandr and Xu, Weipeng and '
+ 'Theobalt, Christian',
+ title='Monocular 3D Human Pose Estimation In The Wild Using Improved '
+ 'CNN Supervision',
+ container='2017 international conference on 3D vision (3DV)',
+ year='2017',
+ homepage='http://gvv.mpi-inf.mpg.de/3dhp-dataset',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='head_top', id=0, color=[51, 153, 255], type='upper',
+ swap=''),
+ 1:
+ dict(name='neck', id=1, color=[51, 153, 255], type='upper', swap=''),
+ 2:
+ dict(
+ name='right_shoulder',
+ id=2,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 3:
+ dict(
+ name='right_elbow',
+ id=3,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 4:
+ dict(
+ name='right_wrist',
+ id=4,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='left_elbow',
+ id=6,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 7:
+ dict(
+ name='left_wrist',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 8:
+ dict(
+ name='right_hip',
+ id=8,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 9:
+ dict(
+ name='right_knee',
+ id=9,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 10:
+ dict(
+ name='right_ankle',
+ id=10,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='left_knee',
+ id=12,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 13:
+ dict(
+ name='left_ankle',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 14:
+ dict(name='root', id=14, color=[51, 153, 255], type='lower', swap=''),
+ 15:
+ dict(name='spine', id=15, color=[51, 153, 255], type='upper', swap=''),
+ 16:
+ dict(name='head', id=16, color=[51, 153, 255], type='upper', swap='')
+ },
+ skeleton_info={
+ 0: dict(link=('neck', 'right_shoulder'), id=0, color=[255, 128, 0]),
+ 1: dict(
+ link=('right_shoulder', 'right_elbow'), id=1, color=[255, 128, 0]),
+ 2:
+ dict(link=('right_elbow', 'right_wrist'), id=2, color=[255, 128, 0]),
+ 3: dict(link=('neck', 'left_shoulder'), id=3, color=[0, 255, 0]),
+ 4: dict(link=('left_shoulder', 'left_elbow'), id=4, color=[0, 255, 0]),
+ 5: dict(link=('left_elbow', 'left_wrist'), id=5, color=[0, 255, 0]),
+ 6: dict(link=('root', 'right_hip'), id=6, color=[255, 128, 0]),
+ 7: dict(link=('right_hip', 'right_knee'), id=7, color=[255, 128, 0]),
+ 8: dict(link=('right_knee', 'right_ankle'), id=8, color=[255, 128, 0]),
+ 9: dict(link=('root', 'left_hip'), id=9, color=[0, 255, 0]),
+ 10: dict(link=('left_hip', 'left_knee'), id=10, color=[0, 255, 0]),
+ 11: dict(link=('left_knee', 'left_ankle'), id=11, color=[0, 255, 0]),
+ 12: dict(link=('head_top', 'head'), id=12, color=[51, 153, 255]),
+ 13: dict(link=('head', 'neck'), id=13, color=[51, 153, 255]),
+ 14: dict(link=('neck', 'spine'), id=14, color=[51, 153, 255]),
+ 15: dict(link=('spine', 'root'), id=15, color=[51, 153, 255])
+ },
+ joint_weights=[1.] * 17,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpii.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpii.py
new file mode 100644
index 0000000000000000000000000000000000000000..2e2ec97915498984a02f353720cccaa18197b4d4
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpii.py
@@ -0,0 +1,161 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='mpii',
+ paper_info=dict(
+ author='Mykhaylo Andriluka and Leonid Pishchulin and '
+ 'Peter Gehler and Schiele, Bernt',
+ title='2D Human Pose Estimation: New Benchmark and '
+ 'State of the Art Analysis',
+ container='IEEE Conference on Computer Vision and '
+ 'Pattern Recognition (CVPR)',
+ year='2014',
+ homepage='http://human-pose.mpi-inf.mpg.de/',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='right_ankle',
+ id=0,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle'),
+ 1:
+ dict(
+ name='right_knee',
+ id=1,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 2:
+ dict(
+ name='right_hip',
+ id=2,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 3:
+ dict(
+ name='left_hip',
+ id=3,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 4:
+ dict(
+ name='left_knee',
+ id=4,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 5:
+ dict(
+ name='left_ankle',
+ id=5,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 6:
+ dict(name='pelvis', id=6, color=[51, 153, 255], type='lower', swap=''),
+ 7:
+ dict(name='thorax', id=7, color=[51, 153, 255], type='upper', swap=''),
+ 8:
+ dict(
+ name='upper_neck',
+ id=8,
+ color=[51, 153, 255],
+ type='upper',
+ swap=''),
+ 9:
+ dict(
+ name='head_top', id=9, color=[51, 153, 255], type='upper',
+ swap=''),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='right_elbow',
+ id=11,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 12:
+ dict(
+ name='right_shoulder',
+ id=12,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 13:
+ dict(
+ name='left_shoulder',
+ id=13,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 14:
+ dict(
+ name='left_elbow',
+ id=14,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 15:
+ dict(
+ name='left_wrist',
+ id=15,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('right_ankle', 'right_knee'), id=0, color=[255, 128, 0]),
+ 1:
+ dict(link=('right_knee', 'right_hip'), id=1, color=[255, 128, 0]),
+ 2:
+ dict(link=('right_hip', 'pelvis'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('pelvis', 'left_hip'), id=3, color=[0, 255, 0]),
+ 4:
+ dict(link=('left_hip', 'left_knee'), id=4, color=[0, 255, 0]),
+ 5:
+ dict(link=('left_knee', 'left_ankle'), id=5, color=[0, 255, 0]),
+ 6:
+ dict(link=('pelvis', 'thorax'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(link=('thorax', 'upper_neck'), id=7, color=[51, 153, 255]),
+ 8:
+ dict(link=('upper_neck', 'head_top'), id=8, color=[51, 153, 255]),
+ 9:
+ dict(link=('upper_neck', 'right_shoulder'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=10, color=[255, 128,
+ 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('upper_neck', 'left_shoulder'), id=12, color=[0, 255, 0]),
+ 13:
+ dict(link=('left_shoulder', 'left_elbow'), id=13, color=[0, 255, 0]),
+ 14:
+ dict(link=('left_elbow', 'left_wrist'), id=14, color=[0, 255, 0])
+ },
+ joint_weights=[
+ 1.5, 1.2, 1., 1., 1.2, 1.5, 1., 1., 1., 1., 1.5, 1.2, 1., 1., 1.2, 1.5
+ ],
+ # Adapted from COCO dataset.
+ sigmas=[
+ 0.089, 0.083, 0.107, 0.107, 0.083, 0.089, 0.026, 0.026, 0.026, 0.026,
+ 0.062, 0.072, 0.179, 0.179, 0.072, 0.062
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpii2coco.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpii2coco.py
new file mode 100644
index 0000000000000000000000000000000000000000..3d3e15037fb8588b4058ae3ed954dea7ab87143e
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpii2coco.py
@@ -0,0 +1,187 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='mpii2coco',
+ paper_info=dict(
+ author='Lin, Tsung-Yi and Maire, Michael and '
+ 'Belongie, Serge and Hays, James and '
+ 'Perona, Pietro and Ramanan, Deva and '
+ r'Doll{\'a}r, Piotr and Zitnick, C Lawrence',
+ title='Microsoft coco: Common objects in context',
+ container='European conference on computer vision',
+ year='2014',
+ homepage='http://cocodataset.org/',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1:
+ dict(
+ name='left_eye',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_eye'),
+ 2:
+ dict(
+ name='right_eye',
+ id=2,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_eye'),
+ 3:
+ dict(
+ name='left_ear',
+ id=3,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 4:
+ dict(
+ name='right_ear',
+ id=4,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='right_shoulder',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 7:
+ dict(
+ name='left_elbow',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 8:
+ dict(
+ name='right_elbow',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 9:
+ dict(
+ name='left_wrist',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='right_hip',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 13:
+ dict(
+ name='left_knee',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 14:
+ dict(
+ name='right_knee',
+ id=14,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 15:
+ dict(
+ name='left_ankle',
+ id=15,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 16:
+ dict(
+ name='right_ankle',
+ id=16,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+ 6:
+ dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(
+ link=('left_shoulder', 'right_shoulder'),
+ id=7,
+ color=[51, 153, 255]),
+ 8:
+ dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('left_eye', 'right_eye'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('nose', 'left_eye'), id=13, color=[51, 153, 255]),
+ 14:
+ dict(link=('nose', 'right_eye'), id=14, color=[51, 153, 255]),
+ 15:
+ dict(link=('left_eye', 'left_ear'), id=15, color=[51, 153, 255]),
+ 16:
+ dict(link=('right_eye', 'right_ear'), id=16, color=[51, 153, 255]),
+ 17:
+ dict(link=('left_ear', 'left_shoulder'), id=17, color=[51, 153, 255]),
+ 18:
+ dict(
+ link=('right_ear', 'right_shoulder'), id=18, color=[51, 153, 255])
+ },
+ joint_weights=[
+ 1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.5, 1.5, 1., 1., 1.2, 1.2, 1.5,
+ 1.5
+ ],
+ sigmas=[
+ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+ 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpii2goliath.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpii2goliath.py
new file mode 100644
index 0000000000000000000000000000000000000000..d9c3e98845f854d04018b72273ab1108c2e842ec
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpii2goliath.py
@@ -0,0 +1,11 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from configs._base_.datasets.goliath import dataset_info as goliath_info
+
+goliath_info = goliath_info.build()
+dataset_info = goliath_info.copy()
+dataset_info['dataset_name'] = 'mpii2goliath'
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpii2goliath3d.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpii2goliath3d.py
new file mode 100644
index 0000000000000000000000000000000000000000..47f166afaa547ca09362c359b918ca7cb8f9569c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpii2goliath3d.py
@@ -0,0 +1,11 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from configs._base_.datasets.goliath3d import dataset_info as goliath_info
+
+goliath_info = goliath_info.build()
+dataset_info = goliath_info.copy()
+dataset_info['dataset_name'] = 'mpii2goliath3d'
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpii_trb.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpii_trb.py
new file mode 100644
index 0000000000000000000000000000000000000000..690d53a09fae715176cf038607adb33ed535702f
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/mpii_trb.py
@@ -0,0 +1,386 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='mpii_trb',
+ paper_info=dict(
+ author='Duan, Haodong and Lin, Kwan-Yee and Jin, Sheng and '
+ 'Liu, Wentao and Qian, Chen and Ouyang, Wanli',
+ title='TRB: A Novel Triplet Representation for '
+ 'Understanding 2D Human Body',
+ container='Proceedings of the IEEE International '
+ 'Conference on Computer Vision',
+ year='2019',
+ homepage='https://github.com/kennymckormick/'
+ 'Triplet-Representation-of-human-Body',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='left_shoulder',
+ id=0,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 1:
+ dict(
+ name='right_shoulder',
+ id=1,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 2:
+ dict(
+ name='left_elbow',
+ id=2,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 3:
+ dict(
+ name='right_elbow',
+ id=3,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 4:
+ dict(
+ name='left_wrist',
+ id=4,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 5:
+ dict(
+ name='right_wrist',
+ id=5,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 6:
+ dict(
+ name='left_hip',
+ id=6,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 7:
+ dict(
+ name='right_hip',
+ id=7,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 8:
+ dict(
+ name='left_knee',
+ id=8,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 9:
+ dict(
+ name='right_knee',
+ id=9,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 10:
+ dict(
+ name='left_ankle',
+ id=10,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 11:
+ dict(
+ name='right_ankle',
+ id=11,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle'),
+ 12:
+ dict(name='head', id=12, color=[51, 153, 255], type='upper', swap=''),
+ 13:
+ dict(name='neck', id=13, color=[51, 153, 255], type='upper', swap=''),
+ 14:
+ dict(
+ name='right_neck',
+ id=14,
+ color=[255, 255, 255],
+ type='upper',
+ swap='left_neck'),
+ 15:
+ dict(
+ name='left_neck',
+ id=15,
+ color=[255, 255, 255],
+ type='upper',
+ swap='right_neck'),
+ 16:
+ dict(
+ name='medial_right_shoulder',
+ id=16,
+ color=[255, 255, 255],
+ type='upper',
+ swap='medial_left_shoulder'),
+ 17:
+ dict(
+ name='lateral_right_shoulder',
+ id=17,
+ color=[255, 255, 255],
+ type='upper',
+ swap='lateral_left_shoulder'),
+ 18:
+ dict(
+ name='medial_right_bow',
+ id=18,
+ color=[255, 255, 255],
+ type='upper',
+ swap='medial_left_bow'),
+ 19:
+ dict(
+ name='lateral_right_bow',
+ id=19,
+ color=[255, 255, 255],
+ type='upper',
+ swap='lateral_left_bow'),
+ 20:
+ dict(
+ name='medial_right_wrist',
+ id=20,
+ color=[255, 255, 255],
+ type='upper',
+ swap='medial_left_wrist'),
+ 21:
+ dict(
+ name='lateral_right_wrist',
+ id=21,
+ color=[255, 255, 255],
+ type='upper',
+ swap='lateral_left_wrist'),
+ 22:
+ dict(
+ name='medial_left_shoulder',
+ id=22,
+ color=[255, 255, 255],
+ type='upper',
+ swap='medial_right_shoulder'),
+ 23:
+ dict(
+ name='lateral_left_shoulder',
+ id=23,
+ color=[255, 255, 255],
+ type='upper',
+ swap='lateral_right_shoulder'),
+ 24:
+ dict(
+ name='medial_left_bow',
+ id=24,
+ color=[255, 255, 255],
+ type='upper',
+ swap='medial_right_bow'),
+ 25:
+ dict(
+ name='lateral_left_bow',
+ id=25,
+ color=[255, 255, 255],
+ type='upper',
+ swap='lateral_right_bow'),
+ 26:
+ dict(
+ name='medial_left_wrist',
+ id=26,
+ color=[255, 255, 255],
+ type='upper',
+ swap='medial_right_wrist'),
+ 27:
+ dict(
+ name='lateral_left_wrist',
+ id=27,
+ color=[255, 255, 255],
+ type='upper',
+ swap='lateral_right_wrist'),
+ 28:
+ dict(
+ name='medial_right_hip',
+ id=28,
+ color=[255, 255, 255],
+ type='lower',
+ swap='medial_left_hip'),
+ 29:
+ dict(
+ name='lateral_right_hip',
+ id=29,
+ color=[255, 255, 255],
+ type='lower',
+ swap='lateral_left_hip'),
+ 30:
+ dict(
+ name='medial_right_knee',
+ id=30,
+ color=[255, 255, 255],
+ type='lower',
+ swap='medial_left_knee'),
+ 31:
+ dict(
+ name='lateral_right_knee',
+ id=31,
+ color=[255, 255, 255],
+ type='lower',
+ swap='lateral_left_knee'),
+ 32:
+ dict(
+ name='medial_right_ankle',
+ id=32,
+ color=[255, 255, 255],
+ type='lower',
+ swap='medial_left_ankle'),
+ 33:
+ dict(
+ name='lateral_right_ankle',
+ id=33,
+ color=[255, 255, 255],
+ type='lower',
+ swap='lateral_left_ankle'),
+ 34:
+ dict(
+ name='medial_left_hip',
+ id=34,
+ color=[255, 255, 255],
+ type='lower',
+ swap='medial_right_hip'),
+ 35:
+ dict(
+ name='lateral_left_hip',
+ id=35,
+ color=[255, 255, 255],
+ type='lower',
+ swap='lateral_right_hip'),
+ 36:
+ dict(
+ name='medial_left_knee',
+ id=36,
+ color=[255, 255, 255],
+ type='lower',
+ swap='medial_right_knee'),
+ 37:
+ dict(
+ name='lateral_left_knee',
+ id=37,
+ color=[255, 255, 255],
+ type='lower',
+ swap='lateral_right_knee'),
+ 38:
+ dict(
+ name='medial_left_ankle',
+ id=38,
+ color=[255, 255, 255],
+ type='lower',
+ swap='medial_right_ankle'),
+ 39:
+ dict(
+ name='lateral_left_ankle',
+ id=39,
+ color=[255, 255, 255],
+ type='lower',
+ swap='lateral_right_ankle'),
+ },
+ skeleton_info={
+ 0:
+ dict(link=('head', 'neck'), id=0, color=[51, 153, 255]),
+ 1:
+ dict(link=('neck', 'left_shoulder'), id=1, color=[51, 153, 255]),
+ 2:
+ dict(link=('neck', 'right_shoulder'), id=2, color=[51, 153, 255]),
+ 3:
+ dict(link=('left_shoulder', 'left_elbow'), id=3, color=[0, 255, 0]),
+ 4:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=4, color=[255, 128, 0]),
+ 5:
+ dict(link=('left_elbow', 'left_wrist'), id=5, color=[0, 255, 0]),
+ 6:
+ dict(link=('right_elbow', 'right_wrist'), id=6, color=[255, 128, 0]),
+ 7:
+ dict(link=('left_shoulder', 'left_hip'), id=7, color=[51, 153, 255]),
+ 8:
+ dict(link=('right_shoulder', 'right_hip'), id=8, color=[51, 153, 255]),
+ 9:
+ dict(link=('left_hip', 'right_hip'), id=9, color=[51, 153, 255]),
+ 10:
+ dict(link=('left_hip', 'left_knee'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_hip', 'right_knee'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('left_knee', 'left_ankle'), id=12, color=[0, 255, 0]),
+ 13:
+ dict(link=('right_knee', 'right_ankle'), id=13, color=[255, 128, 0]),
+ 14:
+ dict(link=('right_neck', 'left_neck'), id=14, color=[255, 255, 255]),
+ 15:
+ dict(
+ link=('medial_right_shoulder', 'lateral_right_shoulder'),
+ id=15,
+ color=[255, 255, 255]),
+ 16:
+ dict(
+ link=('medial_right_bow', 'lateral_right_bow'),
+ id=16,
+ color=[255, 255, 255]),
+ 17:
+ dict(
+ link=('medial_right_wrist', 'lateral_right_wrist'),
+ id=17,
+ color=[255, 255, 255]),
+ 18:
+ dict(
+ link=('medial_left_shoulder', 'lateral_left_shoulder'),
+ id=18,
+ color=[255, 255, 255]),
+ 19:
+ dict(
+ link=('medial_left_bow', 'lateral_left_bow'),
+ id=19,
+ color=[255, 255, 255]),
+ 20:
+ dict(
+ link=('medial_left_wrist', 'lateral_left_wrist'),
+ id=20,
+ color=[255, 255, 255]),
+ 21:
+ dict(
+ link=('medial_right_hip', 'lateral_right_hip'),
+ id=21,
+ color=[255, 255, 255]),
+ 22:
+ dict(
+ link=('medial_right_knee', 'lateral_right_knee'),
+ id=22,
+ color=[255, 255, 255]),
+ 23:
+ dict(
+ link=('medial_right_ankle', 'lateral_right_ankle'),
+ id=23,
+ color=[255, 255, 255]),
+ 24:
+ dict(
+ link=('medial_left_hip', 'lateral_left_hip'),
+ id=24,
+ color=[255, 255, 255]),
+ 25:
+ dict(
+ link=('medial_left_knee', 'lateral_left_knee'),
+ id=25,
+ color=[255, 255, 255]),
+ 26:
+ dict(
+ link=('medial_left_ankle', 'lateral_left_ankle'),
+ id=26,
+ color=[255, 255, 255])
+ },
+ joint_weights=[1.] * 40,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/ochuman.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/ochuman.py
new file mode 100644
index 0000000000000000000000000000000000000000..b9cb81edac8ed7c0f3c190552e36c2b4f8a43fd9
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/ochuman.py
@@ -0,0 +1,187 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='ochuman',
+ paper_info=dict(
+ author='Zhang, Song-Hai and Li, Ruilong and Dong, Xin and '
+ 'Rosin, Paul and Cai, Zixi and Han, Xi and '
+ 'Yang, Dingcheng and Huang, Haozhi and Hu, Shi-Min',
+ title='Pose2seg: Detection free human instance segmentation',
+ container='Proceedings of the IEEE conference on computer '
+ 'vision and pattern recognition',
+ year='2019',
+ homepage='https://github.com/liruilong940607/OCHumanApi',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1:
+ dict(
+ name='left_eye',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_eye'),
+ 2:
+ dict(
+ name='right_eye',
+ id=2,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_eye'),
+ 3:
+ dict(
+ name='left_ear',
+ id=3,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 4:
+ dict(
+ name='right_ear',
+ id=4,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='right_shoulder',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 7:
+ dict(
+ name='left_elbow',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 8:
+ dict(
+ name='right_elbow',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 9:
+ dict(
+ name='left_wrist',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='right_hip',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 13:
+ dict(
+ name='left_knee',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 14:
+ dict(
+ name='right_knee',
+ id=14,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 15:
+ dict(
+ name='left_ankle',
+ id=15,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 16:
+ dict(
+ name='right_ankle',
+ id=16,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+ 6:
+ dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(
+ link=('left_shoulder', 'right_shoulder'),
+ id=7,
+ color=[51, 153, 255]),
+ 8:
+ dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('left_eye', 'right_eye'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('nose', 'left_eye'), id=13, color=[51, 153, 255]),
+ 14:
+ dict(link=('nose', 'right_eye'), id=14, color=[51, 153, 255]),
+ 15:
+ dict(link=('left_eye', 'left_ear'), id=15, color=[51, 153, 255]),
+ 16:
+ dict(link=('right_eye', 'right_ear'), id=16, color=[51, 153, 255]),
+ 17:
+ dict(link=('left_ear', 'left_shoulder'), id=17, color=[51, 153, 255]),
+ 18:
+ dict(
+ link=('right_ear', 'right_shoulder'), id=18, color=[51, 153, 255])
+ },
+ joint_weights=[
+ 1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.5, 1.5, 1., 1., 1.2, 1.2, 1.5,
+ 1.5
+ ],
+ sigmas=[
+ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+ 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/onehand10k.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/onehand10k.py
new file mode 100644
index 0000000000000000000000000000000000000000..7c88b8e0d4eaed2c02a5569ad4b3ef6352ca24f1
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/onehand10k.py
@@ -0,0 +1,148 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='onehand10k',
+ paper_info=dict(
+ author='Wang, Yangang and Peng, Cong and Liu, Yebin',
+ title='Mask-pose cascaded cnn for 2d hand pose estimation '
+ 'from single color image',
+ container='IEEE Transactions on Circuits and Systems '
+ 'for Video Technology',
+ year='2018',
+ homepage='https://www.yangangwang.com/papers/WANG-MCC-2018-10.html',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='wrist', id=0, color=[255, 255, 255], type='', swap=''),
+ 1:
+ dict(name='thumb1', id=1, color=[255, 128, 0], type='', swap=''),
+ 2:
+ dict(name='thumb2', id=2, color=[255, 128, 0], type='', swap=''),
+ 3:
+ dict(name='thumb3', id=3, color=[255, 128, 0], type='', swap=''),
+ 4:
+ dict(name='thumb4', id=4, color=[255, 128, 0], type='', swap=''),
+ 5:
+ dict(
+ name='forefinger1', id=5, color=[255, 153, 255], type='', swap=''),
+ 6:
+ dict(
+ name='forefinger2', id=6, color=[255, 153, 255], type='', swap=''),
+ 7:
+ dict(
+ name='forefinger3', id=7, color=[255, 153, 255], type='', swap=''),
+ 8:
+ dict(
+ name='forefinger4', id=8, color=[255, 153, 255], type='', swap=''),
+ 9:
+ dict(
+ name='middle_finger1',
+ id=9,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 10:
+ dict(
+ name='middle_finger2',
+ id=10,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 11:
+ dict(
+ name='middle_finger3',
+ id=11,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 12:
+ dict(
+ name='middle_finger4',
+ id=12,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 13:
+ dict(
+ name='ring_finger1', id=13, color=[255, 51, 51], type='', swap=''),
+ 14:
+ dict(
+ name='ring_finger2', id=14, color=[255, 51, 51], type='', swap=''),
+ 15:
+ dict(
+ name='ring_finger3', id=15, color=[255, 51, 51], type='', swap=''),
+ 16:
+ dict(
+ name='ring_finger4', id=16, color=[255, 51, 51], type='', swap=''),
+ 17:
+ dict(name='pinky_finger1', id=17, color=[0, 255, 0], type='', swap=''),
+ 18:
+ dict(name='pinky_finger2', id=18, color=[0, 255, 0], type='', swap=''),
+ 19:
+ dict(name='pinky_finger3', id=19, color=[0, 255, 0], type='', swap=''),
+ 20:
+ dict(name='pinky_finger4', id=20, color=[0, 255, 0], type='', swap='')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('wrist', 'thumb1'), id=0, color=[255, 128, 0]),
+ 1:
+ dict(link=('thumb1', 'thumb2'), id=1, color=[255, 128, 0]),
+ 2:
+ dict(link=('thumb2', 'thumb3'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('thumb3', 'thumb4'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('wrist', 'forefinger1'), id=4, color=[255, 153, 255]),
+ 5:
+ dict(link=('forefinger1', 'forefinger2'), id=5, color=[255, 153, 255]),
+ 6:
+ dict(link=('forefinger2', 'forefinger3'), id=6, color=[255, 153, 255]),
+ 7:
+ dict(link=('forefinger3', 'forefinger4'), id=7, color=[255, 153, 255]),
+ 8:
+ dict(link=('wrist', 'middle_finger1'), id=8, color=[102, 178, 255]),
+ 9:
+ dict(
+ link=('middle_finger1', 'middle_finger2'),
+ id=9,
+ color=[102, 178, 255]),
+ 10:
+ dict(
+ link=('middle_finger2', 'middle_finger3'),
+ id=10,
+ color=[102, 178, 255]),
+ 11:
+ dict(
+ link=('middle_finger3', 'middle_finger4'),
+ id=11,
+ color=[102, 178, 255]),
+ 12:
+ dict(link=('wrist', 'ring_finger1'), id=12, color=[255, 51, 51]),
+ 13:
+ dict(
+ link=('ring_finger1', 'ring_finger2'), id=13, color=[255, 51, 51]),
+ 14:
+ dict(
+ link=('ring_finger2', 'ring_finger3'), id=14, color=[255, 51, 51]),
+ 15:
+ dict(
+ link=('ring_finger3', 'ring_finger4'), id=15, color=[255, 51, 51]),
+ 16:
+ dict(link=('wrist', 'pinky_finger1'), id=16, color=[0, 255, 0]),
+ 17:
+ dict(
+ link=('pinky_finger1', 'pinky_finger2'), id=17, color=[0, 255, 0]),
+ 18:
+ dict(
+ link=('pinky_finger2', 'pinky_finger3'), id=18, color=[0, 255, 0]),
+ 19:
+ dict(
+ link=('pinky_finger3', 'pinky_finger4'), id=19, color=[0, 255, 0])
+ },
+ joint_weights=[1.] * 21,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/panoptic_body3d.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/panoptic_body3d.py
new file mode 100644
index 0000000000000000000000000000000000000000..0010e4342d90412dd20d9f0f9127f058058e29d7
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/panoptic_body3d.py
@@ -0,0 +1,166 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='panoptic_pose_3d',
+ paper_info=dict(
+ author='Joo, Hanbyul and Simon, Tomas and Li, Xulong'
+ 'and Liu, Hao and Tan, Lei and Gui, Lin and Banerjee, Sean'
+ 'and Godisart, Timothy and Nabbe, Bart and Matthews, Iain'
+ 'and Kanade, Takeo and Nobuhara, Shohei and Sheikh, Yaser',
+ title='Panoptic Studio: A Massively Multiview System '
+ 'for Interaction Motion Capture',
+ container='IEEE Transactions on Pattern Analysis'
+ ' and Machine Intelligence',
+ year='2017',
+ homepage='http://domedb.perception.cs.cmu.edu',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='neck', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1:
+ dict(name='nose', id=1, color=[51, 153, 255], type='upper', swap=''),
+ 2:
+ dict(name='mid_hip', id=2, color=[0, 255, 0], type='lower', swap=''),
+ 3:
+ dict(
+ name='left_shoulder',
+ id=3,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 4:
+ dict(
+ name='left_elbow',
+ id=4,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 5:
+ dict(
+ name='left_wrist',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 6:
+ dict(
+ name='left_hip',
+ id=6,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 7:
+ dict(
+ name='left_knee',
+ id=7,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 8:
+ dict(
+ name='left_ankle',
+ id=8,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 9:
+ dict(
+ name='right_shoulder',
+ id=9,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 10:
+ dict(
+ name='right_elbow',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 11:
+ dict(
+ name='right_wrist',
+ id=11,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 12:
+ dict(
+ name='right_hip',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 13:
+ dict(
+ name='right_knee',
+ id=13,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 14:
+ dict(
+ name='right_ankle',
+ id=14,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle'),
+ 15:
+ dict(
+ name='left_eye',
+ id=15,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_eye'),
+ 16:
+ dict(
+ name='left_ear',
+ id=16,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 17:
+ dict(
+ name='right_eye',
+ id=17,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_eye'),
+ 18:
+ dict(
+ name='right_ear',
+ id=18,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear')
+ },
+ skeleton_info={
+ 0: dict(link=('nose', 'neck'), id=0, color=[51, 153, 255]),
+ 1: dict(link=('neck', 'left_shoulder'), id=1, color=[0, 255, 0]),
+ 2: dict(link=('neck', 'right_shoulder'), id=2, color=[255, 128, 0]),
+ 3: dict(link=('left_shoulder', 'left_elbow'), id=3, color=[0, 255, 0]),
+ 4: dict(
+ link=('right_shoulder', 'right_elbow'), id=4, color=[255, 128, 0]),
+ 5: dict(link=('left_elbow', 'left_wrist'), id=5, color=[0, 255, 0]),
+ 6:
+ dict(link=('right_elbow', 'right_wrist'), id=6, color=[255, 128, 0]),
+ 7: dict(link=('left_ankle', 'left_knee'), id=7, color=[0, 255, 0]),
+ 8: dict(link=('left_knee', 'left_hip'), id=8, color=[0, 255, 0]),
+ 9: dict(link=('right_ankle', 'right_knee'), id=9, color=[255, 128, 0]),
+ 10: dict(link=('right_knee', 'right_hip'), id=10, color=[255, 128, 0]),
+ 11: dict(link=('mid_hip', 'left_hip'), id=11, color=[0, 255, 0]),
+ 12: dict(link=('mid_hip', 'right_hip'), id=12, color=[255, 128, 0]),
+ 13: dict(link=('mid_hip', 'neck'), id=13, color=[51, 153, 255]),
+ },
+ joint_weights=[
+ 1.0, 1.0, 1.0, 1.0, 1.2, 1.5, 1.0, 1.2, 1.5, 1.0, 1.2, 1.5, 1.0, 1.2,
+ 1.5, 1.0, 1.0, 1.0, 1.0
+ ],
+ sigmas=[
+ 0.026, 0.026, 0.107, 0.079, 0.072, 0.062, 0.107, 0.087, 0.089, 0.079,
+ 0.072, 0.062, 0.107, 0.087, 0.089, 0.025, 0.035, 0.025, 0.035
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/panoptic_hand2d.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/panoptic_hand2d.py
new file mode 100644
index 0000000000000000000000000000000000000000..1d35183c7756ecc7104845a72408e728a7551586
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/panoptic_hand2d.py
@@ -0,0 +1,149 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='panoptic_hand2d',
+ paper_info=dict(
+ author='Simon, Tomas and Joo, Hanbyul and '
+ 'Matthews, Iain and Sheikh, Yaser',
+ title='Hand keypoint detection in single images using '
+ 'multiview bootstrapping',
+ container='Proceedings of the IEEE conference on '
+ 'Computer Vision and Pattern Recognition',
+ year='2017',
+ homepage='http://domedb.perception.cs.cmu.edu/handdb.html',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='wrist', id=0, color=[255, 255, 255], type='', swap=''),
+ 1:
+ dict(name='thumb1', id=1, color=[255, 128, 0], type='', swap=''),
+ 2:
+ dict(name='thumb2', id=2, color=[255, 128, 0], type='', swap=''),
+ 3:
+ dict(name='thumb3', id=3, color=[255, 128, 0], type='', swap=''),
+ 4:
+ dict(name='thumb4', id=4, color=[255, 128, 0], type='', swap=''),
+ 5:
+ dict(
+ name='forefinger1', id=5, color=[255, 153, 255], type='', swap=''),
+ 6:
+ dict(
+ name='forefinger2', id=6, color=[255, 153, 255], type='', swap=''),
+ 7:
+ dict(
+ name='forefinger3', id=7, color=[255, 153, 255], type='', swap=''),
+ 8:
+ dict(
+ name='forefinger4', id=8, color=[255, 153, 255], type='', swap=''),
+ 9:
+ dict(
+ name='middle_finger1',
+ id=9,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 10:
+ dict(
+ name='middle_finger2',
+ id=10,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 11:
+ dict(
+ name='middle_finger3',
+ id=11,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 12:
+ dict(
+ name='middle_finger4',
+ id=12,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 13:
+ dict(
+ name='ring_finger1', id=13, color=[255, 51, 51], type='', swap=''),
+ 14:
+ dict(
+ name='ring_finger2', id=14, color=[255, 51, 51], type='', swap=''),
+ 15:
+ dict(
+ name='ring_finger3', id=15, color=[255, 51, 51], type='', swap=''),
+ 16:
+ dict(
+ name='ring_finger4', id=16, color=[255, 51, 51], type='', swap=''),
+ 17:
+ dict(name='pinky_finger1', id=17, color=[0, 255, 0], type='', swap=''),
+ 18:
+ dict(name='pinky_finger2', id=18, color=[0, 255, 0], type='', swap=''),
+ 19:
+ dict(name='pinky_finger3', id=19, color=[0, 255, 0], type='', swap=''),
+ 20:
+ dict(name='pinky_finger4', id=20, color=[0, 255, 0], type='', swap='')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('wrist', 'thumb1'), id=0, color=[255, 128, 0]),
+ 1:
+ dict(link=('thumb1', 'thumb2'), id=1, color=[255, 128, 0]),
+ 2:
+ dict(link=('thumb2', 'thumb3'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('thumb3', 'thumb4'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('wrist', 'forefinger1'), id=4, color=[255, 153, 255]),
+ 5:
+ dict(link=('forefinger1', 'forefinger2'), id=5, color=[255, 153, 255]),
+ 6:
+ dict(link=('forefinger2', 'forefinger3'), id=6, color=[255, 153, 255]),
+ 7:
+ dict(link=('forefinger3', 'forefinger4'), id=7, color=[255, 153, 255]),
+ 8:
+ dict(link=('wrist', 'middle_finger1'), id=8, color=[102, 178, 255]),
+ 9:
+ dict(
+ link=('middle_finger1', 'middle_finger2'),
+ id=9,
+ color=[102, 178, 255]),
+ 10:
+ dict(
+ link=('middle_finger2', 'middle_finger3'),
+ id=10,
+ color=[102, 178, 255]),
+ 11:
+ dict(
+ link=('middle_finger3', 'middle_finger4'),
+ id=11,
+ color=[102, 178, 255]),
+ 12:
+ dict(link=('wrist', 'ring_finger1'), id=12, color=[255, 51, 51]),
+ 13:
+ dict(
+ link=('ring_finger1', 'ring_finger2'), id=13, color=[255, 51, 51]),
+ 14:
+ dict(
+ link=('ring_finger2', 'ring_finger3'), id=14, color=[255, 51, 51]),
+ 15:
+ dict(
+ link=('ring_finger3', 'ring_finger4'), id=15, color=[255, 51, 51]),
+ 16:
+ dict(link=('wrist', 'pinky_finger1'), id=16, color=[0, 255, 0]),
+ 17:
+ dict(
+ link=('pinky_finger1', 'pinky_finger2'), id=17, color=[0, 255, 0]),
+ 18:
+ dict(
+ link=('pinky_finger2', 'pinky_finger3'), id=18, color=[0, 255, 0]),
+ 19:
+ dict(
+ link=('pinky_finger3', 'pinky_finger4'), id=19, color=[0, 255, 0])
+ },
+ joint_weights=[1.] * 21,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/posetrack18.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/posetrack18.py
new file mode 100644
index 0000000000000000000000000000000000000000..39be8e8d7858d5409f817481037271c9bb1d7509
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/posetrack18.py
@@ -0,0 +1,182 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='posetrack18',
+ paper_info=dict(
+ author='Andriluka, Mykhaylo and Iqbal, Umar and '
+ 'Insafutdinov, Eldar and Pishchulin, Leonid and '
+ 'Milan, Anton and Gall, Juergen and Schiele, Bernt',
+ title='Posetrack: A benchmark for human pose estimation and tracking',
+ container='Proceedings of the IEEE Conference on '
+ 'Computer Vision and Pattern Recognition',
+ year='2018',
+ homepage='https://posetrack.net/users/download.php',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+ 1:
+ dict(
+ name='head_bottom',
+ id=1,
+ color=[51, 153, 255],
+ type='upper',
+ swap=''),
+ 2:
+ dict(
+ name='head_top', id=2, color=[51, 153, 255], type='upper',
+ swap=''),
+ 3:
+ dict(
+ name='left_ear',
+ id=3,
+ color=[51, 153, 255],
+ type='upper',
+ swap='right_ear'),
+ 4:
+ dict(
+ name='right_ear',
+ id=4,
+ color=[51, 153, 255],
+ type='upper',
+ swap='left_ear'),
+ 5:
+ dict(
+ name='left_shoulder',
+ id=5,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 6:
+ dict(
+ name='right_shoulder',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 7:
+ dict(
+ name='left_elbow',
+ id=7,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 8:
+ dict(
+ name='right_elbow',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 9:
+ dict(
+ name='left_wrist',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 10:
+ dict(
+ name='right_wrist',
+ id=10,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 11:
+ dict(
+ name='left_hip',
+ id=11,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 12:
+ dict(
+ name='right_hip',
+ id=12,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 13:
+ dict(
+ name='left_knee',
+ id=13,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 14:
+ dict(
+ name='right_knee',
+ id=14,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 15:
+ dict(
+ name='left_ankle',
+ id=15,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 16:
+ dict(
+ name='right_ankle',
+ id=16,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+ 1:
+ dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+ 2:
+ dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+ 6:
+ dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+ 7:
+ dict(
+ link=('left_shoulder', 'right_shoulder'),
+ id=7,
+ color=[51, 153, 255]),
+ 8:
+ dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(
+ link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+ 12:
+ dict(link=('nose', 'head_bottom'), id=12, color=[51, 153, 255]),
+ 13:
+ dict(link=('nose', 'head_top'), id=13, color=[51, 153, 255]),
+ 14:
+ dict(
+ link=('head_bottom', 'left_shoulder'), id=14, color=[51, 153,
+ 255]),
+ 15:
+ dict(
+ link=('head_bottom', 'right_shoulder'),
+ id=15,
+ color=[51, 153, 255])
+ },
+ joint_weights=[
+ 1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.5, 1.5, 1., 1., 1.2, 1.2, 1.5,
+ 1.5
+ ],
+ sigmas=[
+ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+ 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/rhd2d.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/rhd2d.py
new file mode 100644
index 0000000000000000000000000000000000000000..3a9e45b56dfeff6c4045920d8c097f588620faa1
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/rhd2d.py
@@ -0,0 +1,157 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='rhd2d',
+ paper_info=dict(
+ author='Christian Zimmermann and Thomas Brox',
+ title='Learning to Estimate 3D Hand Pose from Single RGB Images',
+ container='arXiv',
+ year='2017',
+ homepage='https://lmb.informatik.uni-freiburg.de/resources/'
+ 'datasets/RenderedHandposeDataset.en.html',
+ ),
+ # In RHD, 1-4: left thumb [tip to palm], which means the finger is from
+ # tip to palm, so as other fingers. Please refer to
+ # `https://lmb.informatik.uni-freiburg.de/resources/datasets/
+ # RenderedHandpose/README` for details of keypoint definition.
+ # But in COCO-WholeBody-Hand, FreiHand, CMU Panoptic HandDB, it is in
+ # inverse order. Pay attention to this if you want to combine RHD with
+ # other hand datasets to train a single model.
+ # Also, note that 'keypoint_info' will not directly affect the order of
+ # the keypoint in the dataset. It is mostly for visualization & storing
+ # information about flip_pairs.
+ keypoint_info={
+ 0:
+ dict(name='wrist', id=0, color=[255, 255, 255], type='', swap=''),
+ 1:
+ dict(name='thumb4', id=1, color=[255, 128, 0], type='', swap=''),
+ 2:
+ dict(name='thumb3', id=2, color=[255, 128, 0], type='', swap=''),
+ 3:
+ dict(name='thumb2', id=3, color=[255, 128, 0], type='', swap=''),
+ 4:
+ dict(name='thumb1', id=4, color=[255, 128, 0], type='', swap=''),
+ 5:
+ dict(
+ name='forefinger4', id=5, color=[255, 153, 255], type='', swap=''),
+ 6:
+ dict(
+ name='forefinger3', id=6, color=[255, 153, 255], type='', swap=''),
+ 7:
+ dict(
+ name='forefinger2', id=7, color=[255, 153, 255], type='', swap=''),
+ 8:
+ dict(
+ name='forefinger1', id=8, color=[255, 153, 255], type='', swap=''),
+ 9:
+ dict(
+ name='middle_finger4',
+ id=9,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 10:
+ dict(
+ name='middle_finger3',
+ id=10,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 11:
+ dict(
+ name='middle_finger2',
+ id=11,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 12:
+ dict(
+ name='middle_finger1',
+ id=12,
+ color=[102, 178, 255],
+ type='',
+ swap=''),
+ 13:
+ dict(
+ name='ring_finger4', id=13, color=[255, 51, 51], type='', swap=''),
+ 14:
+ dict(
+ name='ring_finger3', id=14, color=[255, 51, 51], type='', swap=''),
+ 15:
+ dict(
+ name='ring_finger2', id=15, color=[255, 51, 51], type='', swap=''),
+ 16:
+ dict(
+ name='ring_finger1', id=16, color=[255, 51, 51], type='', swap=''),
+ 17:
+ dict(name='pinky_finger4', id=17, color=[0, 255, 0], type='', swap=''),
+ 18:
+ dict(name='pinky_finger3', id=18, color=[0, 255, 0], type='', swap=''),
+ 19:
+ dict(name='pinky_finger2', id=19, color=[0, 255, 0], type='', swap=''),
+ 20:
+ dict(name='pinky_finger1', id=20, color=[0, 255, 0], type='', swap='')
+ },
+ skeleton_info={
+ 0:
+ dict(link=('wrist', 'thumb1'), id=0, color=[255, 128, 0]),
+ 1:
+ dict(link=('thumb1', 'thumb2'), id=1, color=[255, 128, 0]),
+ 2:
+ dict(link=('thumb2', 'thumb3'), id=2, color=[255, 128, 0]),
+ 3:
+ dict(link=('thumb3', 'thumb4'), id=3, color=[255, 128, 0]),
+ 4:
+ dict(link=('wrist', 'forefinger1'), id=4, color=[255, 153, 255]),
+ 5:
+ dict(link=('forefinger1', 'forefinger2'), id=5, color=[255, 153, 255]),
+ 6:
+ dict(link=('forefinger2', 'forefinger3'), id=6, color=[255, 153, 255]),
+ 7:
+ dict(link=('forefinger3', 'forefinger4'), id=7, color=[255, 153, 255]),
+ 8:
+ dict(link=('wrist', 'middle_finger1'), id=8, color=[102, 178, 255]),
+ 9:
+ dict(
+ link=('middle_finger1', 'middle_finger2'),
+ id=9,
+ color=[102, 178, 255]),
+ 10:
+ dict(
+ link=('middle_finger2', 'middle_finger3'),
+ id=10,
+ color=[102, 178, 255]),
+ 11:
+ dict(
+ link=('middle_finger3', 'middle_finger4'),
+ id=11,
+ color=[102, 178, 255]),
+ 12:
+ dict(link=('wrist', 'ring_finger1'), id=12, color=[255, 51, 51]),
+ 13:
+ dict(
+ link=('ring_finger1', 'ring_finger2'), id=13, color=[255, 51, 51]),
+ 14:
+ dict(
+ link=('ring_finger2', 'ring_finger3'), id=14, color=[255, 51, 51]),
+ 15:
+ dict(
+ link=('ring_finger3', 'ring_finger4'), id=15, color=[255, 51, 51]),
+ 16:
+ dict(link=('wrist', 'pinky_finger1'), id=16, color=[0, 255, 0]),
+ 17:
+ dict(
+ link=('pinky_finger1', 'pinky_finger2'), id=17, color=[0, 255, 0]),
+ 18:
+ dict(
+ link=('pinky_finger2', 'pinky_finger3'), id=18, color=[0, 255, 0]),
+ 19:
+ dict(
+ link=('pinky_finger3', 'pinky_finger4'), id=19, color=[0, 255, 0])
+ },
+ joint_weights=[1.] * 21,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/shelf.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/shelf.py
new file mode 100644
index 0000000000000000000000000000000000000000..886bd95e747e4873b4b96802cc3766e93604a1de
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/shelf.py
@@ -0,0 +1,157 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='shelf',
+ paper_info=dict(
+ author='Belagiannis, Vasileios and Amin, Sikandar and Andriluka, '
+ 'Mykhaylo and Schiele, Bernt and Navab, Nassir and Ilic, Slobodan',
+ title='3D Pictorial Structures for Multiple Human Pose Estimation',
+ container='IEEE Computer Society Conference on Computer Vision and '
+ 'Pattern Recognition (CVPR)',
+ year='2014',
+ homepage='http://campar.in.tum.de/Chair/MultiHumanPose',
+ ),
+ keypoint_info={
+ 0:
+ dict(
+ name='right_ankle',
+ id=0,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_ankle'),
+ 1:
+ dict(
+ name='right_knee',
+ id=1,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_knee'),
+ 2:
+ dict(
+ name='right_hip',
+ id=2,
+ color=[255, 128, 0],
+ type='lower',
+ swap='left_hip'),
+ 3:
+ dict(
+ name='left_hip',
+ id=3,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_hip'),
+ 4:
+ dict(
+ name='left_knee',
+ id=4,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_knee'),
+ 5:
+ dict(
+ name='left_ankle',
+ id=5,
+ color=[0, 255, 0],
+ type='lower',
+ swap='right_ankle'),
+ 6:
+ dict(
+ name='right_wrist',
+ id=6,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_wrist'),
+ 7:
+ dict(
+ name='right_elbow',
+ id=7,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_elbow'),
+ 8:
+ dict(
+ name='right_shoulder',
+ id=8,
+ color=[255, 128, 0],
+ type='upper',
+ swap='left_shoulder'),
+ 9:
+ dict(
+ name='left_shoulder',
+ id=9,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_shoulder'),
+ 10:
+ dict(
+ name='left_elbow',
+ id=10,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_elbow'),
+ 11:
+ dict(
+ name='left_wrist',
+ id=11,
+ color=[0, 255, 0],
+ type='upper',
+ swap='right_wrist'),
+ 12:
+ dict(
+ name='bottom_head',
+ id=12,
+ color=[51, 153, 255],
+ type='upper',
+ swap=''),
+ 13:
+ dict(
+ name='top_head',
+ id=13,
+ color=[51, 153, 255],
+ type='upper',
+ swap=''),
+ },
+ skeleton_info={
+ 0:
+ dict(link=('right_ankle', 'right_knee'), id=0, color=[255, 128, 0]),
+ 1:
+ dict(link=('right_knee', 'right_hip'), id=1, color=[255, 128, 0]),
+ 2:
+ dict(link=('left_hip', 'left_knee'), id=2, color=[0, 255, 0]),
+ 3:
+ dict(link=('left_knee', 'left_ankle'), id=3, color=[0, 255, 0]),
+ 4:
+ dict(link=('right_hip', 'left_hip'), id=4, color=[51, 153, 255]),
+ 5:
+ dict(link=('right_wrist', 'right_elbow'), id=5, color=[255, 128, 0]),
+ 6:
+ dict(
+ link=('right_elbow', 'right_shoulder'), id=6, color=[255, 128, 0]),
+ 7:
+ dict(link=('left_shoulder', 'left_elbow'), id=7, color=[0, 255, 0]),
+ 8:
+ dict(link=('left_elbow', 'left_wrist'), id=8, color=[0, 255, 0]),
+ 9:
+ dict(link=('right_hip', 'right_shoulder'), id=9, color=[255, 128, 0]),
+ 10:
+ dict(link=('left_hip', 'left_shoulder'), id=10, color=[0, 255, 0]),
+ 11:
+ dict(
+ link=('right_shoulder', 'bottom_head'), id=11, color=[255, 128,
+ 0]),
+ 12:
+ dict(link=('left_shoulder', 'bottom_head'), id=12, color=[0, 255, 0]),
+ 13:
+ dict(link=('bottom_head', 'top_head'), id=13, color=[51, 153, 255]),
+ },
+ joint_weights=[
+ 1.5, 1.2, 1.0, 1.0, 1.2, 1.5, 1.5, 1.2, 1.0, 1.0, 1.2, 1.5, 1.0, 1.0
+ ],
+ sigmas=[
+ 0.089, 0.087, 0.107, 0.107, 0.087, 0.089, 0.062, 0.072, 0.079, 0.079,
+ 0.072, 0.062, 0.026, 0.026
+ ])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/wflw.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/wflw.py
new file mode 100644
index 0000000000000000000000000000000000000000..ebd999e726783598c4b30bc8528d643ba1ee813f
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/wflw.py
@@ -0,0 +1,198 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='wflw',
+ paper_info=dict(
+ author='Wu, Wayne and Qian, Chen and Yang, Shuo and Wang, '
+ 'Quan and Cai, Yici and Zhou, Qiang',
+ title='Look at boundary: A boundary-aware face alignment algorithm',
+ container='Proceedings of the IEEE conference on computer '
+ 'vision and pattern recognition',
+ year='2018',
+ homepage='https://wywu.github.io/projects/LAB/WFLW.html',
+ ),
+ keypoint_info={
+ 0: dict(name='kpt-0', id=0, color=[255, 0, 0], type='', swap='kpt-32'),
+ 1: dict(name='kpt-1', id=1, color=[255, 0, 0], type='', swap='kpt-31'),
+ 2: dict(name='kpt-2', id=2, color=[255, 0, 0], type='', swap='kpt-30'),
+ 3: dict(name='kpt-3', id=3, color=[255, 0, 0], type='', swap='kpt-29'),
+ 4: dict(name='kpt-4', id=4, color=[255, 0, 0], type='', swap='kpt-28'),
+ 5: dict(name='kpt-5', id=5, color=[255, 0, 0], type='', swap='kpt-27'),
+ 6: dict(name='kpt-6', id=6, color=[255, 0, 0], type='', swap='kpt-26'),
+ 7: dict(name='kpt-7', id=7, color=[255, 0, 0], type='', swap='kpt-25'),
+ 8: dict(name='kpt-8', id=8, color=[255, 0, 0], type='', swap='kpt-24'),
+ 9: dict(name='kpt-9', id=9, color=[255, 0, 0], type='', swap='kpt-23'),
+ 10:
+ dict(name='kpt-10', id=10, color=[255, 0, 0], type='', swap='kpt-22'),
+ 11:
+ dict(name='kpt-11', id=11, color=[255, 0, 0], type='', swap='kpt-21'),
+ 12:
+ dict(name='kpt-12', id=12, color=[255, 0, 0], type='', swap='kpt-20'),
+ 13:
+ dict(name='kpt-13', id=13, color=[255, 0, 0], type='', swap='kpt-19'),
+ 14:
+ dict(name='kpt-14', id=14, color=[255, 0, 0], type='', swap='kpt-18'),
+ 15:
+ dict(name='kpt-15', id=15, color=[255, 0, 0], type='', swap='kpt-17'),
+ 16: dict(name='kpt-16', id=16, color=[255, 0, 0], type='', swap=''),
+ 17:
+ dict(name='kpt-17', id=17, color=[255, 0, 0], type='', swap='kpt-15'),
+ 18:
+ dict(name='kpt-18', id=18, color=[255, 0, 0], type='', swap='kpt-14'),
+ 19:
+ dict(name='kpt-19', id=19, color=[255, 0, 0], type='', swap='kpt-13'),
+ 20:
+ dict(name='kpt-20', id=20, color=[255, 0, 0], type='', swap='kpt-12'),
+ 21:
+ dict(name='kpt-21', id=21, color=[255, 0, 0], type='', swap='kpt-11'),
+ 22:
+ dict(name='kpt-22', id=22, color=[255, 0, 0], type='', swap='kpt-10'),
+ 23:
+ dict(name='kpt-23', id=23, color=[255, 0, 0], type='', swap='kpt-9'),
+ 24:
+ dict(name='kpt-24', id=24, color=[255, 0, 0], type='', swap='kpt-8'),
+ 25:
+ dict(name='kpt-25', id=25, color=[255, 0, 0], type='', swap='kpt-7'),
+ 26:
+ dict(name='kpt-26', id=26, color=[255, 0, 0], type='', swap='kpt-6'),
+ 27:
+ dict(name='kpt-27', id=27, color=[255, 0, 0], type='', swap='kpt-5'),
+ 28:
+ dict(name='kpt-28', id=28, color=[255, 0, 0], type='', swap='kpt-4'),
+ 29:
+ dict(name='kpt-29', id=29, color=[255, 0, 0], type='', swap='kpt-3'),
+ 30:
+ dict(name='kpt-30', id=30, color=[255, 0, 0], type='', swap='kpt-2'),
+ 31:
+ dict(name='kpt-31', id=31, color=[255, 0, 0], type='', swap='kpt-1'),
+ 32:
+ dict(name='kpt-32', id=32, color=[255, 0, 0], type='', swap='kpt-0'),
+ 33:
+ dict(name='kpt-33', id=33, color=[255, 0, 0], type='', swap='kpt-46'),
+ 34:
+ dict(name='kpt-34', id=34, color=[255, 0, 0], type='', swap='kpt-45'),
+ 35:
+ dict(name='kpt-35', id=35, color=[255, 0, 0], type='', swap='kpt-44'),
+ 36:
+ dict(name='kpt-36', id=36, color=[255, 0, 0], type='', swap='kpt-43'),
+ 37: dict(
+ name='kpt-37', id=37, color=[255, 0, 0], type='', swap='kpt-42'),
+ 38: dict(
+ name='kpt-38', id=38, color=[255, 0, 0], type='', swap='kpt-50'),
+ 39: dict(
+ name='kpt-39', id=39, color=[255, 0, 0], type='', swap='kpt-49'),
+ 40: dict(
+ name='kpt-40', id=40, color=[255, 0, 0], type='', swap='kpt-48'),
+ 41: dict(
+ name='kpt-41', id=41, color=[255, 0, 0], type='', swap='kpt-47'),
+ 42: dict(
+ name='kpt-42', id=42, color=[255, 0, 0], type='', swap='kpt-37'),
+ 43: dict(
+ name='kpt-43', id=43, color=[255, 0, 0], type='', swap='kpt-36'),
+ 44: dict(
+ name='kpt-44', id=44, color=[255, 0, 0], type='', swap='kpt-35'),
+ 45: dict(
+ name='kpt-45', id=45, color=[255, 0, 0], type='', swap='kpt-34'),
+ 46: dict(
+ name='kpt-46', id=46, color=[255, 0, 0], type='', swap='kpt-33'),
+ 47: dict(
+ name='kpt-47', id=47, color=[255, 0, 0], type='', swap='kpt-41'),
+ 48: dict(
+ name='kpt-48', id=48, color=[255, 0, 0], type='', swap='kpt-40'),
+ 49: dict(
+ name='kpt-49', id=49, color=[255, 0, 0], type='', swap='kpt-39'),
+ 50: dict(
+ name='kpt-50', id=50, color=[255, 0, 0], type='', swap='kpt-38'),
+ 51: dict(name='kpt-51', id=51, color=[255, 0, 0], type='', swap=''),
+ 52: dict(name='kpt-52', id=52, color=[255, 0, 0], type='', swap=''),
+ 53: dict(name='kpt-53', id=53, color=[255, 0, 0], type='', swap=''),
+ 54: dict(name='kpt-54', id=54, color=[255, 0, 0], type='', swap=''),
+ 55: dict(
+ name='kpt-55', id=55, color=[255, 0, 0], type='', swap='kpt-59'),
+ 56: dict(
+ name='kpt-56', id=56, color=[255, 0, 0], type='', swap='kpt-58'),
+ 57: dict(name='kpt-57', id=57, color=[255, 0, 0], type='', swap=''),
+ 58: dict(
+ name='kpt-58', id=58, color=[255, 0, 0], type='', swap='kpt-56'),
+ 59: dict(
+ name='kpt-59', id=59, color=[255, 0, 0], type='', swap='kpt-55'),
+ 60: dict(
+ name='kpt-60', id=60, color=[255, 0, 0], type='', swap='kpt-72'),
+ 61: dict(
+ name='kpt-61', id=61, color=[255, 0, 0], type='', swap='kpt-71'),
+ 62: dict(
+ name='kpt-62', id=62, color=[255, 0, 0], type='', swap='kpt-70'),
+ 63: dict(
+ name='kpt-63', id=63, color=[255, 0, 0], type='', swap='kpt-69'),
+ 64: dict(
+ name='kpt-64', id=64, color=[255, 0, 0], type='', swap='kpt-68'),
+ 65: dict(
+ name='kpt-65', id=65, color=[255, 0, 0], type='', swap='kpt-75'),
+ 66: dict(
+ name='kpt-66', id=66, color=[255, 0, 0], type='', swap='kpt-74'),
+ 67: dict(
+ name='kpt-67', id=67, color=[255, 0, 0], type='', swap='kpt-73'),
+ 68: dict(
+ name='kpt-68', id=68, color=[255, 0, 0], type='', swap='kpt-64'),
+ 69: dict(
+ name='kpt-69', id=69, color=[255, 0, 0], type='', swap='kpt-63'),
+ 70: dict(
+ name='kpt-70', id=70, color=[255, 0, 0], type='', swap='kpt-62'),
+ 71: dict(
+ name='kpt-71', id=71, color=[255, 0, 0], type='', swap='kpt-61'),
+ 72: dict(
+ name='kpt-72', id=72, color=[255, 0, 0], type='', swap='kpt-60'),
+ 73: dict(
+ name='kpt-73', id=73, color=[255, 0, 0], type='', swap='kpt-67'),
+ 74: dict(
+ name='kpt-74', id=74, color=[255, 0, 0], type='', swap='kpt-66'),
+ 75: dict(
+ name='kpt-75', id=75, color=[255, 0, 0], type='', swap='kpt-65'),
+ 76: dict(
+ name='kpt-76', id=76, color=[255, 0, 0], type='', swap='kpt-82'),
+ 77: dict(
+ name='kpt-77', id=77, color=[255, 0, 0], type='', swap='kpt-81'),
+ 78: dict(
+ name='kpt-78', id=78, color=[255, 0, 0], type='', swap='kpt-80'),
+ 79: dict(name='kpt-79', id=79, color=[255, 0, 0], type='', swap=''),
+ 80: dict(
+ name='kpt-80', id=80, color=[255, 0, 0], type='', swap='kpt-78'),
+ 81: dict(
+ name='kpt-81', id=81, color=[255, 0, 0], type='', swap='kpt-77'),
+ 82: dict(
+ name='kpt-82', id=82, color=[255, 0, 0], type='', swap='kpt-76'),
+ 83: dict(
+ name='kpt-83', id=83, color=[255, 0, 0], type='', swap='kpt-87'),
+ 84: dict(
+ name='kpt-84', id=84, color=[255, 0, 0], type='', swap='kpt-86'),
+ 85: dict(name='kpt-85', id=85, color=[255, 0, 0], type='', swap=''),
+ 86: dict(
+ name='kpt-86', id=86, color=[255, 0, 0], type='', swap='kpt-84'),
+ 87: dict(
+ name='kpt-87', id=87, color=[255, 0, 0], type='', swap='kpt-83'),
+ 88: dict(
+ name='kpt-88', id=88, color=[255, 0, 0], type='', swap='kpt-92'),
+ 89: dict(
+ name='kpt-89', id=89, color=[255, 0, 0], type='', swap='kpt-91'),
+ 90: dict(name='kpt-90', id=90, color=[255, 0, 0], type='', swap=''),
+ 91: dict(
+ name='kpt-91', id=91, color=[255, 0, 0], type='', swap='kpt-89'),
+ 92: dict(
+ name='kpt-92', id=92, color=[255, 0, 0], type='', swap='kpt-88'),
+ 93: dict(
+ name='kpt-93', id=93, color=[255, 0, 0], type='', swap='kpt-95'),
+ 94: dict(name='kpt-94', id=94, color=[255, 0, 0], type='', swap=''),
+ 95: dict(
+ name='kpt-95', id=95, color=[255, 0, 0], type='', swap='kpt-93'),
+ 96: dict(
+ name='kpt-96', id=96, color=[255, 0, 0], type='', swap='kpt-97'),
+ 97: dict(
+ name='kpt-97', id=97, color=[255, 0, 0], type='', swap='kpt-96')
+ },
+ skeleton_info={},
+ joint_weights=[1.] * 98,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/zebra.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/zebra.py
new file mode 100644
index 0000000000000000000000000000000000000000..eb24be3deecb8e1c3c2b88ac9d63e012cd4cb8ee
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/datasets/zebra.py
@@ -0,0 +1,70 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+dataset_info = dict(
+ dataset_name='zebra',
+ paper_info=dict(
+ author='Graving, Jacob M and Chae, Daniel and Naik, Hemal and '
+ 'Li, Liang and Koger, Benjamin and Costelloe, Blair R and '
+ 'Couzin, Iain D',
+ title='DeepPoseKit, a software toolkit for fast and robust '
+ 'animal pose estimation using deep learning',
+ container='Elife',
+ year='2019',
+ homepage='https://github.com/jgraving/DeepPoseKit-Data',
+ ),
+ keypoint_info={
+ 0:
+ dict(name='snout', id=0, color=[255, 255, 255], type='', swap=''),
+ 1:
+ dict(name='head', id=1, color=[255, 255, 255], type='', swap=''),
+ 2:
+ dict(name='neck', id=2, color=[255, 255, 255], type='', swap=''),
+ 3:
+ dict(
+ name='forelegL1',
+ id=3,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegR1'),
+ 4:
+ dict(
+ name='forelegR1',
+ id=4,
+ color=[255, 255, 255],
+ type='',
+ swap='forelegL1'),
+ 5:
+ dict(
+ name='hindlegL1',
+ id=5,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegR1'),
+ 6:
+ dict(
+ name='hindlegR1',
+ id=6,
+ color=[255, 255, 255],
+ type='',
+ swap='hindlegL1'),
+ 7:
+ dict(name='tailbase', id=7, color=[255, 255, 255], type='', swap=''),
+ 8:
+ dict(name='tailtip', id=8, color=[255, 255, 255], type='', swap='')
+ },
+ skeleton_info={
+ 0: dict(link=('head', 'snout'), id=0, color=[255, 255, 255]),
+ 1: dict(link=('neck', 'head'), id=1, color=[255, 255, 255]),
+ 2: dict(link=('forelegL1', 'neck'), id=2, color=[255, 255, 255]),
+ 3: dict(link=('forelegR1', 'neck'), id=3, color=[255, 255, 255]),
+ 4: dict(link=('hindlegL1', 'tailbase'), id=4, color=[255, 255, 255]),
+ 5: dict(link=('hindlegR1', 'tailbase'), id=5, color=[255, 255, 255]),
+ 6: dict(link=('tailbase', 'neck'), id=6, color=[255, 255, 255]),
+ 7: dict(link=('tailtip', 'tailbase'), id=7, color=[255, 255, 255])
+ },
+ joint_weights=[1.] * 9,
+ sigmas=[])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/default_runtime.py b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/default_runtime.py
new file mode 100644
index 0000000000000000000000000000000000000000..c344b15fdce6cdad36dc62f806e2c6fc8d3683f0
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/configs/_base_/default_runtime.py
@@ -0,0 +1,55 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+default_scope = 'mmpose'
+
+# hooks
+default_hooks = dict(
+ timer=dict(type='IterTimerHook'),
+ logger=dict(type='LoggerHook', interval=50),
+ param_scheduler=dict(type='ParamSchedulerHook'),
+ checkpoint=dict(type='CheckpointHook', interval=10),
+ sampler_seed=dict(type='DistSamplerSeedHook'),
+ visualization=dict(type='PoseVisualizationHook', enable=False),
+)
+
+# custom hooks
+custom_hooks = [
+ # Synchronize model buffers such as running_mean and running_var in BN
+ # at the end of each epoch
+ dict(type='SyncBuffersHook')
+]
+
+# multi-processing backend
+env_cfg = dict(
+ cudnn_benchmark=False,
+ mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0),
+ dist_cfg=dict(backend='nccl'),
+)
+
+# visualizer
+vis_backends = [
+ dict(type='LocalVisBackend'),
+ dict(type='TensorboardVisBackend'),
+ # dict(type='WandbVisBackend'),
+]
+visualizer = dict(
+ type='PoseLocalVisualizer', vis_backends=vis_backends, name='visualizer')
+
+# logger
+log_processor = dict(
+ type='LogProcessor', window_size=50, by_epoch=True, num_digits=6)
+log_level = 'INFO'
+load_from = None
+resume = False
+
+# file I/O backend
+backend_args = dict(backend='local')
+
+# training/validation/testing progress
+train_cfg = dict(by_epoch=True)
+val_cfg = dict()
+test_cfg = dict()
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/eval/SDPose_Evaluator.py b/ SDPose-Wholebody/SDPose-OOD-main/eval/SDPose_Evaluator.py
new file mode 100644
index 0000000000000000000000000000000000000000..9e2d959f77b59a544c0f31bcda848cab434fbcdd
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/eval/SDPose_Evaluator.py
@@ -0,0 +1,140 @@
+# Author: T. S. Liang @ Rama Alpaca
+# Emails: tsliang2001@gmail.com | shuangliang@ramaalpaca.com | sliang57@connect.hku.hk
+# Date: Feb. 2025
+# Description: Evaluation protocol for fine-tuned Stable Diffusion models on pose estimation benchmarks.
+# License: MIT License (see LICENSE for details)
+
+import os
+import torch
+from tqdm import tqdm
+from safetensors.torch import load_file
+
+from accelerate import Accelerator
+from accelerate.logging import get_logger
+from packaging import version
+from tqdm.auto import tqdm
+
+from transformers import CLIPTextModel, CLIPTokenizer
+from diffusers.utils.import_utils import is_xformers_available
+
+from diffusers import (
+ UNet2DConditionModel,
+ AutoencoderKL,
+ DDPMScheduler
+)
+
+from pipelines.SDPose_D_Pipeline import SDPose_D_Pipeline
+
+from models.HeatmapHead import get_heatmap_head
+from models.ModifiedUNet import Modified_forward
+
+from utils.EvalMetric import get_metric
+from utils.dataset_loader import prepare_dataset
+
+
+class SDPose_Evaluator:
+
+ def __init__(
+ self,
+ args
+ ):
+
+ self.logger = get_logger(__name__, log_level="INFO")
+ # -------------------- Device --------------------
+
+ self.args = args
+ self.accelerator = Accelerator()
+
+ unet = UNet2DConditionModel.from_pretrained(
+ self.args.checkpoint_path, subfolder="unet", revision=None,
+ class_embed_type="projection", projection_class_embeddings_input_dim=4,
+ low_cpu_mem_usage=False, device_map=None,
+ )
+
+ unet = Modified_forward(unet, keypoint_scheme = self.args.keypoint_scheme)
+
+ vae = AutoencoderKL.from_pretrained(self.args.checkpoint_path,
+ subfolder='vae')
+
+ tokenizer = CLIPTokenizer.from_pretrained(self.args.checkpoint_path, subfolder='tokenizer')
+ text_encoder = CLIPTextModel.from_pretrained(self.args.checkpoint_path, subfolder='text_encoder')
+
+ # Loading Heatmap Autoencoder
+ dec_path = os.path.join(self.args.checkpoint_path, "decoder", "decoder.safetensors")
+ hm_decoder = get_heatmap_head(mode = self.args.keypoint_scheme)
+ hm_decoder.load_state_dict(load_file(dec_path, device="cpu"), strict=True)
+
+ noise_scheduler = DDPMScheduler.from_pretrained(
+ self.args.checkpoint_path, subfolder='scheduler'
+ )
+
+ self.model = SDPose_D_Pipeline(unet = unet, vae = vae, tokenizer = tokenizer, text_encoder = text_encoder, decoder = hm_decoder, scheduler = noise_scheduler)
+
+ # using xformers for efficient attentions.
+ if self.args.enable_xformers_memory_efficient_attention:
+ if is_xformers_available():
+ import xformers
+ xformers_version = version.parse(xformers.__version__)
+ if xformers_version == version.parse("0.0.16"):
+ self.logger.warn(
+ "xFormers 0.0.16 cannot be used for training in some GPUs. If you observe problems during training, please update xFormers to at least 0.0.17. See https://huggingface.co/docs/diffusers/main/en/optimization/xformers for more details."
+ )
+ self.model.unet.enable_xformers_memory_efficient_attention()
+ else:
+ raise ValueError("xformers is not available. Make sure it is installed correctly")
+
+ self.model.vae.requires_grad_(False)
+ self.model.text_encoder.requires_grad_(False)
+ self.model.decoder.requires_grad_(False)
+ self.model.unet.requires_grad_(False)
+
+ self.model.vae.eval()
+ self.model.text_encoder.eval()
+ self.model.decoder.eval()
+ self.model.unet.eval()
+
+ @torch.no_grad()
+ def evaluate(self):
+
+ val_loader = prepare_dataset(batch_size = self.args.eval_batch_size, dataset_name = self.args.dataset_name, dataset_root = self.args.dataset_root, mode = "val", num_workers = self.args.dataloader_num_workers)
+
+
+ self.model.unet, self.model.vae, self.model.decoder, val_loader, self.model.text_encoder = self.accelerator.prepare(self.model.unet, self.model.vae, self.model.decoder, val_loader, self.model.text_encoder)
+
+ device = self.accelerator.device
+
+ metric = get_metric(ann_file = self.args.ann_file, mode = self.args.keypoint_scheme)
+
+ metric.dataset_meta = val_loader.dataset.metainfo
+
+ iterator = tqdm(val_loader, desc="Validating", leave=False) if self.accelerator.is_main_process else val_loader
+
+ for batch in iterator:
+
+ rgb_in = batch["inputs"] # [B, 3, H, W]
+ rgb_in = rgb_in[:, [2, 1, 0], ...]
+ rgb_in = rgb_in.float() / 255.0
+
+ rgb_in = rgb_in * 2.0 - 1.0
+
+ rgb_in = rgb_in.to(device) # [B, 3, H, W]
+
+ ds_list = batch['data_samples']
+
+ # Enable flip test by setting test_cfg
+ test_cfg = {'flip_test': True} # Re-enabled to test our fixes
+
+ # Run inference with flip test enabled
+ timesteps = [self.args.timestep]
+ outputs = self.model(rgb_in, mode = "predict", data_samples=batch['data_samples'], timesteps = timesteps, test_cfg=test_cfg)
+
+ samples_for_metric = [s.to_dict() for s in outputs]
+
+ metric.process(data_samples = samples_for_metric, data_batch = batch)
+
+ self.accelerator.wait_for_everyone()
+ res = metric.evaluate(len(val_loader.dataset))
+
+ if self.accelerator.is_main_process:
+
+ print(res)
\ No newline at end of file
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/eval/launch_evaluator.py b/ SDPose-Wholebody/SDPose-OOD-main/eval/launch_evaluator.py
new file mode 100644
index 0000000000000000000000000000000000000000..656b6224fbab4b889bfce9afcf0895a60a45a0c3
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/eval/launch_evaluator.py
@@ -0,0 +1,82 @@
+# Author: T. S. Liang @ Rama Alpaca
+# Emails: tsliang2001@gmail.com | shuangliang@ramaalpaca.com | sliang57@connect.hku.hk
+# Date: Feb. 2025
+# License: MIT License (see LICENSE for details)
+
+from SDPose_Evaluator import SDPose_Evaluator
+import argparse
+
+def parse_args():
+
+ parser = argparse.ArgumentParser(description="Evaluate SDPose on Pose Estimation Benchmarks")
+
+ parser.add_argument(
+ "--dataset_name",
+ type=str,
+ default=None,
+ required=True,
+ help="The dataset name for the evaluation benchmark.",
+ )
+
+ parser.add_argument(
+ "--keypoint_scheme",
+ type=str,
+ default="body",
+ required=True,
+ help="The keypoint scheme for the pose estimation model, please fill in body (COCO-17) or wholebody (COCOWholebody-133).",
+ )
+
+ parser.add_argument(
+ "--dataset_root",
+ type=str,
+ default=None,
+ required=True,
+ help="The root path for the datasets.",
+ )
+
+ parser.add_argument(
+ "--checkpoint_path",
+ type=str,
+ default=None,
+ required=True,
+ help="Path to the SDPose checkpoint.",
+ )
+
+ parser.add_argument(
+ "--eval_batch_size", type=int, default=1, help="Batch size (per device) for the evaluation dataloader."
+ )
+
+ parser.add_argument(
+ "--ann_file", type=str, help="The path for the annotation file."
+ )
+
+ parser.add_argument(
+ "--timestep",
+ type=int,
+ default=999,
+ )
+
+ # dataloaderes
+ parser.add_argument(
+ "--dataloader_num_workers",
+ type=int,
+ default=0,
+ help=(
+ "Number of subprocesses to use for data loading. 0 means that the data will be loaded in the main process."
+ ),
+ )
+
+ # using xformers for efficient training and inference
+ parser.add_argument(
+ "--enable_xformers_memory_efficient_attention", action="store_true", help="Whether or not to use xformers."
+ )
+
+ args = parser.parse_args()
+
+ return args
+
+
+args = parse_args()
+Trainer = SDPose_Evaluator(args)
+
+Trainer.evaluate()
\ No newline at end of file
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/gradio_app/SDPose_gradio.py b/ SDPose-Wholebody/SDPose-OOD-main/gradio_app/SDPose_gradio.py
new file mode 100644
index 0000000000000000000000000000000000000000..ca34cf8631ea82d335e88ccf773a09145f2d0f78
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/gradio_app/SDPose_gradio.py
@@ -0,0 +1,1380 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+SDPose Gradio Web Interface - Complete Version
+Author: T. S. Liang, Oct. 2025.
+Features:
+- Optional YOLO top-down detection.
+- Support both body (17 keypoints) and wholebody (133 keypoints) schemes
+- Support video inference
+- Openpose-style skeleton drawing
+"""
+
+import gradio as gr
+import cv2
+import numpy as np
+import torch
+import os
+import sys
+import argparse
+import math
+import json
+import matplotlib.colors
+from pathlib import Path
+from PIL import Image, ImageOps
+from torchvision import transforms
+from typing import Optional, Tuple, List
+import tempfile
+from tqdm import tqdm
+
+# Add the project root to Python path
+sys.path.append(str(Path(__file__).parent.parent))
+
+# Import required modules
+from diffusers import DDPMScheduler, AutoencoderKL, UNet2DConditionModel
+from transformers import CLIPTokenizer, CLIPTextModel
+from models.HeatmapHead import get_heatmap_head
+from models.ModifiedUNet import Modified_forward
+from pipelines.SDPose_D_Pipeline import SDPose_D_Pipeline
+from safetensors.torch import load_file
+
+try:
+ from diffusers.utils import is_xformers_available
+except ImportError:
+ def is_xformers_available():
+ return False
+
+# Try to import YOLO
+try:
+ from ultralytics import YOLO
+ YOLO_AVAILABLE = True
+except ImportError:
+ YOLO_AVAILABLE = False
+ print("⚠️ ultralytics not available, YOLO detection will be disabled")
+
+
+def draw_body17_keypoints_openpose_style(canvas, keypoints, scores=None, threshold=0.3, overlay_mode=False, overlay_alpha=0.6):
+ """
+ Draw body keypoints in DWPose style (from util.py draw_bodypose)
+ This function converts COCO17 format to OpenPose 18-point format with neck
+ Keypoints are in pixel coordinates
+ canvas: The canvas to draw on (should be a black canvas for multi-person, or original image copy for single person)
+ overlay_mode: Not used anymore, kept for compatibility
+ overlay_alpha: Not used in this function, blending happens outside
+ """
+ H, W, C = canvas.shape
+
+ # Compute neck as average of shoulders (index 5 and 6)
+ if len(keypoints) >= 7:
+ neck = (keypoints[5] + keypoints[6]) / 2
+ neck_score = min(scores[5], scores[6]) if scores is not None else 1.0
+
+ # Create 18-point format: [nose, neck, rshoulder, relbow, rwrist, lshoulder, lelbow, lwrist,
+ # rhip, rknee, rankle, lhip, lknee, lankle, reye, leye, rear, lear]
+ # COCO17 indices: [0, -, 6, 8, 10, 5, 7, 9, 12, 14, 16, 11, 13, 15, 2, 1, 4, 3]
+ candidate = np.zeros((18, 2))
+ candidate_scores = np.zeros(18)
+
+ # Map COCO17 to OpenPose 18
+ mapping = {
+ 0: 0, # nose -> nose
+ 1: 1, # neck (computed)
+ 2: 6, # right_shoulder -> rshoulder
+ 3: 8, # right_elbow -> relbow
+ 4: 10, # right_wrist -> rwrist
+ 5: 5, # left_shoulder -> lshoulder
+ 6: 7, # left_elbow -> lelbow
+ 7: 9, # left_wrist -> lwrist
+ 8: 12, # right_hip -> rhip
+ 9: 14, # right_knee -> rknee
+ 10: 16, # right_ankle -> rankle
+ 11: 11, # left_hip -> lhip
+ 12: 13, # left_knee -> lknee
+ 13: 15, # left_ankle -> lankle
+ 14: 2, # right_eye -> reye
+ 15: 1, # left_eye -> leye
+ 16: 4, # right_ear -> rear
+ 17: 3, # left_ear -> lear
+ }
+
+ candidate[0] = keypoints[0] # nose
+ candidate[1] = neck # neck
+ candidate[2] = keypoints[6] # right_shoulder
+ candidate[3] = keypoints[8] # right_elbow
+ candidate[4] = keypoints[10] # right_wrist
+ candidate[5] = keypoints[5] # left_shoulder
+ candidate[6] = keypoints[7] # left_elbow
+ candidate[7] = keypoints[9] # left_wrist
+ candidate[8] = keypoints[12] # right_hip
+ candidate[9] = keypoints[14] # right_knee
+ candidate[10] = keypoints[16]# right_ankle
+ candidate[11] = keypoints[11]# left_hip
+ candidate[12] = keypoints[13]# left_knee
+ candidate[13] = keypoints[15]# left_ankle
+ candidate[14] = keypoints[2] # right_eye
+ candidate[15] = keypoints[1] # left_eye
+ candidate[16] = keypoints[4] # right_ear
+ candidate[17] = keypoints[3] # left_ear
+
+ if scores is not None:
+ candidate_scores[0] = scores[0]
+ candidate_scores[1] = neck_score
+ candidate_scores[2] = scores[6]
+ candidate_scores[3] = scores[8]
+ candidate_scores[4] = scores[10]
+ candidate_scores[5] = scores[5]
+ candidate_scores[6] = scores[7]
+ candidate_scores[7] = scores[9]
+ candidate_scores[8] = scores[12]
+ candidate_scores[9] = scores[14]
+ candidate_scores[10] = scores[16]
+ candidate_scores[11] = scores[11]
+ candidate_scores[12] = scores[13]
+ candidate_scores[13] = scores[15]
+ candidate_scores[14] = scores[2]
+ candidate_scores[15] = scores[1]
+ candidate_scores[16] = scores[4]
+ candidate_scores[17] = scores[3]
+ else:
+ return canvas
+
+ # Scale stickwidth and circle size based on image resolution
+ # Use average of height and width as reference
+ avg_size = (H + W) / 2
+ stickwidth = max(1, int(avg_size / 256)) # Base reference: 256px -> width 4
+ circle_radius = max(2, int(avg_size / 192)) # Base reference: 256px -> radius 5
+
+ # DWPose limbSeq (1-indexed, so we subtract 1)
+ # Removed [3, 17] and [6, 18] (shoulder-ear connections are redundant)
+ 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]
+ ]
+
+ # Colors from DWPose util.py draw_bodypose
+ 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],
+ ]
+
+ # Draw limbs directly on pose_canvas (full opacity)
+ for i in range(len(limbSeq)):
+ index = np.array(limbSeq[i]) - 1 # Convert to 0-indexed
+ if index[0] >= len(candidate) or index[1] >= len(candidate):
+ continue
+
+ if scores is not None:
+ if candidate_scores[index[0]] < threshold or candidate_scores[index[1]] < threshold:
+ continue
+
+ Y = candidate[index.astype(int), 0] # x coordinates
+ X = candidate[index.astype(int), 1] # y coordinates
+ mX = np.mean(X)
+ mY = np.mean(Y)
+ length = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0.5
+
+ if length < 1:
+ continue
+
+ 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 % len(colors)])
+
+ # Draw keypoints
+ for i in range(18):
+ if scores is not None and candidate_scores[i] < threshold:
+ continue
+
+ x, y = candidate[i]
+ x = int(x)
+ y = int(y)
+
+ if x < 0 or y < 0 or x >= W or y >= H:
+ continue
+
+ cv2.circle(canvas, (int(x), int(y)), circle_radius, colors[i % len(colors)], thickness=-1)
+
+ return canvas
+
+
+def draw_wholebody_keypoints_openpose_style(canvas, keypoints, scores=None, threshold=0.3, overlay_mode=False, overlay_alpha=0.6):
+ """
+ Draw wholebody keypoints (134 keypoints after processing) in DWPose style
+ Expected keypoint format (after neck insertion and remapping):
+ - Body: 0-17 (18 keypoints in OpenPose format, neck at index 1)
+ - Foot: 18-23 (6 keypoints)
+ - Face: 24-91 (68 landmarks)
+ - Right hand: 92-112 (21 keypoints)
+ - Left hand: 113-133 (21 keypoints)
+ canvas: The canvas to draw on (should be a black canvas for multi-person, or original image copy for single person)
+ overlay_mode: Not used anymore, kept for compatibility
+ overlay_alpha: Not used in this function, blending happens outside
+
+ Reference: DWPose util.py drawing style
+ """
+ H, W, C = canvas.shape
+
+ # Fixed sizes matching DWPose style
+ stickwidth = 4
+
+ # Body connections - matching DWPose limbSeq (1-indexed, converted to 0-indexed)
+ # Remove shoulder-ear connections: [3,17] and [6,18]
+ body_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]
+ ]
+
+ # Hand connections (same for both hands)
+ hand_edges = [
+ [0, 1], [1, 2], [2, 3], [3, 4], # thumb
+ [0, 5], [5, 6], [6, 7], [7, 8], # index
+ [0, 9], [9, 10], [10, 11], [11, 12], # middle
+ [0, 13], [13, 14], [14, 15], [15, 16], # ring
+ [0, 17], [17, 18], [18, 19], [19, 20], # pinky
+ ]
+
+ # Colors matching DWPose
+ 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]
+ ]
+
+ # Draw body limbs directly on pose_canvas (full opacity)
+ if len(keypoints) >= 18:
+ for i, limb in enumerate(body_limbSeq):
+ # Convert from 1-indexed to 0-indexed
+ idx1, idx2 = limb[0] - 1, limb[1] - 1
+
+ if idx1 >= 18 or idx2 >= 18:
+ continue
+
+ if scores is not None:
+ if scores[idx1] < threshold or scores[idx2] < threshold:
+ continue
+
+ Y = np.array([keypoints[idx1][0], keypoints[idx2][0]])
+ X = np.array([keypoints[idx1][1], keypoints[idx2][1]])
+ mX = np.mean(X)
+ mY = np.mean(Y)
+ length = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0.5
+
+ if length < 1:
+ continue
+
+ 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 % len(colors)])
+
+ # Draw body keypoints
+ if len(keypoints) >= 18:
+ for i in range(18):
+ if scores is not None and scores[i] < threshold:
+ continue
+ x, y = int(keypoints[i][0]), int(keypoints[i][1])
+ if 0 <= x < W and 0 <= y < H:
+ cv2.circle(canvas, (x, y), 4, colors[i % len(colors)], thickness=-1)
+
+ # Draw foot keypoints (18-23, 6 keypoints)
+ if len(keypoints) >= 24:
+ for i in range(18, 24):
+ if scores is not None and scores[i] < threshold:
+ continue
+ x, y = int(keypoints[i][0]), int(keypoints[i][1])
+ if 0 <= x < W and 0 <= y < H:
+ cv2.circle(canvas, (x, y), 4, colors[i % len(colors)], thickness=-1)
+
+ # Draw right hand (92-112) - DWPose style with cv2.line and HSV colors
+ if len(keypoints) >= 113:
+ eps = 0.01
+ for ie, edge in enumerate(hand_edges):
+ idx1, idx2 = 92 + edge[0], 92 + edge[1]
+ if scores is not None:
+ if scores[idx1] < threshold or scores[idx2] < threshold:
+ continue
+
+ x1, y1 = int(keypoints[idx1][0]), int(keypoints[idx1][1])
+ x2, y2 = int(keypoints[idx2][0]), int(keypoints[idx2][1])
+
+ if x1 > eps and y1 > eps and x2 > eps and y2 > eps:
+ if 0 <= x1 < W and 0 <= y1 < H and 0 <= x2 < W and 0 <= y2 < H:
+ # HSV to RGB conversion for rainbow colors
+ color = matplotlib.colors.hsv_to_rgb([ie / float(len(hand_edges)), 1.0, 1.0]) * 255
+ cv2.line(canvas, (x1, y1), (x2, y2), color, thickness=2)
+
+ # Draw right hand keypoints
+ for i in range(92, 113):
+ if scores is not None and scores[i] < threshold:
+ continue
+ x, y = int(keypoints[i][0]), int(keypoints[i][1])
+ if x > eps and y > eps and 0 <= x < W and 0 <= y < H:
+ cv2.circle(canvas, (x, y), 4, (0, 0, 255), thickness=-1)
+
+ # Draw left hand (113-133) - DWPose style with cv2.line and HSV colors
+ if len(keypoints) >= 134:
+ eps = 0.01
+ for ie, edge in enumerate(hand_edges):
+ idx1, idx2 = 113 + edge[0], 113 + edge[1]
+ if scores is not None:
+ if scores[idx1] < threshold or scores[idx2] < threshold:
+ continue
+
+ x1, y1 = int(keypoints[idx1][0]), int(keypoints[idx1][1])
+ x2, y2 = int(keypoints[idx2][0]), int(keypoints[idx2][1])
+
+ if x1 > eps and y1 > eps and x2 > eps and y2 > eps:
+ if 0 <= x1 < W and 0 <= y1 < H and 0 <= x2 < W and 0 <= y2 < H:
+ # HSV to RGB conversion for rainbow colors
+ color = matplotlib.colors.hsv_to_rgb([ie / float(len(hand_edges)), 1.0, 1.0]) * 255
+ cv2.line(canvas, (x1, y1), (x2, y2), color, thickness=2)
+
+ # Draw left hand keypoints
+ for i in range(113, 134):
+ if scores is not None and i < len(scores) and scores[i] < threshold:
+ continue
+ x, y = int(keypoints[i][0]), int(keypoints[i][1])
+ if x > eps and y > eps and 0 <= x < W and 0 <= y < H:
+ cv2.circle(canvas, (x, y), 4, (0, 0, 255), thickness=-1)
+
+ # Draw face keypoints (24-91) - DWPose style, white dots only, no lines
+ if len(keypoints) >= 92:
+ eps = 0.01
+ for i in range(24, 92):
+ if scores is not None and scores[i] < threshold:
+ continue
+ x, y = int(keypoints[i][0]), int(keypoints[i][1])
+ if x > eps and y > eps and 0 <= x < W and 0 <= y < H:
+ cv2.circle(canvas, (x, y), 3, (255, 255, 255), thickness=-1)
+
+ return canvas
+
+
+def detect_person_yolo(image, yolo_model_path=None, confidence_threshold=0.5):
+ """
+ Detect person using YOLO
+ Returns: List of bboxes [x1, y1, x2, y2] and whether YOLO was used
+ """
+ if not YOLO_AVAILABLE:
+ print("⚠️ YOLO not available, using full image")
+ h, w = image.shape[:2]
+ return [[0, 0, w, h]], False
+
+ try:
+ print("🔍 Using YOLO for person detection...")
+
+ # Load YOLO model
+ if yolo_model_path and os.path.exists(yolo_model_path):
+ print(f" Loading custom YOLO model: {yolo_model_path}")
+ model = YOLO(yolo_model_path)
+ else:
+ print(f" Loading default YOLOv8n model")
+ # Use default YOLOv8
+ model = YOLO('yolov8n.pt')
+
+ # Run detection
+ print(f" Running YOLO detection on image shape: {image.shape}")
+ results = model(image, verbose=False)
+ print(f" YOLO returned {len(results)} result(s)")
+
+ # Extract person detections (class 0 is person in COCO)
+ person_bboxes = []
+ for result in results:
+ boxes = result.boxes
+ print(f" Result has {len(boxes) if boxes is not None else 0} boxes")
+ if boxes is not None:
+ for box in boxes:
+ # Check if it's a person (class 0) and confidence is high enough
+ cls = int(box.cls[0].cpu().numpy())
+ conf = float(box.conf[0].cpu().numpy())
+ print(f" Box: class={cls}, conf={conf:.3f}")
+ if cls == 0 and conf > confidence_threshold:
+ x1, y1, x2, y2 = box.xyxy[0].cpu().numpy()
+ print(f" ✓ Person detected: bbox=[{x1:.1f}, {y1:.1f}, {x2:.1f}, {y2:.1f}]")
+ person_bboxes.append([float(x1), float(y1), float(x2), float(y2), conf])
+
+ if person_bboxes:
+ # Sort by confidence and return all
+ person_bboxes.sort(key=lambda x: x[4], reverse=True)
+ bboxes = [bbox[:4] for bbox in person_bboxes]
+ print(f"✅ Detected {len(bboxes)} person(s)")
+ return bboxes, True
+ else:
+ print("⚠️ No person detected, using full image")
+ h, w = image.shape[:2]
+ return [[0, 0, w, h]], False
+
+ except Exception as e:
+ print(f"⚠️ YOLO detection failed: {e}, using full image")
+ h, w = image.shape[:2]
+ return [[0, 0, w, h]], False
+
+
+def preprocess_image_for_sdpose(image, bbox=None, input_size=(768, 1024)):
+ """
+ Preprocess image for SDPose inference
+ Returns: (input_tensor, original_size, crop_info)
+ crop_info: (x1, y1, crop_width, crop_height) for coordinate restoration
+ """
+ # Convert to PIL if needed
+ if isinstance(image, np.ndarray):
+ if len(image.shape) == 3 and image.shape[2] == 3:
+ # Assume BGR from OpenCV
+ image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
+ else:
+ image_rgb = image
+ pil_image = Image.fromarray(image_rgb)
+ original_size = (image.shape[1], image.shape[0]) # (W, H)
+ else:
+ pil_image = image
+ original_size = pil_image.size # (W, H)
+
+ # If bbox is provided, crop the image
+ crop_info = None
+ if bbox is not None:
+ x1, y1, x2, y2 = map(int, bbox)
+ print(f" 📦 Cropping to bbox: [{x1}, {y1}, {x2}, {y2}]")
+ # Ensure bbox is within image bounds
+ x1 = max(0, x1)
+ y1 = max(0, y1)
+ x2 = min(pil_image.width, x2)
+ y2 = min(pil_image.height, y2)
+
+ if x2 > x1 and y2 > y1:
+ cropped_image = pil_image.crop((x1, y1, x2, y2))
+ crop_info = (x1, y1, x2 - x1, y2 - y1)
+ pil_image = cropped_image
+ print(f" ✂️ Cropped image size: {cropped_image.size}")
+ else:
+ print("⚠️ Invalid bbox, using full image")
+ crop_info = (0, 0, pil_image.width, pil_image.height)
+ else:
+ print(f" 📦 No bbox provided, using full image size: {pil_image.size}")
+ crop_info = (0, 0, pil_image.width, pil_image.height)
+
+ # Resize to target size
+ resized = pil_image.resize(input_size, Image.BILINEAR)
+
+ # Apply transforms
+ transform_list = [
+ transforms.Resize((input_size[1], input_size[0])), # (H, W)
+ transforms.ToTensor(),
+ transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
+ ]
+
+ val_transform = transforms.Compose(transform_list)
+ input_tensor = val_transform(pil_image).unsqueeze(0)
+
+ return input_tensor, original_size, crop_info
+
+
+def restore_keypoints_to_original(keypoints, crop_info, input_size, original_size):
+ """
+ Restore keypoints from cropped/resized space back to original image space
+ keypoints: (N, 2) in pixel coordinates of the resized/cropped image
+ crop_info: (x1, y1, crop_width, crop_height)
+ input_size: (W, H) of the model input
+ original_size: (W, H) of the original image
+ """
+ x1, y1, crop_w, crop_h = crop_info
+ input_w, input_h = input_size
+
+ # Scale from model input size to crop size
+ scale_x = crop_w / input_w
+ scale_y = crop_h / input_h
+
+ keypoints_restored = keypoints.copy()
+ keypoints_restored[:, 0] = keypoints[:, 0] * scale_x + x1
+ keypoints_restored[:, 1] = keypoints[:, 1] * scale_y + y1
+
+ return keypoints_restored
+
+
+def convert_to_openpose_json(all_keypoints, all_scores, image_width, image_height, keypoint_scheme="body"):
+ """
+ Convert keypoints to OpenPose JSON format
+ Args:
+ all_keypoints: List of keypoints for each person, shape (N_people, K, 2)
+ all_scores: List of scores for each person, shape (N_people, K)
+ image_width: Original image width
+ image_height: Original image height
+ keypoint_scheme: "body" or "wholebody"
+ Returns:
+ Dictionary in OpenPose JSON format
+ """
+ people = []
+
+ for person_idx, (keypoints, scores) in enumerate(zip(all_keypoints, all_scores)):
+ person_data = {}
+
+ if keypoint_scheme == "body":
+ # Body only: 17 keypoints
+ pose_kpts = []
+ for i in range(min(17, len(keypoints))):
+ pose_kpts.extend([float(keypoints[i, 0]), float(keypoints[i, 1]), float(scores[i])])
+
+ # Pad if needed
+ while len(pose_kpts) < 17 * 3:
+ pose_kpts.extend([0.0, 0.0, 0.0])
+
+ person_data["pose_keypoints_2d"] = pose_kpts
+ person_data["hand_left_keypoints_2d"] = [0.0] * 63
+ person_data["hand_right_keypoints_2d"] = [0.0] * 63
+ person_data["face_keypoints_2d"] = [0.0] * 204
+ person_data["foot_keypoints_2d"] = [0.0] * 18
+
+ else:
+ # Wholebody: 133 keypoints (after processing)
+ # Body: 0-17 (18 keypoints including neck at index 17)
+ # Foot: 18-23 (6 keypoints)
+ # Face: 24-91 (68 keypoints)
+ # Right hand: 92-112 (21 keypoints)
+ # Left hand: 113-133 (21 keypoints)
+
+ # Body keypoints (18 including neck)
+ pose_kpts = []
+ for i in range(min(18, len(keypoints))):
+ pose_kpts.extend([float(keypoints[i, 0]), float(keypoints[i, 1]), float(scores[i])])
+ while len(pose_kpts) < 18 * 3:
+ pose_kpts.extend([0.0, 0.0, 0.0])
+ person_data["pose_keypoints_2d"] = pose_kpts
+
+ # Foot keypoints (6)
+ foot_kpts = []
+ for i in range(18, min(24, len(keypoints))):
+ foot_kpts.extend([float(keypoints[i, 0]), float(keypoints[i, 1]), float(scores[i])])
+ while len(foot_kpts) < 6 * 3:
+ foot_kpts.extend([0.0, 0.0, 0.0])
+ person_data["foot_keypoints_2d"] = foot_kpts
+
+ # Face keypoints (68)
+ face_kpts = []
+ for i in range(24, min(92, len(keypoints))):
+ face_kpts.extend([float(keypoints[i, 0]), float(keypoints[i, 1]), float(scores[i])])
+ while len(face_kpts) < 68 * 3:
+ face_kpts.extend([0.0, 0.0, 0.0])
+ person_data["face_keypoints_2d"] = face_kpts
+
+ # Right hand keypoints (21)
+ right_hand_kpts = []
+ for i in range(92, min(113, len(keypoints))):
+ right_hand_kpts.extend([float(keypoints[i, 0]), float(keypoints[i, 1]), float(scores[i])])
+ while len(right_hand_kpts) < 21 * 3:
+ right_hand_kpts.extend([0.0, 0.0, 0.0])
+ person_data["hand_right_keypoints_2d"] = right_hand_kpts
+
+ # Left hand keypoints (21)
+ left_hand_kpts = []
+ for i in range(113, min(134, len(keypoints))):
+ left_hand_kpts.extend([float(keypoints[i, 0]), float(keypoints[i, 1]), float(scores[i])])
+ while len(left_hand_kpts) < 21 * 3:
+ left_hand_kpts.extend([0.0, 0.0, 0.0])
+ person_data["hand_left_keypoints_2d"] = left_hand_kpts
+
+ people.append(person_data)
+
+ result = {
+ "people": people,
+ "canvas_width": int(image_width),
+ "canvas_height": int(image_height)
+ }
+
+ return result
+
+
+
+
+class SDPoseInference:
+ """SDPose inference class supporting both body and wholebody schemes"""
+
+ def __init__(self):
+ self.pipeline = None
+ self.device = None
+ self.model_loaded = False
+ self.keypoint_scheme = "body" # "body" or "wholebody"
+ self.input_size = (768, 1024) # (W, H)
+
+ def load_model(self, model_path, keypoint_scheme="body", device="auto"):
+ """Load the SDPose model"""
+ try:
+ if device == "auto":
+ self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
+ else:
+ self.device = torch.device(device)
+
+ self.keypoint_scheme = keypoint_scheme
+
+ print(f"Loading model on device: {self.device}")
+ print(f"Keypoint scheme: {keypoint_scheme}")
+ print(f"Loading from: {model_path}")
+
+ # Load UNet
+ unet = UNet2DConditionModel.from_pretrained(
+ model_path, subfolder="unet", revision=None,
+ class_embed_type="projection", projection_class_embeddings_input_dim=4,
+ low_cpu_mem_usage=False, device_map=None,
+ )
+
+ # Apply modifications
+ unet = Modified_forward(unet, keypoint_scheme=keypoint_scheme)
+
+ # Load other components
+ vae = AutoencoderKL.from_pretrained(model_path, subfolder='vae')
+ tokenizer = CLIPTokenizer.from_pretrained(model_path, subfolder='tokenizer')
+ text_encoder = CLIPTextModel.from_pretrained(model_path, subfolder='text_encoder')
+
+ # Load decoder
+ dec_path = os.path.join(model_path, "decoder", "decoder.safetensors")
+ hm_decoder = get_heatmap_head(mode=keypoint_scheme)
+ if os.path.exists(dec_path):
+ hm_decoder.load_state_dict(load_file(dec_path, device="cpu"), strict=True)
+ print("✓ Decoder weights loaded")
+ else:
+ print("⚠️ No decoder weights found, using default initialization")
+
+ # Load scheduler
+ noise_scheduler = DDPMScheduler.from_pretrained(model_path, subfolder='scheduler')
+
+ # Move to device
+ unet = unet.to(self.device)
+ vae = vae.to(self.device)
+ text_encoder = text_encoder.to(self.device)
+ hm_decoder = hm_decoder.to(self.device)
+
+ # Create pipeline
+ self.pipeline = SDPose_D_Pipeline(
+ unet=unet,
+ vae=vae,
+ tokenizer=tokenizer,
+ text_encoder=text_encoder,
+ scheduler=noise_scheduler,
+ decoder=hm_decoder
+ )
+
+ # Enable xformers if available
+ if is_xformers_available():
+ try:
+ self.pipeline.unet.enable_xformers_memory_efficient_attention()
+ print("✓ xformers enabled")
+ except Exception as e:
+ print(f"⚠️ Could not enable xformers: {e}")
+
+ self.model_loaded = True
+ print("✓ Model loaded successfully!")
+ return True
+
+ except Exception as e:
+ print(f"✗ Error loading model: {e}")
+ import traceback
+ traceback.print_exc()
+ return False
+
+ def predict_image(self, image, enable_yolo=True, yolo_model_path=None,
+ score_threshold=0.3, restore_coords=True, flip_test=False, process_all_persons=True, overlay_alpha=0.6):
+ """
+ Run inference on a single image (supports multi-person)
+ overlay_alpha: Opacity of pose+black background layer (0.0=invisible, 1.0=fully opaque)
+ Returns: (result_image, keypoints, scores, info_text, json_file_path)
+ """
+ if not self.model_loaded or self.pipeline is None:
+ return None, None, None, "Model not loaded. Please load the model first.", None
+
+ try:
+ # Handle image format: Gradio Image(type="numpy") returns RGB numpy array
+ if isinstance(image, np.ndarray):
+ original_image_rgb = image.copy()
+ else:
+ original_image_rgb = np.array(image)
+
+ # Convert to BGR for YOLO (YOLO expects BGR)
+ original_image_bgr = cv2.cvtColor(original_image_rgb, cv2.COLOR_RGB2BGR)
+
+ # Step 1: Person detection (if enabled)
+ bboxes_list = []
+ detection_info = ""
+ if enable_yolo:
+ print(f"🔍 YOLO detection enabled (yolo_model_path: {yolo_model_path})")
+ bboxes, used_yolo = detect_person_yolo(original_image_bgr, yolo_model_path, confidence_threshold=0.5)
+ print(f" YOLO actually used: {used_yolo}, detected {len(bboxes)} person(s)")
+ if bboxes and len(bboxes) > 0:
+ bboxes_list = bboxes if process_all_persons else [bboxes[0]]
+ detection_info = f"Detected {len(bboxes)} person(s) by YOLO, processing {len(bboxes_list)}"
+ print(f"✅ {detection_info}")
+ else:
+ bboxes_list = [None] # Process full image
+ detection_info = "No person detected by YOLO, using full image"
+ print(f"⚠️ {detection_info}")
+ else:
+ bboxes_list = [None] # Process full image
+ detection_info = "YOLO disabled, using full image"
+ print(f"⚠️ {detection_info}")
+
+ # Step 2-6: Process each person
+ # Create black canvas for all pose drawings
+ pose_canvas = np.zeros_like(original_image_rgb)
+ all_keypoints = []
+ all_scores = []
+
+ for person_idx, bbox in enumerate(bboxes_list):
+ print(f"\n👤 Processing person {person_idx + 1}/{len(bboxes_list)}")
+
+ # Step 2: Preprocess image
+ print("🔄 Preprocessing image...")
+ print(f" 📦 Bbox: {bbox}")
+ input_tensor, original_size, crop_info = preprocess_image_for_sdpose(
+ original_image_bgr, bbox, self.input_size
+ )
+ print(f" ✂️ Crop info: {crop_info}")
+ input_tensor = input_tensor.to(self.device)
+
+ # Step 3: Run inference
+ print("🚀 Running SDPose inference...")
+ test_cfg = {'flip_test': False}
+
+ with torch.no_grad():
+ out = self.pipeline(
+ input_tensor,
+ timesteps=[999],
+ test_cfg=test_cfg,
+ show_progress_bar=False,
+ mode="inference",
+ )
+
+ # Extract keypoints and scores
+ heatmap_inst = out[0]
+ keypoints = heatmap_inst.keypoints[0] # (K, 2)
+ scores = heatmap_inst.keypoint_scores[0] # (K,)
+
+ # Convert to numpy
+ if torch.is_tensor(keypoints):
+ keypoints = keypoints.cpu().numpy()
+ if torch.is_tensor(scores):
+ scores = scores.cpu().numpy()
+
+ print(f"📊 Detected {len(keypoints)} keypoints")
+
+ # Step 4: Restore coordinates to original space
+ if restore_coords and bbox is not None:
+ keypoints_original = restore_keypoints_to_original(
+ keypoints, crop_info, self.input_size, original_size
+ )
+ else:
+ scale_x = original_size[0] / self.input_size[0]
+ scale_y = original_size[1] / self.input_size[1]
+ keypoints_original = keypoints.copy()
+ keypoints_original[:, 0] *= scale_x
+ keypoints_original[:, 1] *= scale_y
+
+ all_keypoints.append(keypoints_original)
+ all_scores.append(scores)
+
+ # Step 5: Draw keypoints for this person
+ print(f"🎨 Drawing keypoints for person {person_idx + 1}...")
+
+ if self.keypoint_scheme == "body":
+ if len(keypoints_original) >= 17:
+ # Draw on pose_canvas (black background, shared by all persons)
+ pose_canvas = draw_body17_keypoints_openpose_style(
+ pose_canvas, keypoints_original[:17], scores[:17],
+ threshold=score_threshold
+ )
+ else:
+ # Wholebody scheme
+ keypoints_with_neck = keypoints_original.copy()
+ scores_with_neck = scores.copy()
+
+ if len(keypoints_original) >= 17:
+ neck = (keypoints_original[5] + keypoints_original[6]) / 2
+ neck_score = min(scores[5], scores[6]) if scores[5] > 0.3 and scores[6] > 0.3 else 0
+
+ keypoints_with_neck = np.insert(keypoints_original, 17, neck, axis=0)
+ scores_with_neck = np.insert(scores, 17, neck_score)
+
+ mmpose_idx = np.array([17, 6, 8, 10, 7, 9, 12, 14, 16, 13, 15, 2, 1, 4, 3])
+ openpose_idx = np.array([1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17])
+
+ temp_kpts = keypoints_with_neck.copy()
+ temp_scores = scores_with_neck.copy()
+ temp_kpts[openpose_idx] = keypoints_with_neck[mmpose_idx]
+ temp_scores[openpose_idx] = scores_with_neck[mmpose_idx]
+
+ keypoints_with_neck = temp_kpts
+ scores_with_neck = temp_scores
+
+ # Draw on pose_canvas (black background, shared by all persons)
+ pose_canvas = draw_wholebody_keypoints_openpose_style(
+ pose_canvas, keypoints_with_neck, scores_with_neck,
+ threshold=score_threshold
+ )
+
+ # Blend original image with pose canvas after all persons are drawn
+ # overlay_alpha: transparency of (pose + black background) layer
+ # 0.0 = invisible (only original image), 1.0 = fully opaque (pose + black bg)
+ result_image = cv2.addWeighted(original_image_rgb, 1.0 - overlay_alpha, pose_canvas, overlay_alpha, 0)
+
+ # Create info text
+ info_text = self._create_info_text(
+ original_size, self.input_size, detection_info, bboxes_list[0] if len(bboxes_list) == 1 else None,
+ all_keypoints[0] if len(all_keypoints) > 0 else None,
+ all_scores[0] if len(all_scores) > 0 else None,
+ score_threshold,
+ len(bboxes_list)
+ )
+
+ # Generate JSON file
+ json_file_path = None
+ if all_keypoints and len(all_keypoints) > 0:
+ try:
+ # Convert to OpenPose JSON format
+ json_data = convert_to_openpose_json(
+ all_keypoints, all_scores,
+ original_size[0], original_size[1],
+ self.keypoint_scheme
+ )
+
+ # Save to temporary file
+ temp_json = tempfile.NamedTemporaryFile(
+ mode='w', suffix='.json', delete=False,
+ dir=tempfile.gettempdir()
+ )
+ json.dump(json_data, temp_json, indent=2)
+ json_file_path = temp_json.name
+ temp_json.close()
+
+ print(f"✅ JSON file saved: {json_file_path}")
+
+ except Exception as e:
+ print(f"⚠️ Failed to generate JSON file: {e}")
+ json_file_path = None
+
+ print(f"✅ Inference complete. Returning RGB result_image with shape: {result_image.shape}")
+ return result_image, all_keypoints, all_scores, info_text, json_file_path
+
+ except Exception as e:
+ print(f"Error during inference: {e}")
+ import traceback
+ traceback.print_exc()
+ return image, None, None, f"Error during inference: {str(e)}", None
+
+ def predict_video(self, video_path, output_path, enable_yolo=True,
+ yolo_model_path=None, score_threshold=0.3, flip_test=False, overlay_alpha=0.6, progress=gr.Progress()):
+ """
+ Run inference on a video file
+ overlay_alpha: Opacity of pose+black background layer (0.0=invisible, 1.0=fully opaque)
+ Returns: (output_video_path, info_text)
+ """
+ if not self.model_loaded or self.pipeline is None:
+ return None, "Model not loaded. Please load the model first."
+
+ try:
+ # Open video
+ cap = cv2.VideoCapture(video_path)
+ if not cap.isOpened():
+ return None, f"Error: Could not open video {video_path}"
+
+ # Get video properties
+ fps = int(cap.get(cv2.CAP_PROP_FPS))
+ if fps == 0:
+ fps = 30 # Default fallback
+ total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
+ width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
+ height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
+
+ print(f"📹 Processing video: {total_frames} frames at {fps} FPS, size {width}x{height}")
+
+ # Create video writer
+ # Use mp4v for initial encoding (will re-encode to H.264 later if needed)
+ print(f"📝 Creating VideoWriter with mp4v codec...")
+ fourcc = cv2.VideoWriter_fourcc(*'mp4v')
+
+ # Ensure output path has .mp4 extension
+ actual_output_path = output_path
+ if not actual_output_path.endswith('.mp4'):
+ actual_output_path = output_path.rsplit('.', 1)[0] + '.mp4'
+
+ out = cv2.VideoWriter(actual_output_path, fourcc, fps, (width, height))
+
+ if not out.isOpened():
+ cap.release()
+ print(f"❌ Failed to open VideoWriter")
+ return None, f"Error: Could not create video writer"
+
+ print(f"✅ VideoWriter opened successfully: {actual_output_path}")
+
+ frame_count = 0
+ processed_count = 0
+
+ # Process each frame
+ while True:
+ ret, frame = cap.read()
+ if not ret:
+ break
+
+ frame_count += 1
+
+ # Update progress
+ if progress is not None:
+ progress((frame_count, total_frames), desc=f"Processing frame {frame_count}/{total_frames}")
+
+ # Convert frame from BGR to RGB for predict_image
+ # cv2.VideoCapture reads in BGR format
+ frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
+
+ # Run inference on frame (frame_rgb is RGB)
+ # Process all detected persons
+ result_frame, _, _, _, _ = self.predict_image(
+ frame_rgb, enable_yolo=enable_yolo, yolo_model_path=yolo_model_path,
+ score_threshold=score_threshold, restore_coords=True, flip_test=flip_test,
+ process_all_persons=True, overlay_alpha=overlay_alpha
+ )
+
+ if result_frame is not None:
+ # result_frame is RGB from predict_image, convert to BGR for video writing
+ result_frame_bgr = cv2.cvtColor(result_frame, cv2.COLOR_RGB2BGR)
+
+ # Check frame size matches
+ if result_frame_bgr.shape[:2] != (height, width):
+ print(f"⚠️ Frame size mismatch: {result_frame_bgr.shape[:2]} vs expected ({height}, {width}), resizing...")
+ result_frame_bgr = cv2.resize(result_frame_bgr, (width, height))
+
+ out.write(result_frame_bgr)
+ processed_count += 1
+ else:
+ # If inference failed, write original frame (already BGR)
+ print(f"⚠️ Frame {frame_count} inference failed, using original")
+ out.write(frame)
+
+ if frame_count % 30 == 0:
+ print(f"Processed {frame_count}/{total_frames} frames, written {processed_count}")
+
+ cap.release()
+ out.release()
+
+ # Ensure the video file is properly written and flushed
+ # Small delay to ensure file system has finished writing
+ import time
+ time.sleep(0.5)
+
+ # Verify the output file exists and has content
+ if not os.path.exists(actual_output_path):
+ return None, f"Error: Output video file was not created at {actual_output_path}"
+
+ file_size = os.path.getsize(actual_output_path)
+ if file_size == 0:
+ return None, f"Error: Output video file is empty (0 bytes)"
+
+ print(f"✅ Video file created: {actual_output_path} ({file_size} bytes)")
+
+ # If we used mp4v codec, try to re-encode to H.264 for better browser compatibility
+ final_output_path = actual_output_path
+ if actual_output_path.endswith('.mp4'):
+ try:
+ import subprocess
+ print("🔄 Re-encoding video to H.264 for better browser compatibility...")
+
+ # Create a new temp file for H.264 version
+ h264_path = actual_output_path.rsplit('.', 1)[0] + '_h264.mp4'
+
+ # Use ffmpeg to re-encode
+ cmd = [
+ 'ffmpeg', '-y', '-i', actual_output_path,
+ '-c:v', 'libx264', '-preset', 'fast',
+ '-crf', '23', '-pix_fmt', 'yuv420p',
+ h264_path
+ ]
+
+ result = subprocess.run(cmd, capture_output=True, timeout=300)
+
+ if result.returncode == 0 and os.path.exists(h264_path):
+ h264_size = os.path.getsize(h264_path)
+ if h264_size > 0:
+ print(f"✅ Re-encoded to H.264: {h264_path} ({h264_size} bytes)")
+ # Use the H.264 version
+ final_output_path = h264_path
+ file_size = h264_size
+ # Remove the original mp4v version
+ try:
+ os.unlink(actual_output_path)
+ except:
+ pass
+ else:
+ print(f"⚠️ Re-encoded file is empty, using original")
+ else:
+ print(f"⚠️ Re-encoding failed, using original mp4v version")
+ if result.stderr:
+ print(f" ffmpeg error: {result.stderr.decode()[:200]}")
+ except subprocess.TimeoutExpired:
+ print(f"⚠️ Re-encoding timed out, using original")
+ except Exception as e:
+ print(f"⚠️ Re-encoding failed: {e}, using original")
+
+ info_text = f"✅ Video processing complete!\n"
+ info_text += f"📊 Total frames: {total_frames}\n"
+ info_text += f"✓ Processed: {processed_count}\n"
+ info_text += f"🎞️ FPS: {fps}\n"
+ info_text += f"📏 Resolution: {width}x{height}\n"
+ info_text += f"💾 File size: {file_size / (1024*1024):.2f} MB\n"
+ info_text += f"💾 Output saved to: {final_output_path}"
+
+ print(info_text)
+ return final_output_path, info_text
+
+ except Exception as e:
+ print(f"Error during video inference: {e}")
+ import traceback
+ traceback.print_exc()
+ return None, f"Error during video inference: {str(e)}"
+
+ def _create_info_text(self, original_size, input_size, detection_info, bbox,
+ keypoints, scores, threshold, num_persons=1):
+ """Create informative text about the inference results"""
+ info_text = "🎯 SDPose Keypoint Detection Results\n" + "="*60 + "\n"
+ info_text += f"📏 Original Image Size: {original_size}\n"
+ info_text += f"🔧 Model Input Size: {input_size}\n"
+ info_text += f"🧠 Keypoint Scheme: {self.keypoint_scheme}\n"
+ info_text += f"🔍 Detection: {detection_info}\n"
+ info_text += f"👥 Number of Persons Processed: {num_persons}\n"
+ if bbox:
+ info_text += f"📦 Bounding Box (first person): [{int(bbox[0])}, {int(bbox[1])}, {int(bbox[2])}, {int(bbox[3])}]\n"
+ info_text += f"🎚️ Score Threshold: {threshold}\n"
+ info_text += "="*60 + "\n\n"
+
+ # Count detected keypoints (for first person if available)
+ if keypoints is not None and scores is not None:
+ detected_count = np.sum(scores >= threshold)
+ total_count = len(scores)
+ info_text += f"📊 Summary (first person): {detected_count}/{total_count} keypoints detected above threshold\n"
+
+ info_text += f"🎨 Visualization: Openpose style (similar to DWPose)\n"
+ info_text += f"📍 Coordinates: Restored to original image space\n"
+
+ return info_text
+
+
+# Global inference instance
+inference_engine = SDPoseInference()
+
+
+def load_model_interface(model_path, keypoint_scheme, device):
+ """Gradio interface for loading model"""
+ if not model_path or not os.path.exists(model_path):
+ return "✗ Invalid model path", gr.Button(variant="secondary", interactive=False)
+
+ success = inference_engine.load_model(model_path, keypoint_scheme, device)
+
+ if success:
+ return "✓ Model loaded successfully!", gr.Button(variant="primary", interactive=True)
+ else:
+ return "✗ Failed to load model. Check the console for details.", gr.Button(variant="secondary", interactive=False)
+
+
+def run_inference_image_interface(image, enable_yolo, yolo_model_path, score_threshold, overlay_alpha):
+ """Gradio interface for running inference on image"""
+ if not inference_engine.model_loaded:
+ return image, None, "Please load the model first!"
+
+ if image is None:
+ return None, None, "Please upload an image first!"
+
+ # Gradio Image(type="numpy") returns RGB format
+ result_image, _, _, info_text, json_file_path = inference_engine.predict_image(
+ image, enable_yolo=enable_yolo, yolo_model_path=yolo_model_path if yolo_model_path else None,
+ score_threshold=score_threshold, restore_coords=True, flip_test=False,
+ process_all_persons=True, overlay_alpha=overlay_alpha
+ )
+
+ # result_image is already in RGB format, ready for Gradio display
+ return result_image, json_file_path, info_text
+
+
+def run_inference_video_interface(video, enable_yolo, yolo_model_path, score_threshold, overlay_alpha, progress=gr.Progress()):
+ """Gradio interface for running inference on video"""
+ if not inference_engine.model_loaded:
+ return None, None, "Please load the model first!"
+
+ if video is None:
+ return None, None, "Please upload a video first!"
+
+ # Create temporary output path using a safer approach
+ # Use NamedTemporaryFile with delete=False to get a proper temp file
+ temp_file = tempfile.NamedTemporaryFile(suffix='.mp4', delete=False, dir=tempfile.gettempdir())
+ output_path = temp_file.name
+ temp_file.close() # Close it so VideoWriter can open it
+
+ print(f"🎬 Starting video inference, output will be: {output_path}")
+
+ result_video, info_text = inference_engine.predict_video(
+ video, output_path, enable_yolo=enable_yolo,
+ yolo_model_path=yolo_model_path if yolo_model_path else None,
+ score_threshold=score_threshold, flip_test=False, overlay_alpha=overlay_alpha, progress=progress
+ )
+
+ if result_video and os.path.exists(result_video):
+ print(f"✅ Video inference complete, returning: {result_video}")
+ file_size = os.path.getsize(result_video)
+ print(f" File size: {file_size} bytes")
+ # Return video path for both video player and download button
+ return result_video, result_video, info_text
+ else:
+ print(f"❌ Video inference failed or file not found")
+ return None, None, info_text
+
+
+def create_gradio_interface():
+ """Create the Gradio interface"""
+
+ # Get logo path relative to this script
+ logo_path = Path(__file__).parent.parent / "assets" / "logo" / "logo.png"
+
+ with gr.Blocks(title="SDPose - Gradio Interface", theme=gr.themes.Soft()) as demo:
+ with gr.Row():
+ with gr.Column(scale=1, min_width=100):
+ gr.Image(value=str(logo_path), show_label=False, show_download_button=False,
+ container=False, height=80, width=80, interactive=False, show_fullscreen_button=False)
+ with gr.Column(scale=9):
+ gr.Markdown("""
+ SDPose: Exploiting Diffusion Priors for Out-of-Domain
and Robust Pose Estimation
+
""")
+
+ with gr.Row():
+ with gr.Column(scale=1):
+ gr.Markdown("## ⚙️ Model Configuration")
+
+ model_path_input = gr.Textbox(
+ label="Model Checkpoint Path",
+ placeholder="/path/to/checkpoint",
+ info="Path to your SDPose checkpoint directory"
+ )
+
+ keypoint_scheme_radio = gr.Radio(
+ choices=["body", "wholebody"],
+ value="body",
+ label="Keypoint Scheme",
+ info="Choose body (17 keypoints) or wholebody (133 keypoints)"
+ )
+
+ device_radio = gr.Radio(
+ choices=["auto", "cuda", "cpu"],
+ value="auto",
+ label="Device",
+ info="Choose the device to run inference on"
+ )
+
+ load_model_btn = gr.Button(
+ "🚀 Load Model",
+ variant="primary",
+ size="lg"
+ )
+
+ load_status = gr.Textbox(
+ label="Load Status",
+ value="Model not loaded",
+ interactive=False
+ )
+
+ gr.Markdown("---")
+
+ gr.Markdown("## 📊 Inference Parameters")
+
+ enable_yolo_checkbox = gr.Checkbox(
+ label="Enable YOLO Person Detection",
+ value=True,
+ info="Detect person using YOLO before pose estimation (Required for multi-person)"
+ )
+
+ yolo_model_path_input = gr.Textbox(
+ label="YOLO Model Path (Required)",
+ placeholder="/path/to/yolo/model.pt",
+ info="YOLO model path must be specified, no default model"
+ )
+
+ score_threshold_slider = gr.Slider(
+ minimum=0.1,
+ maximum=0.9,
+ value=0.3,
+ step=0.05,
+ label="Score Threshold",
+ info="Minimum confidence score for keypoint detection"
+ )
+
+ overlay_alpha_slider = gr.Slider(
+ minimum=0.0,
+ maximum=1.0,
+ value=0.6,
+ step=0.05,
+ label="Pose Layer Opacity",
+ info="Opacity of pose+black background: 0.0=invisible (only original image), 1.0=fully opaque"
+ )
+
+ with gr.Column(scale=2):
+ gr.Markdown("## 🖼️ Input & Output")
+
+ with gr.Tabs():
+ with gr.Tab("Image"):
+ with gr.Row():
+ input_image = gr.Image(
+ label="Input Image",
+ type="numpy",
+ height=400
+ )
+
+ output_image = gr.Image(
+ label="Output Image with Keypoints",
+ height=400
+ )
+
+ # Add download button for JSON results
+ output_json_file = gr.File(
+ label="📥 Download JSON Results",
+ visible=True,
+ interactive=False
+ )
+
+ run_image_btn = gr.Button(
+ "🔍 Run Image Inference",
+ variant="secondary",
+ size="lg",
+ interactive=False
+ )
+
+ image_info = gr.Textbox(
+ label="Image Inference Results",
+ lines=10,
+ max_lines=15,
+ interactive=False
+ )
+
+ with gr.Tab("Video"):
+ with gr.Row():
+ input_video = gr.Video(
+ label="Input Video",
+ height=400
+ )
+
+ output_video = gr.Video(
+ label="Output Video with Keypoints",
+ height=400
+ )
+
+ # Add download button for the output video
+ output_video_file = gr.File(
+ label="📥 Download Processed Video",
+ visible=True,
+ interactive=False
+ )
+
+ run_video_btn = gr.Button(
+ "🎬 Run Video Inference",
+ variant="secondary",
+ size="lg",
+ interactive=False
+ )
+
+ video_info = gr.Textbox(
+ label="Video Inference Results",
+ lines=10,
+ max_lines=15,
+ interactive=False
+ )
+
+ # Event handlers
+ load_model_btn.click(
+ fn=load_model_interface,
+ inputs=[model_path_input, keypoint_scheme_radio, device_radio],
+ outputs=[load_status, run_image_btn]
+ ).then(
+ fn=lambda: gr.Button(variant="primary", interactive=True),
+ outputs=[run_video_btn]
+ )
+
+ run_image_btn.click(
+ fn=run_inference_image_interface,
+ inputs=[input_image, enable_yolo_checkbox, yolo_model_path_input, score_threshold_slider, overlay_alpha_slider],
+ outputs=[output_image, output_json_file, image_info]
+ )
+
+ run_video_btn.click(
+ fn=run_inference_video_interface,
+ inputs=[input_video, enable_yolo_checkbox, yolo_model_path_input, score_threshold_slider, overlay_alpha_slider],
+ outputs=[output_video, output_video_file, video_info]
+ )
+
+ gr.Markdown("---")
+ gr.Markdown("### 📝 Instructions")
+ gr.Markdown("""
+ 1. **Load Model**: Specify checkpoint path, choose scheme (body/wholebody), and load model
+ 2. **Configure YOLO**: Specify YOLO model path (required for multi-person detection)
+ 3. **Upload Media**: Upload an image or video for pose estimation
+ 4. **Run Inference**: Click inference button to process
+ 5. **View Results**: See detected keypoints overlaid on the output
+ 6. **Download**: Use the download button to save processed videos
+ """)
+
+ gr.Markdown("### ⚠️ Important Notes")
+ gr.Markdown("""
+ - **Multi-Person Detection**: SDPose uses top-down inference for multi-person pose estimation. YOLO detection is **required** when processing images/videos with multiple people.
+ - **Animated Characters**: Due to YOLO model limitations, animated/cartoon characters may not be detected properly. For best results with animated content, **maintain a 4:3 aspect ratio** for the input image/video.
+ - **YOLO Model Path**: You **must** specify a YOLO model path. There is no default model provided.
+ - **Scheme Selection**: Make sure to select the correct scheme matching your model (body or wholebody).
+ - **Video Processing**: Large videos may take considerable time to process. Use the download button to save results.
+ """)
+
+ return demo
+
+
+def parse_args():
+ parser = argparse.ArgumentParser(description="Launch the gradio demo for SDPose inference.")
+ parser.add_argument(
+ "--share",
+ action="store_true",
+ help="Create a public link",
+ )
+ parser.add_argument(
+ "--server_name",
+ type=str,
+ default="0.0.0.0",
+ help="Server name",
+ )
+ parser.add_argument(
+ "--server_port",
+ type=int,
+ default=7860,
+ help="Server port",
+ )
+ return parser.parse_args()
+
+
+if __name__ == "__main__":
+ args = parse_args()
+
+ # Create and launch the Gradio interface
+ demo = create_gradio_interface()
+ demo.launch(
+ server_name=args.server_name,
+ server_port=args.server_port,
+ share=args.share,
+ show_error=True,
+ debug=True
+ )
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/gradio_app/launch_gradio.sh b/ SDPose-Wholebody/SDPose-OOD-main/gradio_app/launch_gradio.sh
new file mode 100644
index 0000000000000000000000000000000000000000..c5482717be65eba20c4299b86808d4f6e0da1383
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/gradio_app/launch_gradio.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+# Launch script for SDPose Gradio App
+# Author: T. S. Liang, Oct. 2025
+
+echo "🚀 Launching SDPose Gradio App..."
+echo "📍 Make sure you're in the correct conda/virtual environment"
+echo ""
+
+# Default settings
+SHARE=false
+SERVER_NAME="0.0.0.0"
+SERVER_PORT=7860
+
+# Parse command line arguments
+while [[ $# -gt 0 ]]; do
+ case $1 in
+ --share)
+ SHARE=true
+ shift
+ ;;
+ --port)
+ SERVER_PORT="$2"
+ shift 2
+ ;;
+ --host)
+ SERVER_NAME="$2"
+ shift 2
+ ;;
+ *)
+ echo "Unknown option: $1"
+ echo "Usage: $0 [--share] [--port PORT] [--host HOST]"
+ exit 1
+ ;;
+ esac
+done
+
+# Build command
+CMD="python SDPose_gradio.py --server_name $SERVER_NAME --server_port $SERVER_PORT"
+if [ "$SHARE" = true ]; then
+ CMD="$CMD --share"
+fi
+
+echo "🌐 Server will run on: http://$SERVER_NAME:$SERVER_PORT"
+if [ "$SHARE" = true ]; then
+ echo "🔗 Public link will be generated"
+fi
+echo ""
+
+# Run the app
+$CMD
+
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..2823138c2dcc59bd46fbe6862bc7e4786971910e
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/__init__.py
@@ -0,0 +1,21 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import mmcv
+import mmengine
+from mmengine.utils import digit_version
+
+from .version import __version__, short_version
+
+mmcv_minimum_version = '2.0.0rc4'
+mmcv_maximum_version = '2.1.0'
+mmcv_version = digit_version(mmcv.__version__)
+
+mmengine_minimum_version = '0.6.0'
+mmengine_maximum_version = '1.0.0'
+mmengine_version = digit_version(mmengine.__version__)
+
+__all__ = ['__version__', 'short_version']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..799e7beb3201ae0b1aca8a999dfe3b8f3e8bb7a5
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/__pycache__/registry.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/__pycache__/registry.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..02e7c99f0dfcda2d4a849e17ff178f8cf0939dda
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/__pycache__/registry.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/__pycache__/version.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/__pycache__/version.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3395edbf3b2023a01cab178e41053947defe93d9
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/__pycache__/version.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..80354328bcfa468ccbcf6b3d8f4af2fabd844ab9
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/__init__.py
@@ -0,0 +1,20 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .inference import (collect_multi_frames, inference_bottomup,
+ inference_topdown, init_model)
+from .inference_3d import (collate_pose_sequence, convert_keypoint_definition,
+ extract_pose_sequence, inference_pose_lifter_model)
+from .inference_tracking import _compute_iou, _track_by_iou, _track_by_oks
+from .inferencers import MMPoseInferencer, Pose2DInferencer
+
+__all__ = [
+ 'init_model', 'inference_topdown', 'inference_bottomup',
+ 'collect_multi_frames', 'Pose2DInferencer', 'MMPoseInferencer',
+ '_track_by_iou', '_track_by_oks', '_compute_iou',
+ 'inference_pose_lifter_model', 'extract_pose_sequence',
+ 'convert_keypoint_definition', 'collate_pose_sequence',
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inference.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inference.py
new file mode 100644
index 0000000000000000000000000000000000000000..c294d74794fbe2142fa78a6d197124cbb028c278
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inference.py
@@ -0,0 +1,268 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import warnings
+from pathlib import Path
+from typing import List, Optional, Union
+
+import numpy as np
+import torch
+import torch.nn as nn
+from mmengine.config import Config
+from mmengine.dataset import Compose, pseudo_collate
+from mmengine.model.utils import revert_sync_batchnorm
+from mmengine.registry import init_default_scope
+from mmengine.runner import load_checkpoint
+from PIL import Image
+
+from mmpose.datasets.datasets.utils import parse_pose_metainfo
+from mmpose.models.builder import build_pose_estimator
+from mmpose.structures import PoseDataSample
+from mmpose.structures.bbox import bbox_xywh2xyxy
+
+
+def dataset_meta_from_config(config: Config,
+ dataset_mode: str = 'train') -> Optional[dict]:
+ """Get dataset metainfo from the model config.
+
+ Args:
+ config (str, :obj:`Path`, or :obj:`mmengine.Config`): Config file path,
+ :obj:`Path`, or the config object.
+ dataset_mode (str): Specify the dataset of which to get the metainfo.
+ Options are ``'train'``, ``'val'`` and ``'test'``. Defaults to
+ ``'train'``
+
+ Returns:
+ dict, optional: The dataset metainfo. See
+ ``mmpose.datasets.datasets.utils.parse_pose_metainfo`` for details.
+ Return ``None`` if failing to get dataset metainfo from the config.
+ """
+ try:
+ if dataset_mode == 'train':
+ dataset_cfg = config.train_dataloader.dataset
+ elif dataset_mode == 'val':
+ dataset_cfg = config.val_dataloader.dataset
+ elif dataset_mode == 'test':
+ dataset_cfg = config.test_dataloader.dataset
+ else:
+ raise ValueError(
+ f'Invalid dataset {dataset_mode} to get metainfo. '
+ 'Should be one of "train", "val", or "test".')
+
+ if 'metainfo' in dataset_cfg:
+ metainfo = dataset_cfg.metainfo
+ else:
+ import mmpose.datasets.datasets # noqa: F401, F403
+ from mmpose.registry import DATASETS
+
+ dataset_class = DATASETS.get(dataset_cfg.type)
+ metainfo = dataset_class.METAINFO
+
+ metainfo = parse_pose_metainfo(metainfo)
+
+ except AttributeError:
+ metainfo = None
+
+ return metainfo
+
+
+def init_model(config: Union[str, Path, Config],
+ checkpoint: Optional[str] = None,
+ device: str = 'cuda:0',
+ override_ckpt_meta = False,
+ cfg_options: Optional[dict] = None) -> nn.Module:
+ """Initialize a pose estimator from a config file.
+
+ Args:
+ config (str, :obj:`Path`, or :obj:`mmengine.Config`): Config file path,
+ :obj:`Path`, or the config object.
+ checkpoint (str, optional): Checkpoint path. If left as None, the model
+ will not load any weights. Defaults to ``None``
+ device (str): The device where the anchors will be put on.
+ Defaults to ``'cuda:0'``.
+ cfg_options (dict, optional): Options to override some settings in
+ the used config. Defaults to ``None``
+
+ Returns:
+ nn.Module: The constructed pose estimator.
+ """
+
+ if isinstance(config, (str, Path)):
+ config = Config.fromfile(config)
+ elif not isinstance(config, Config):
+ raise TypeError('config must be a filename or Config object, '
+ f'but got {type(config)}')
+ if cfg_options is not None:
+ config.merge_from_dict(cfg_options)
+ elif 'init_cfg' in config.model.backbone:
+ config.model.backbone.init_cfg = None
+ config.model.train_cfg = None
+
+ # register all modules in mmpose into the registries
+ scope = config.get('default_scope', 'mmpose')
+ if scope is not None:
+ init_default_scope(scope)
+
+ model = build_pose_estimator(config.model)
+ model = revert_sync_batchnorm(model)
+ # get dataset_meta in this priority: checkpoint > config > default (COCO)
+ dataset_meta = None
+
+ if checkpoint is not None:
+ ckpt = load_checkpoint(model, checkpoint, map_location='cpu')
+
+ if 'dataset_meta' in ckpt.get('meta', {}):
+ # checkpoint from mmpose 1.x
+ dataset_meta = ckpt['meta']['dataset_meta']
+
+ if dataset_meta is None or override_ckpt_meta == True:
+ dataset_meta = dataset_meta_from_config(config, dataset_mode='train')
+
+ if dataset_meta is None:
+ warnings.simplefilter('once')
+ warnings.warn('Can not load dataset_meta from the checkpoint or the '
+ 'model config. Use COCO metainfo by default.')
+ dataset_meta = parse_pose_metainfo(
+ dict(from_file='configs/_base_/datasets/coco.py'))
+
+ model.dataset_meta = dataset_meta
+
+ model.cfg = config # save the config in the model for convenience
+ model.to(device)
+ model.eval()
+ return model
+
+
+def inference_topdown(model: nn.Module,
+ img: Union[np.ndarray, str],
+ bboxes: Optional[Union[List, np.ndarray]] = None,
+ bbox_format: str = 'xyxy') -> List[PoseDataSample]:
+ """Inference image with a top-down pose estimator.
+
+ Args:
+ model (nn.Module): The top-down pose estimator
+ img (np.ndarray | str): The loaded image or image file to inference
+ bboxes (np.ndarray, optional): The bboxes in shape (N, 4), each row
+ represents a bbox. If not given, the entire image will be regarded
+ as a single bbox area. Defaults to ``None``
+ bbox_format (str): The bbox format indicator. Options are ``'xywh'``
+ and ``'xyxy'``. Defaults to ``'xyxy'``
+
+ Returns:
+ List[:obj:`PoseDataSample`]: The inference results. Specifically, the
+ predicted keypoints and scores are saved at
+ ``data_sample.pred_instances.keypoints`` and
+ ``data_sample.pred_instances.keypoint_scores``.
+ """
+ scope = model.cfg.get('default_scope', 'mmpose')
+ if scope is not None:
+ init_default_scope(scope)
+ pipeline = Compose(model.cfg.test_dataloader.dataset.pipeline)
+
+ if bboxes is None or len(bboxes) == 0:
+ # get bbox from the image size
+ if isinstance(img, str):
+ w, h = Image.open(img).size
+ else:
+ h, w = img.shape[:2]
+
+ bboxes = np.array([[0, 0, w, h]], dtype=np.float32)
+ else:
+ if isinstance(bboxes, list):
+ bboxes = np.array(bboxes)
+
+ assert bbox_format in {'xyxy', 'xywh'}, \
+ f'Invalid bbox_format "{bbox_format}".'
+
+ if bbox_format == 'xywh':
+ bboxes = bbox_xywh2xyxy(bboxes)
+
+ # construct batch data samples
+ data_list = []
+ for bbox in bboxes:
+ if isinstance(img, str):
+ data_info = dict(img_path=img)
+ else:
+ data_info = dict(img=img)
+ data_info['bbox'] = bbox[None] # shape (1, 4)
+ data_info['bbox_score'] = np.ones(1, dtype=np.float32) # shape (1,)
+ data_info.update(model.dataset_meta)
+ data_list.append(pipeline(data_info))
+
+ if data_list:
+ # collate data list into a batch, which is a dict with following keys:
+ # batch['inputs']: a list of input images
+ # batch['data_samples']: a list of :obj:`PoseDataSample`
+ batch = pseudo_collate(data_list)
+ with torch.no_grad():
+ results = model.test_step(batch)
+ else:
+ results = []
+
+ return results
+
+
+def inference_bottomup(model: nn.Module, img: Union[np.ndarray, str]):
+ """Inference image with a bottom-up pose estimator.
+
+ Args:
+ model (nn.Module): The bottom-up pose estimator
+ img (np.ndarray | str): The loaded image or image file to inference
+
+ Returns:
+ List[:obj:`PoseDataSample`]: The inference results. Specifically, the
+ predicted keypoints and scores are saved at
+ ``data_sample.pred_instances.keypoints`` and
+ ``data_sample.pred_instances.keypoint_scores``.
+ """
+ pipeline = Compose(model.cfg.test_dataloader.dataset.pipeline)
+
+ # prepare data batch
+ if isinstance(img, str):
+ data_info = dict(img_path=img)
+ else:
+ data_info = dict(img=img)
+ data_info.update(model.dataset_meta)
+ data = pipeline(data_info)
+ batch = pseudo_collate([data])
+
+ with torch.no_grad():
+ results = model.test_step(batch)
+
+ return results
+
+
+def collect_multi_frames(video, frame_id, indices, online=False):
+ """Collect multi frames from the video.
+
+ Args:
+ video (mmcv.VideoReader): A VideoReader of the input video file.
+ frame_id (int): index of the current frame
+ indices (list(int)): index offsets of the frames to collect
+ online (bool): inference mode, if set to True, can not use future
+ frame information.
+
+ Returns:
+ list(ndarray): multi frames collected from the input video file.
+ """
+ num_frames = len(video)
+ frames = []
+ # put the current frame at first
+ frames.append(video[frame_id])
+ # use multi frames for inference
+ for idx in indices:
+ # skip current frame
+ if idx == 0:
+ continue
+ support_idx = frame_id + idx
+ # online mode, can not use future frame information
+ if online:
+ support_idx = np.clip(support_idx, 0, frame_id)
+ else:
+ support_idx = np.clip(support_idx, 0, num_frames - 1)
+ frames.append(video[support_idx])
+
+ return frames
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inference_3d.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inference_3d.py
new file mode 100644
index 0000000000000000000000000000000000000000..65f625b949290aa8050d08b5c9353aab5ad5c314
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inference_3d.py
@@ -0,0 +1,344 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import numpy as np
+import torch
+from mmengine.dataset import Compose, pseudo_collate
+from mmengine.registry import init_default_scope
+from mmengine.structures import InstanceData
+
+from mmpose.structures import PoseDataSample
+
+
+def convert_keypoint_definition(keypoints, pose_det_dataset,
+ pose_lift_dataset):
+ """Convert pose det dataset keypoints definition to pose lifter dataset
+ keypoints definition, so that they are compatible with the definitions
+ required for 3D pose lifting.
+
+ Args:
+ keypoints (ndarray[N, K, 2 or 3]): 2D keypoints to be transformed.
+ pose_det_dataset, (str): Name of the dataset for 2D pose detector.
+ pose_lift_dataset (str): Name of the dataset for pose lifter model.
+
+ Returns:
+ ndarray[K, 2 or 3]: the transformed 2D keypoints.
+ """
+ assert pose_lift_dataset in [
+ 'Human36mDataset'], '`pose_lift_dataset` should be ' \
+ f'`Human36mDataset`, but got {pose_lift_dataset}.'
+
+ coco_style_datasets = [
+ 'CocoDataset', 'PoseTrack18VideoDataset', 'PoseTrack18Dataset'
+ ]
+ keypoints_new = np.zeros((keypoints.shape[0], 17, keypoints.shape[2]),
+ dtype=keypoints.dtype)
+ if pose_lift_dataset == 'Human36mDataset':
+ if pose_det_dataset in ['Human36mDataset']:
+ keypoints_new = keypoints
+ elif pose_det_dataset in coco_style_datasets:
+ # pelvis (root) is in the middle of l_hip and r_hip
+ keypoints_new[:, 0] = (keypoints[:, 11] + keypoints[:, 12]) / 2
+ # thorax is in the middle of l_shoulder and r_shoulder
+ keypoints_new[:, 8] = (keypoints[:, 5] + keypoints[:, 6]) / 2
+ # spine is in the middle of thorax and pelvis
+ keypoints_new[:,
+ 7] = (keypoints_new[:, 0] + keypoints_new[:, 8]) / 2
+ # in COCO, head is in the middle of l_eye and r_eye
+ # in PoseTrack18, head is in the middle of head_bottom and head_top
+ keypoints_new[:, 10] = (keypoints[:, 1] + keypoints[:, 2]) / 2
+ # rearrange other keypoints
+ keypoints_new[:, [1, 2, 3, 4, 5, 6, 9, 11, 12, 13, 14, 15, 16]] = \
+ keypoints[:, [12, 14, 16, 11, 13, 15, 0, 5, 7, 9, 6, 8, 10]]
+ elif pose_det_dataset in ['AicDataset']:
+ # pelvis (root) is in the middle of l_hip and r_hip
+ keypoints_new[:, 0] = (keypoints[:, 9] + keypoints[:, 6]) / 2
+ # thorax is in the middle of l_shoulder and r_shoulder
+ keypoints_new[:, 8] = (keypoints[:, 3] + keypoints[:, 0]) / 2
+ # spine is in the middle of thorax and pelvis
+ keypoints_new[:,
+ 7] = (keypoints_new[:, 0] + keypoints_new[:, 8]) / 2
+ # neck base (top end of neck) is 1/4 the way from
+ # neck (bottom end of neck) to head top
+ keypoints_new[:, 9] = (3 * keypoints[:, 13] + keypoints[:, 12]) / 4
+ # head (spherical centre of head) is 7/12 the way from
+ # neck (bottom end of neck) to head top
+ keypoints_new[:, 10] = (5 * keypoints[:, 13] +
+ 7 * keypoints[:, 12]) / 12
+
+ keypoints_new[:, [1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 15, 16]] = \
+ keypoints[:, [6, 7, 8, 9, 10, 11, 3, 4, 5, 0, 1, 2]]
+ elif pose_det_dataset in ['CrowdPoseDataset']:
+ # pelvis (root) is in the middle of l_hip and r_hip
+ keypoints_new[:, 0] = (keypoints[:, 6] + keypoints[:, 7]) / 2
+ # thorax is in the middle of l_shoulder and r_shoulder
+ keypoints_new[:, 8] = (keypoints[:, 0] + keypoints[:, 1]) / 2
+ # spine is in the middle of thorax and pelvis
+ keypoints_new[:,
+ 7] = (keypoints_new[:, 0] + keypoints_new[:, 8]) / 2
+ # neck base (top end of neck) is 1/4 the way from
+ # neck (bottom end of neck) to head top
+ keypoints_new[:, 9] = (3 * keypoints[:, 13] + keypoints[:, 12]) / 4
+ # head (spherical centre of head) is 7/12 the way from
+ # neck (bottom end of neck) to head top
+ keypoints_new[:, 10] = (5 * keypoints[:, 13] +
+ 7 * keypoints[:, 12]) / 12
+
+ keypoints_new[:, [1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 15, 16]] = \
+ keypoints[:, [7, 9, 11, 6, 8, 10, 0, 2, 4, 1, 3, 5]]
+ else:
+ raise NotImplementedError(
+ f'unsupported conversion between {pose_lift_dataset} and '
+ f'{pose_det_dataset}')
+
+ return keypoints_new
+
+
+def extract_pose_sequence(pose_results, frame_idx, causal, seq_len, step=1):
+ """Extract the target frame from 2D pose results, and pad the sequence to a
+ fixed length.
+
+ Args:
+ pose_results (List[List[:obj:`PoseDataSample`]]): Multi-frame pose
+ detection results stored in a list.
+ frame_idx (int): The index of the frame in the original video.
+ causal (bool): If True, the target frame is the last frame in
+ a sequence. Otherwise, the target frame is in the middle of
+ a sequence.
+ seq_len (int): The number of frames in the input sequence.
+ step (int): Step size to extract frames from the video.
+
+ Returns:
+ List[List[:obj:`PoseDataSample`]]: Multi-frame pose detection results
+ stored in a nested list with a length of seq_len.
+ """
+ if causal:
+ frames_left = seq_len - 1
+ frames_right = 0
+ else:
+ frames_left = (seq_len - 1) // 2
+ frames_right = frames_left
+ num_frames = len(pose_results)
+
+ # get the padded sequence
+ pad_left = max(0, frames_left - frame_idx // step)
+ pad_right = max(0, frames_right - (num_frames - 1 - frame_idx) // step)
+ start = max(frame_idx % step, frame_idx - frames_left * step)
+ end = min(num_frames - (num_frames - 1 - frame_idx) % step,
+ frame_idx + frames_right * step + 1)
+ pose_results_seq = [pose_results[0]] * pad_left + \
+ pose_results[start:end:step] + [pose_results[-1]] * pad_right
+ return pose_results_seq
+
+
+def collate_pose_sequence(pose_results_2d,
+ with_track_id=True,
+ target_frame=-1):
+ """Reorganize multi-frame pose detection results into individual pose
+ sequences.
+
+ Note:
+ - The temporal length of the pose detection results: T
+ - The number of the person instances: N
+ - The number of the keypoints: K
+ - The channel number of each keypoint: C
+
+ Args:
+ pose_results_2d (List[List[:obj:`PoseDataSample`]]): Multi-frame pose
+ detection results stored in a nested list. Each element of the
+ outer list is the pose detection results of a single frame, and
+ each element of the inner list is the pose information of one
+ person, which contains:
+
+ - keypoints (ndarray[K, 2 or 3]): x, y, [score]
+ - track_id (int): unique id of each person, required when
+ ``with_track_id==True```
+
+ with_track_id (bool): If True, the element in pose_results is expected
+ to contain "track_id", which will be used to gather the pose
+ sequence of a person from multiple frames. Otherwise, the pose
+ results in each frame are expected to have a consistent number and
+ order of identities. Default is True.
+ target_frame (int): The index of the target frame. Default: -1.
+
+ Returns:
+ List[:obj:`PoseDataSample`]: Indivisual pose sequence in with length N.
+ """
+ T = len(pose_results_2d)
+ assert T > 0
+
+ target_frame = (T + target_frame) % T # convert negative index to positive
+
+ N = len(
+ pose_results_2d[target_frame]) # use identities in the target frame
+ if N == 0:
+ return []
+
+ B, K, C = pose_results_2d[target_frame][0].pred_instances.keypoints.shape
+
+ track_ids = None
+ if with_track_id:
+ track_ids = [res.track_id for res in pose_results_2d[target_frame]]
+
+ pose_sequences = []
+ for idx in range(N):
+ pose_seq = PoseDataSample()
+ gt_instances = InstanceData()
+ pred_instances = InstanceData()
+
+ for k in pose_results_2d[target_frame][idx].gt_instances.keys():
+ gt_instances.set_field(
+ pose_results_2d[target_frame][idx].gt_instances[k], k)
+ for k in pose_results_2d[target_frame][idx].pred_instances.keys():
+ if k != 'keypoints':
+ pred_instances.set_field(
+ pose_results_2d[target_frame][idx].pred_instances[k], k)
+ pose_seq.pred_instances = pred_instances
+ pose_seq.gt_instances = gt_instances
+
+ if not with_track_id:
+ pose_seq.pred_instances.keypoints = np.stack([
+ frame[idx].pred_instances.keypoints
+ for frame in pose_results_2d
+ ],
+ axis=1)
+ else:
+ keypoints = np.zeros((B, T, K, C), dtype=np.float32)
+ keypoints[:, target_frame] = pose_results_2d[target_frame][
+ idx].pred_instances.keypoints
+ # find the left most frame containing track_ids[idx]
+ for frame_idx in range(target_frame - 1, -1, -1):
+ contains_idx = False
+ for res in pose_results_2d[frame_idx]:
+ if res.track_id == track_ids[idx]:
+ keypoints[:, frame_idx] = res.pred_instances.keypoints
+ contains_idx = True
+ break
+ if not contains_idx:
+ # replicate the left most frame
+ keypoints[:, :frame_idx + 1] = keypoints[:, frame_idx + 1]
+ break
+ # find the right most frame containing track_idx[idx]
+ for frame_idx in range(target_frame + 1, T):
+ contains_idx = False
+ for res in pose_results_2d[frame_idx]:
+ if res.track_id == track_ids[idx]:
+ keypoints[:, frame_idx] = res.pred_instances.keypoints
+ contains_idx = True
+ break
+ if not contains_idx:
+ # replicate the right most frame
+ keypoints[:, frame_idx + 1:] = keypoints[:, frame_idx]
+ break
+ pose_seq.pred_instances.keypoints = keypoints
+ pose_sequences.append(pose_seq)
+
+ return pose_sequences
+
+
+def inference_pose_lifter_model(model,
+ pose_results_2d,
+ with_track_id=True,
+ image_size=None,
+ norm_pose_2d=False):
+ """Inference 3D pose from 2D pose sequences using a pose lifter model.
+
+ Args:
+ model (nn.Module): The loaded pose lifter model
+ pose_results_2d (List[List[:obj:`PoseDataSample`]]): The 2D pose
+ sequences stored in a nested list.
+ with_track_id: If True, the element in pose_results_2d is expected to
+ contain "track_id", which will be used to gather the pose sequence
+ of a person from multiple frames. Otherwise, the pose results in
+ each frame are expected to have a consistent number and order of
+ identities. Default is True.
+ image_size (tuple|list): image width, image height. If None, image size
+ will not be contained in dict ``data``.
+ norm_pose_2d (bool): If True, scale the bbox (along with the 2D
+ pose) to the average bbox scale of the dataset, and move the bbox
+ (along with the 2D pose) to the average bbox center of the dataset.
+
+ Returns:
+ List[:obj:`PoseDataSample`]: 3D pose inference results. Specifically,
+ the predicted keypoints and scores are saved at
+ ``data_sample.pred_instances.keypoints_3d``.
+ """
+ init_default_scope(model.cfg.get('default_scope', 'mmpose'))
+ pipeline = Compose(model.cfg.test_dataloader.dataset.pipeline)
+
+ causal = model.cfg.test_dataloader.dataset.get('causal', False)
+ target_idx = -1 if causal else len(pose_results_2d) // 2
+
+ dataset_info = model.dataset_meta
+ if dataset_info is not None:
+ if 'stats_info' in dataset_info:
+ bbox_center = dataset_info['stats_info']['bbox_center']
+ bbox_scale = dataset_info['stats_info']['bbox_scale']
+ else:
+ bbox_center = None
+ bbox_scale = None
+
+ for i, pose_res in enumerate(pose_results_2d):
+ for j, data_sample in enumerate(pose_res):
+ kpts = data_sample.pred_instances.keypoints
+ bboxes = data_sample.pred_instances.bboxes
+ keypoints = []
+ for k in range(len(kpts)):
+ kpt = kpts[k]
+ if norm_pose_2d:
+ bbox = bboxes[k]
+ center = np.array([[(bbox[0] + bbox[2]) / 2,
+ (bbox[1] + bbox[3]) / 2]])
+ scale = max(bbox[2] - bbox[0], bbox[3] - bbox[1])
+ keypoints.append((kpt[:, :2] - center) / scale *
+ bbox_scale + bbox_center)
+ else:
+ keypoints.append(kpt[:, :2])
+ pose_results_2d[i][j].pred_instances.keypoints = np.array(
+ keypoints)
+
+ pose_sequences_2d = collate_pose_sequence(pose_results_2d, with_track_id,
+ target_idx)
+
+ if not pose_sequences_2d:
+ return []
+
+ data_list = []
+ for i, pose_seq in enumerate(pose_sequences_2d):
+ data_info = dict()
+
+ keypoints_2d = pose_seq.pred_instances.keypoints
+ keypoints_2d = np.squeeze(
+ keypoints_2d, axis=0) if keypoints_2d.ndim == 4 else keypoints_2d
+
+ T, K, C = keypoints_2d.shape
+
+ data_info['keypoints'] = keypoints_2d
+ data_info['keypoints_visible'] = np.ones((
+ T,
+ K,
+ ), dtype=np.float32)
+ data_info['lifting_target'] = np.zeros((K, 3), dtype=np.float32)
+ data_info['lifting_target_visible'] = np.ones((K, 1), dtype=np.float32)
+
+ if image_size is not None:
+ assert len(image_size) == 2
+ data_info['camera_param'] = dict(w=image_size[0], h=image_size[1])
+
+ data_info.update(model.dataset_meta)
+ data_list.append(pipeline(data_info))
+
+ if data_list:
+ # collate data list into a batch, which is a dict with following keys:
+ # batch['inputs']: a list of input images
+ # batch['data_samples']: a list of :obj:`PoseDataSample`
+ batch = pseudo_collate(data_list)
+ with torch.no_grad():
+ results = model.test_step(batch)
+ else:
+ results = []
+
+ return results
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inference_tracking.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inference_tracking.py
new file mode 100644
index 0000000000000000000000000000000000000000..439de25dce6c9127a44320b447e683d540b03b9c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inference_tracking.py
@@ -0,0 +1,108 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import warnings
+
+import numpy as np
+
+from mmpose.evaluation.functional.nms import oks_iou
+
+
+def _compute_iou(bboxA, bboxB):
+ """Compute the Intersection over Union (IoU) between two boxes .
+
+ Args:
+ bboxA (list): The first bbox info (left, top, right, bottom, score).
+ bboxB (list): The second bbox info (left, top, right, bottom, score).
+
+ Returns:
+ float: The IoU value.
+ """
+
+ x1 = max(bboxA[0], bboxB[0])
+ y1 = max(bboxA[1], bboxB[1])
+ x2 = min(bboxA[2], bboxB[2])
+ y2 = min(bboxA[3], bboxB[3])
+
+ inter_area = max(0, x2 - x1) * max(0, y2 - y1)
+
+ bboxA_area = (bboxA[2] - bboxA[0]) * (bboxA[3] - bboxA[1])
+ bboxB_area = (bboxB[2] - bboxB[0]) * (bboxB[3] - bboxB[1])
+ union_area = float(bboxA_area + bboxB_area - inter_area)
+ if union_area == 0:
+ union_area = 1e-5
+ warnings.warn('union_area=0 is unexpected')
+
+ iou = inter_area / union_area
+
+ return iou
+
+
+def _track_by_iou(res, results_last, thr):
+ """Get track id using IoU tracking greedily."""
+
+ bbox = list(np.squeeze(res.pred_instances.bboxes, axis=0))
+
+ max_iou_score = -1
+ max_index = -1
+ match_result = {}
+ for index, res_last in enumerate(results_last):
+ bbox_last = list(np.squeeze(res_last.pred_instances.bboxes, axis=0))
+
+ iou_score = _compute_iou(bbox, bbox_last)
+ if iou_score > max_iou_score:
+ max_iou_score = iou_score
+ max_index = index
+
+ if max_iou_score > thr:
+ track_id = results_last[max_index].track_id
+ match_result = results_last[max_index]
+ del results_last[max_index]
+ else:
+ track_id = -1
+
+ return track_id, results_last, match_result
+
+
+def _track_by_oks(res, results_last, thr, sigmas=None):
+ """Get track id using OKS tracking greedily."""
+ keypoint = np.concatenate((res.pred_instances.keypoints,
+ res.pred_instances.keypoint_scores[:, :, None]),
+ axis=2)
+ keypoint = np.squeeze(keypoint, axis=0).reshape((-1))
+ area = np.squeeze(res.pred_instances.areas, axis=0)
+ max_index = -1
+ match_result = {}
+
+ if len(results_last) == 0:
+ return -1, results_last, match_result
+
+ keypoints_last = np.array([
+ np.squeeze(
+ np.concatenate(
+ (res_last.pred_instances.keypoints,
+ res_last.pred_instances.keypoint_scores[:, :, None]),
+ axis=2),
+ axis=0).reshape((-1)) for res_last in results_last
+ ])
+ area_last = np.array([
+ np.squeeze(res_last.pred_instances.areas, axis=0)
+ for res_last in results_last
+ ])
+
+ oks_score = oks_iou(
+ keypoint, keypoints_last, area, area_last, sigmas=sigmas)
+
+ max_index = np.argmax(oks_score)
+
+ if oks_score[max_index] > thr:
+ track_id = results_last[max_index].track_id
+ match_result = results_last[max_index]
+ del results_last[max_index]
+ else:
+ track_id = -1
+
+ return track_id, results_last, match_result
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..1589fc14e400fb96056350ae366dbfbfe859e179
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/__init__.py
@@ -0,0 +1,15 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .mmpose_inferencer import MMPoseInferencer
+from .pose2d_inferencer import Pose2DInferencer
+from .pose3d_inferencer import Pose3DInferencer
+from .utils import get_model_aliases
+
+__all__ = [
+ 'Pose2DInferencer', 'MMPoseInferencer', 'get_model_aliases',
+ 'Pose3DInferencer'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/base_mmpose_inferencer.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/base_mmpose_inferencer.py
new file mode 100644
index 0000000000000000000000000000000000000000..edb162b66ee68c1a281a5b900c063d1c90b43c03
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/base_mmpose_inferencer.py
@@ -0,0 +1,474 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import mimetypes
+import os
+import warnings
+from collections import defaultdict
+from typing import (Callable, Dict, Generator, Iterable, List, Optional,
+ Sequence, Union)
+
+import cv2
+import mmcv
+import mmengine
+import numpy as np
+import torch.nn as nn
+from mmengine.config import Config, ConfigDict
+from mmengine.dataset import Compose
+from mmengine.fileio import (get_file_backend, isdir, join_path,
+ list_dir_or_file)
+from mmengine.infer.infer import BaseInferencer
+from mmengine.registry import init_default_scope
+from mmengine.runner.checkpoint import _load_checkpoint_to_model
+from mmengine.structures import InstanceData
+from mmengine.utils import mkdir_or_exist
+
+from mmpose.apis.inference import dataset_meta_from_config
+from mmpose.structures import PoseDataSample, split_instances
+
+InstanceList = List[InstanceData]
+InputType = Union[str, np.ndarray]
+InputsType = Union[InputType, Sequence[InputType]]
+PredType = Union[InstanceData, InstanceList]
+ImgType = Union[np.ndarray, Sequence[np.ndarray]]
+ConfigType = Union[Config, ConfigDict]
+ResType = Union[Dict, List[Dict], InstanceData, List[InstanceData]]
+
+
+class BaseMMPoseInferencer(BaseInferencer):
+ """The base class for MMPose inferencers."""
+
+ preprocess_kwargs: set = {'bbox_thr', 'nms_thr', 'bboxes'}
+ forward_kwargs: set = set()
+ visualize_kwargs: set = {
+ 'return_vis', 'show', 'wait_time', 'draw_bbox', 'radius', 'thickness',
+ 'kpt_thr', 'vis_out_dir', 'black_background'
+ }
+ postprocess_kwargs: set = {'pred_out_dir'}
+
+ def _load_weights_to_model(self, model: nn.Module,
+ checkpoint: Optional[dict],
+ cfg: Optional[ConfigType]) -> None:
+ """Loading model weights and meta information from cfg and checkpoint.
+
+ Subclasses could override this method to load extra meta information
+ from ``checkpoint`` and ``cfg`` to model.
+
+ Args:
+ model (nn.Module): Model to load weights and meta information.
+ checkpoint (dict, optional): The loaded checkpoint.
+ cfg (Config or ConfigDict, optional): The loaded config.
+ """
+ if checkpoint is not None:
+ _load_checkpoint_to_model(model, checkpoint)
+ checkpoint_meta = checkpoint.get('meta', {})
+ # save the dataset_meta in the model for convenience
+ if 'dataset_meta' in checkpoint_meta:
+ # mmpose 1.x
+ model.dataset_meta = checkpoint_meta['dataset_meta']
+ else:
+ warnings.warn(
+ 'dataset_meta are not saved in the checkpoint\'s '
+ 'meta data, load via config.')
+ model.dataset_meta = dataset_meta_from_config(
+ cfg, dataset_mode='train')
+ else:
+ warnings.warn('Checkpoint is not loaded, and the inference '
+ 'result is calculated by the randomly initialized '
+ 'model!')
+ model.dataset_meta = dataset_meta_from_config(
+ cfg, dataset_mode='train')
+
+ def _inputs_to_list(self, inputs: InputsType) -> Iterable:
+ """Preprocess the inputs to a list.
+
+ Preprocess inputs to a list according to its type:
+
+ - list or tuple: return inputs
+ - str:
+ - Directory path: return all files in the directory
+ - other cases: return a list containing the string. The string
+ could be a path to file, a url or other types of string
+ according to the task.
+
+ Args:
+ inputs (InputsType): Inputs for the inferencer.
+
+ Returns:
+ list: List of input for the :meth:`preprocess`.
+ """
+ self._video_input = False
+
+ if isinstance(inputs, str):
+ backend = get_file_backend(inputs)
+ if hasattr(backend, 'isdir') and isdir(inputs):
+ # Backends like HttpsBackend do not implement `isdir`, so only
+ # those backends that implement `isdir` could accept the
+ # inputs as a directory
+ filepath_list = [
+ join_path(inputs, fname)
+ for fname in list_dir_or_file(inputs, list_dir=False)
+ ]
+ inputs = []
+ for filepath in filepath_list:
+ input_type = mimetypes.guess_type(filepath)[0].split(
+ '/')[0]
+ if input_type == 'image':
+ inputs.append(filepath)
+ inputs.sort()
+ else:
+ # if inputs is a path to a video file, it will be converted
+ # to a list containing separated frame filenames
+ input_type = mimetypes.guess_type(inputs)[0].split('/')[0]
+ if input_type == 'video':
+ self._video_input = True
+ video = mmcv.VideoReader(inputs)
+ self.video_info = dict(
+ fps=video.fps,
+ name=os.path.basename(inputs),
+ writer=None,
+ width=video.width,
+ height=video.height,
+ predictions=[])
+ inputs = video
+ elif input_type == 'image':
+ inputs = [inputs]
+ else:
+ raise ValueError(f'Expected input to be an image, video, '
+ f'or folder, but received {inputs} of '
+ f'type {input_type}.')
+
+ elif isinstance(inputs, np.ndarray):
+ inputs = [inputs]
+
+ return inputs
+
+ def _get_webcam_inputs(self, inputs: str) -> Generator:
+ """Sets up and returns a generator function that reads frames from a
+ webcam input. The generator function returns a new frame each time it
+ is iterated over.
+
+ Args:
+ inputs (str): A string describing the webcam input, in the format
+ "webcam:id".
+
+ Returns:
+ A generator function that yields frames from the webcam input.
+
+ Raises:
+ ValueError: If the inputs string is not in the expected format.
+ """
+
+ # Ensure the inputs string is in the expected format.
+ inputs = inputs.lower()
+ assert inputs.startswith('webcam'), f'Expected input to start with ' \
+ f'"webcam", but got "{inputs}"'
+
+ # Parse the camera ID from the inputs string.
+ inputs_ = inputs.split(':')
+ if len(inputs_) == 1:
+ camera_id = 0
+ elif len(inputs_) == 2 and str.isdigit(inputs_[1]):
+ camera_id = int(inputs_[1])
+ else:
+ raise ValueError(
+ f'Expected webcam input to have format "webcam:id", '
+ f'but got "{inputs}"')
+
+ # Attempt to open the video capture object.
+ vcap = cv2.VideoCapture(camera_id)
+ if not vcap.isOpened():
+ warnings.warn(f'Cannot open camera (ID={camera_id})')
+ return []
+
+ # Set video input flag and metadata.
+ self._video_input = True
+ (major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')
+ if int(major_ver) < 3:
+ fps = vcap.get(cv2.cv.CV_CAP_PROP_FPS)
+ width = vcap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)
+ height = vcap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)
+ else:
+ fps = vcap.get(cv2.CAP_PROP_FPS)
+ width = vcap.get(cv2.CAP_PROP_FRAME_WIDTH)
+ height = vcap.get(cv2.CAP_PROP_FRAME_HEIGHT)
+ self.video_info = dict(
+ fps=fps,
+ name='webcam.mp4',
+ writer=None,
+ width=width,
+ height=height,
+ predictions=[])
+
+ def _webcam_reader() -> Generator:
+ while True:
+ if cv2.waitKey(5) & 0xFF == 27:
+ vcap.release()
+ break
+
+ ret_val, frame = vcap.read()
+ if not ret_val:
+ break
+
+ yield frame
+
+ return _webcam_reader()
+
+ def _init_pipeline(self, cfg: ConfigType) -> Callable:
+ """Initialize the test pipeline.
+
+ Args:
+ cfg (ConfigType): model config path or dict
+
+ Returns:
+ A pipeline to handle various input data, such as ``str``,
+ ``np.ndarray``. The returned pipeline will be used to process
+ a single data.
+ """
+ scope = cfg.get('default_scope', 'mmpose')
+ if scope is not None:
+ init_default_scope(scope)
+ return Compose(cfg.test_dataloader.dataset.pipeline)
+
+ def update_model_visualizer_settings(self, **kwargs):
+ """Update the settings of models and visualizer according to inference
+ arguments."""
+
+ pass
+
+ def preprocess(self,
+ inputs: InputsType,
+ batch_size: int = 1,
+ bboxes: Optional[List] = None,
+ **kwargs):
+ """Process the inputs into a model-feedable format.
+
+ Args:
+ inputs (InputsType): Inputs given by user.
+ batch_size (int): batch size. Defaults to 1.
+
+ Yields:
+ Any: Data processed by the ``pipeline`` and ``collate_fn``.
+ List[str or np.ndarray]: List of original inputs in the batch
+ """
+
+ for i, input in enumerate(inputs):
+ bbox = bboxes[i] if bboxes else []
+ data_infos = self.preprocess_single(
+ input, index=i, bboxes=bbox, **kwargs)
+ # only supports inference with batch size 1
+ yield self.collate_fn(data_infos), [input]
+
+ def visualize(self,
+ inputs: list,
+ preds: List[PoseDataSample],
+ return_vis: bool = False,
+ show: bool = False,
+ draw_bbox: bool = False,
+ wait_time: float = 0,
+ radius: int = 3,
+ thickness: int = 1,
+ kpt_thr: float = 0.3,
+ vis_out_dir: str = '',
+ window_name: str = '',
+ black_background: bool = False,
+ **kwargs) -> List[np.ndarray]:
+ """Visualize predictions.
+
+ Args:
+ inputs (list): Inputs preprocessed by :meth:`_inputs_to_list`.
+ preds (Any): Predictions of the model.
+ return_vis (bool): Whether to return images with predicted results.
+ show (bool): Whether to display the image in a popup window.
+ Defaults to False.
+ wait_time (float): The interval of show (ms). Defaults to 0
+ draw_bbox (bool): Whether to draw the bounding boxes.
+ Defaults to False
+ radius (int): Keypoint radius for visualization. Defaults to 3
+ thickness (int): Link thickness for visualization. Defaults to 1
+ kpt_thr (float): The threshold to visualize the keypoints.
+ Defaults to 0.3
+ vis_out_dir (str, optional): Directory to save visualization
+ results w/o predictions. If left as empty, no file will
+ be saved. Defaults to ''.
+ window_name (str, optional): Title of display window.
+ black_background (bool, optional): Whether to plot keypoints on a
+ black image instead of the input image. Defaults to False.
+
+ Returns:
+ List[np.ndarray]: Visualization results.
+ """
+ if (not return_vis) and (not show) and (not vis_out_dir):
+ return
+
+ if getattr(self, 'visualizer', None) is None:
+ raise ValueError('Visualization needs the "visualizer" term'
+ 'defined in the config, but got None.')
+
+ self.visualizer.radius = radius
+ self.visualizer.line_width = thickness
+
+ results = []
+
+ for single_input, pred in zip(inputs, preds):
+ if isinstance(single_input, str):
+ img = mmcv.imread(single_input, channel_order='rgb')
+ elif isinstance(single_input, np.ndarray):
+ img = mmcv.bgr2rgb(single_input)
+ else:
+ raise ValueError('Unsupported input type: '
+ f'{type(single_input)}')
+ if black_background:
+ img = img * 0
+
+ img_name = os.path.basename(pred.metainfo['img_path'])
+ window_name = window_name if window_name else img_name
+
+ # since visualization and inference utilize the same process,
+ # the wait time is reduced when a video input is utilized,
+ # thereby eliminating the issue of inference getting stuck.
+ wait_time = 1e-5 if self._video_input else wait_time
+
+ visualization = self.visualizer.add_datasample(
+ window_name,
+ img,
+ pred,
+ draw_gt=False,
+ draw_bbox=draw_bbox,
+ show=show,
+ wait_time=wait_time,
+ kpt_thr=kpt_thr,
+ **kwargs)
+ results.append(visualization)
+
+ if vis_out_dir:
+ out_img = mmcv.rgb2bgr(visualization)
+ _, file_extension = os.path.splitext(vis_out_dir)
+ if file_extension:
+ dir_name = os.path.dirname(vis_out_dir)
+ file_name = os.path.basename(vis_out_dir)
+ else:
+ dir_name = vis_out_dir
+ file_name = None
+ mkdir_or_exist(dir_name)
+
+ if self._video_input:
+
+ if self.video_info['writer'] is None:
+ fourcc = cv2.VideoWriter_fourcc(*'mp4v')
+ if file_name is None:
+ file_name = os.path.basename(
+ self.video_info['name'])
+ out_file = join_path(dir_name, file_name)
+ self.video_info['writer'] = cv2.VideoWriter(
+ out_file, fourcc, self.video_info['fps'],
+ (visualization.shape[1], visualization.shape[0]))
+ self.video_info['writer'].write(out_img)
+
+ else:
+ file_name = file_name if file_name else img_name
+ out_file = join_path(dir_name, file_name)
+ mmcv.imwrite(out_img, out_file)
+
+ if return_vis:
+ return results
+ else:
+ return []
+
+ def postprocess(
+ self,
+ preds: List[PoseDataSample],
+ visualization: List[np.ndarray],
+ return_datasample=False,
+ pred_out_dir: str = '',
+ ) -> dict:
+ """Process the predictions and visualization results from ``forward``
+ and ``visualize``.
+
+ This method should be responsible for the following tasks:
+
+ 1. Convert datasamples into a json-serializable dict if needed.
+ 2. Pack the predictions and visualization results and return them.
+ 3. Dump or log the predictions.
+
+ Args:
+ preds (List[Dict]): Predictions of the model.
+ visualization (np.ndarray): Visualized predictions.
+ return_datasample (bool): Whether to return results as
+ datasamples. Defaults to False.
+ pred_out_dir (str): Directory to save the inference results w/o
+ visualization. If left as empty, no file will be saved.
+ Defaults to ''.
+
+ Returns:
+ dict: Inference and visualization results with key ``predictions``
+ and ``visualization``
+
+ - ``visualization (Any)``: Returned by :meth:`visualize`
+ - ``predictions`` (dict or DataSample): Returned by
+ :meth:`forward` and processed in :meth:`postprocess`.
+ If ``return_datasample=False``, it usually should be a
+ json-serializable dict containing only basic data elements such
+ as strings and numbers.
+ """
+
+ result_dict = defaultdict(list)
+
+ result_dict['visualization'] = visualization
+ for pred in preds:
+ if not return_datasample:
+ # convert datasamples to list of instance predictions
+ pred = split_instances(pred.pred_instances)
+ result_dict['predictions'].append(pred)
+
+ if pred_out_dir != '':
+ for pred, data_sample in zip(result_dict['predictions'], preds):
+ if self._video_input:
+ # For video or webcam input, predictions for each frame
+ # are gathered in the 'predictions' key of 'video_info'
+ # dictionary. All frame predictions are then stored into
+ # a single file after processing all frames.
+ self.video_info['predictions'].append(pred)
+ else:
+ # For non-video inputs, predictions are stored in separate
+ # JSON files. The filename is determined by the basename
+ # of the input image path with a '.json' extension. The
+ # predictions are then dumped into this file.
+ fname = os.path.splitext(
+ os.path.basename(
+ data_sample.metainfo['img_path']))[0] + '.json'
+ mmengine.dump(
+ pred, join_path(pred_out_dir, fname), indent=' ')
+
+ return result_dict
+
+ def _finalize_video_processing(
+ self,
+ pred_out_dir: str = '',
+ ):
+ """Finalize video processing by releasing the video writer and saving
+ predictions to a file.
+
+ This method should be called after completing the video processing. It
+ releases the video writer, if it exists, and saves the predictions to a
+ JSON file if a prediction output directory is provided.
+ """
+
+ # Release the video writer if it exists
+ if self.video_info['writer'] is not None:
+ self.video_info['writer'].release()
+
+ # Save predictions
+ if pred_out_dir:
+ fname = os.path.splitext(
+ os.path.basename(self.video_info['name']))[0] + '.json'
+ predictions = [
+ dict(frame_id=i, instances=pred)
+ for i, pred in enumerate(self.video_info['predictions'])
+ ]
+
+ mmengine.dump(
+ predictions, join_path(pred_out_dir, fname), indent=' ')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/mmpose_inferencer.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/mmpose_inferencer.py
new file mode 100644
index 0000000000000000000000000000000000000000..8bc3828cb9531edb5fa6751828c8d086e3819e35
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/mmpose_inferencer.py
@@ -0,0 +1,244 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import warnings
+from typing import Dict, List, Optional, Sequence, Union
+
+import numpy as np
+import torch
+from mmengine.config import Config, ConfigDict
+from mmengine.infer.infer import ModelType
+from mmengine.structures import InstanceData
+
+from .base_mmpose_inferencer import BaseMMPoseInferencer
+from .pose2d_inferencer import Pose2DInferencer
+from .pose3d_inferencer import Pose3DInferencer
+
+InstanceList = List[InstanceData]
+InputType = Union[str, np.ndarray]
+InputsType = Union[InputType, Sequence[InputType]]
+PredType = Union[InstanceData, InstanceList]
+ImgType = Union[np.ndarray, Sequence[np.ndarray]]
+ConfigType = Union[Config, ConfigDict]
+ResType = Union[Dict, List[Dict], InstanceData, List[InstanceData]]
+
+
+class MMPoseInferencer(BaseMMPoseInferencer):
+ """MMPose Inferencer. It's a unified inferencer interface for pose
+ estimation task, currently including: Pose2D. and it can be used to perform
+ 2D keypoint detection.
+
+ Args:
+ pose2d (str, optional): Pretrained 2D pose estimation algorithm.
+ It's the path to the config file or the model name defined in
+ metafile. For example, it could be:
+
+ - model alias, e.g. ``'body'``,
+ - config name, e.g. ``'simcc_res50_8xb64-210e_coco-256x192'``,
+ - config path
+
+ Defaults to ``None``.
+ pose2d_weights (str, optional): Path to the custom checkpoint file of
+ the selected pose2d model. If it is not specified and "pose2d" is
+ a model name of metafile, the weights will be loaded from
+ metafile. Defaults to None.
+ device (str, optional): Device to run inference. If None, the
+ available device will be automatically used. Defaults to None.
+ scope (str, optional): The scope of the model. Defaults to "mmpose".
+ det_model(str, optional): Config path or alias of detection model.
+ Defaults to None.
+ det_weights(str, optional): Path to the checkpoints of detection
+ model. Defaults to None.
+ det_cat_ids(int or list[int], optional): Category id for
+ detection model. Defaults to None.
+ output_heatmaps (bool, optional): Flag to visualize predicted
+ heatmaps. If set to None, the default setting from the model
+ config will be used. Default is None.
+ """
+
+ preprocess_kwargs: set = {
+ 'bbox_thr', 'nms_thr', 'bboxes', 'use_oks_tracking', 'tracking_thr',
+ 'norm_pose_2d'
+ }
+ forward_kwargs: set = {'rebase_keypoint_height'}
+ visualize_kwargs: set = {
+ 'return_vis', 'show', 'wait_time', 'draw_bbox', 'radius', 'thickness',
+ 'kpt_thr', 'vis_out_dir', 'skeleton_style', 'draw_heatmap',
+ 'black_background'
+ }
+ postprocess_kwargs: set = {'pred_out_dir'}
+
+ def __init__(self,
+ pose2d: Optional[str] = None,
+ pose2d_weights: Optional[str] = None,
+ pose3d: Optional[str] = None,
+ pose3d_weights: Optional[str] = None,
+ device: Optional[str] = None,
+ scope: str = 'mmpose',
+ det_model: Optional[Union[ModelType, str]] = None,
+ det_weights: Optional[str] = None,
+ det_cat_ids: Optional[Union[int, List]] = None) -> None:
+
+ self.visualizer = None
+ if pose3d is not None:
+ self.inferencer = Pose3DInferencer(pose3d, pose3d_weights, pose2d,
+ pose2d_weights, device, scope,
+ det_model, det_weights,
+ det_cat_ids)
+ elif pose2d is not None:
+ self.inferencer = Pose2DInferencer(pose2d, pose2d_weights, device,
+ scope, det_model, det_weights,
+ det_cat_ids)
+ else:
+ raise ValueError('Either 2d or 3d pose estimation algorithm '
+ 'should be provided.')
+
+ def preprocess(self, inputs: InputsType, batch_size: int = 1, **kwargs):
+ """Process the inputs into a model-feedable format.
+
+ Args:
+ inputs (InputsType): Inputs given by user.
+ batch_size (int): batch size. Defaults to 1.
+
+ Yields:
+ Any: Data processed by the ``pipeline`` and ``collate_fn``.
+ List[str or np.ndarray]: List of original inputs in the batch
+ """
+
+ for i, input in enumerate(inputs):
+ data_batch = {}
+ data_infos = self.inferencer.preprocess_single(
+ input, index=i, **kwargs)
+ data_batch = self.inferencer.collate_fn(data_infos)
+ # only supports inference with batch size 1
+ yield data_batch, [input]
+
+ @torch.no_grad()
+ def forward(self, inputs: InputType, **forward_kwargs) -> PredType:
+ """Forward the inputs to the model.
+
+ Args:
+ inputs (InputsType): The inputs to be forwarded.
+
+ Returns:
+ Dict: The prediction results. Possibly with keys "pose2d".
+ """
+ return self.inferencer.forward(inputs, **forward_kwargs)
+
+ def __call__(
+ self,
+ inputs: InputsType,
+ return_datasample: bool = False,
+ batch_size: int = 1,
+ out_dir: Optional[str] = None,
+ **kwargs,
+ ) -> dict:
+ """Call the inferencer.
+
+ Args:
+ inputs (InputsType): Inputs for the inferencer.
+ return_datasample (bool): Whether to return results as
+ :obj:`BaseDataElement`. Defaults to False.
+ batch_size (int): Batch size. Defaults to 1.
+ out_dir (str, optional): directory to save visualization
+ results and predictions. Will be overoden if vis_out_dir or
+ pred_out_dir are given. Defaults to None
+ **kwargs: Key words arguments passed to :meth:`preprocess`,
+ :meth:`forward`, :meth:`visualize` and :meth:`postprocess`.
+ Each key in kwargs should be in the corresponding set of
+ ``preprocess_kwargs``, ``forward_kwargs``,
+ ``visualize_kwargs`` and ``postprocess_kwargs``.
+
+ Returns:
+ dict: Inference and visualization results.
+ """
+ if out_dir is not None:
+ if 'vis_out_dir' not in kwargs:
+ kwargs['vis_out_dir'] = f'{out_dir}/visualizations'
+ if 'pred_out_dir' not in kwargs:
+ kwargs['pred_out_dir'] = f'{out_dir}/predictions'
+
+ kwargs = {
+ key: value
+ for key, value in kwargs.items()
+ if key in set.union(self.inferencer.preprocess_kwargs,
+ self.inferencer.forward_kwargs,
+ self.inferencer.visualize_kwargs,
+ self.inferencer.postprocess_kwargs)
+ }
+ (
+ preprocess_kwargs,
+ forward_kwargs,
+ visualize_kwargs,
+ postprocess_kwargs,
+ ) = self._dispatch_kwargs(**kwargs)
+
+ self.inferencer.update_model_visualizer_settings(**kwargs)
+
+ # preprocessing
+ if isinstance(inputs, str) and inputs.startswith('webcam'):
+ inputs = self.inferencer._get_webcam_inputs(inputs)
+ batch_size = 1
+ if not visualize_kwargs.get('show', False):
+ warnings.warn('The display mode is closed when using webcam '
+ 'input. It will be turned on automatically.')
+ visualize_kwargs['show'] = True
+ else:
+ inputs = self.inferencer._inputs_to_list(inputs)
+ self._video_input = self.inferencer._video_input
+ if self._video_input:
+ self.video_info = self.inferencer.video_info
+
+ inputs = self.preprocess(
+ inputs, batch_size=batch_size, **preprocess_kwargs)
+
+ # forward
+ if 'bbox_thr' in self.inferencer.forward_kwargs:
+ forward_kwargs['bbox_thr'] = preprocess_kwargs.get('bbox_thr', -1)
+
+ preds = []
+
+ for proc_inputs, ori_inputs in inputs:
+ preds = self.forward(proc_inputs, **forward_kwargs)
+
+ visualization = self.visualize(ori_inputs, preds,
+ **visualize_kwargs)
+ results = self.postprocess(preds, visualization, return_datasample,
+ **postprocess_kwargs)
+ yield results
+
+ if self._video_input:
+ self._finalize_video_processing(
+ postprocess_kwargs.get('pred_out_dir', ''))
+
+ def visualize(self, inputs: InputsType, preds: PredType,
+ **kwargs) -> List[np.ndarray]:
+ """Visualize predictions.
+
+ Args:
+ inputs (list): Inputs preprocessed by :meth:`_inputs_to_list`.
+ preds (Any): Predictions of the model.
+ return_vis (bool): Whether to return images with predicted results.
+ show (bool): Whether to display the image in a popup window.
+ Defaults to False.
+ show_interval (int): The interval of show (s). Defaults to 0
+ radius (int): Keypoint radius for visualization. Defaults to 3
+ thickness (int): Link thickness for visualization. Defaults to 1
+ kpt_thr (float): The threshold to visualize the keypoints.
+ Defaults to 0.3
+ vis_out_dir (str, optional): directory to save visualization
+ results w/o predictions. If left as empty, no file will
+ be saved. Defaults to ''.
+
+ Returns:
+ List[np.ndarray]: Visualization results.
+ """
+ window_name = ''
+ if self.inferencer._video_input:
+ window_name = self.inferencer.video_info['name']
+
+ return self.inferencer.visualize(
+ inputs, preds, window_name=window_name, **kwargs)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/pose2d_inferencer.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/pose2d_inferencer.py
new file mode 100644
index 0000000000000000000000000000000000000000..782ee56bd615c94405a4c59b43fd44d3ae6c5ccb
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/pose2d_inferencer.py
@@ -0,0 +1,332 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os
+import warnings
+from typing import Dict, List, Optional, Sequence, Tuple, Union
+
+import mmcv
+import numpy as np
+import torch
+from mmengine.config import Config, ConfigDict
+from mmengine.infer.infer import ModelType
+from mmengine.model import revert_sync_batchnorm
+from mmengine.registry import init_default_scope
+from mmengine.structures import InstanceData
+
+from mmpose.evaluation.functional import nms
+from mmpose.registry import DATASETS, INFERENCERS
+from mmpose.structures import merge_data_samples
+from .base_mmpose_inferencer import BaseMMPoseInferencer
+from .utils import default_det_models
+
+try:
+ from mmdet.apis.det_inferencer import DetInferencer
+ has_mmdet = True
+except (ImportError, ModuleNotFoundError):
+ has_mmdet = False
+
+InstanceList = List[InstanceData]
+InputType = Union[str, np.ndarray]
+InputsType = Union[InputType, Sequence[InputType]]
+PredType = Union[InstanceData, InstanceList]
+ImgType = Union[np.ndarray, Sequence[np.ndarray]]
+ConfigType = Union[Config, ConfigDict]
+ResType = Union[Dict, List[Dict], InstanceData, List[InstanceData]]
+
+
+@INFERENCERS.register_module(name='pose-estimation')
+@INFERENCERS.register_module()
+class Pose2DInferencer(BaseMMPoseInferencer):
+ """The inferencer for 2D pose estimation.
+
+ Args:
+ model (str, optional): Pretrained 2D pose estimation algorithm.
+ It's the path to the config file or the model name defined in
+ metafile. For example, it could be:
+
+ - model alias, e.g. ``'body'``,
+ - config name, e.g. ``'simcc_res50_8xb64-210e_coco-256x192'``,
+ - config path
+
+ Defaults to ``None``.
+ weights (str, optional): Path to the checkpoint. If it is not
+ specified and "model" is a model name of metafile, the weights
+ will be loaded from metafile. Defaults to None.
+ device (str, optional): Device to run inference. If None, the
+ available device will be automatically used. Defaults to None.
+ scope (str, optional): The scope of the model. Defaults to "mmpose".
+ det_model (str, optional): Config path or alias of detection model.
+ Defaults to None.
+ det_weights (str, optional): Path to the checkpoints of detection
+ model. Defaults to None.
+ det_cat_ids (int or list[int], optional): Category id for
+ detection model. Defaults to None.
+ """
+
+ preprocess_kwargs: set = {'bbox_thr', 'nms_thr', 'bboxes'}
+ forward_kwargs: set = {'merge_results'}
+ visualize_kwargs: set = {
+ 'return_vis',
+ 'show',
+ 'wait_time',
+ 'draw_bbox',
+ 'radius',
+ 'thickness',
+ 'kpt_thr',
+ 'vis_out_dir',
+ 'skeleton_style',
+ 'draw_heatmap',
+ 'black_background',
+ }
+ postprocess_kwargs: set = {'pred_out_dir'}
+
+ def __init__(self,
+ model: Union[ModelType, str],
+ weights: Optional[str] = None,
+ device: Optional[str] = None,
+ scope: Optional[str] = 'mmpose',
+ det_model: Optional[Union[ModelType, str]] = None,
+ det_weights: Optional[str] = None,
+ det_cat_ids: Optional[Union[int, Tuple]] = None) -> None:
+
+ init_default_scope(scope)
+ super().__init__(
+ model=model, weights=weights, device=device, scope=scope)
+ self.model = revert_sync_batchnorm(self.model)
+
+ # assign dataset metainfo to self.visualizer
+ self.visualizer.set_dataset_meta(self.model.dataset_meta)
+
+ # initialize detector for top-down models
+ if self.cfg.data_mode == 'topdown':
+ object_type = DATASETS.get(self.cfg.dataset_type).__module__.split(
+ 'datasets.')[-1].split('.')[0].lower()
+
+ if det_model in ('whole_image', 'whole-image') or \
+ (det_model is None and
+ object_type not in default_det_models):
+ self.detector = None
+
+ else:
+ det_scope = 'mmdet'
+ if det_model is None:
+ det_info = default_det_models[object_type]
+ det_model, det_weights, det_cat_ids = det_info[
+ 'model'], det_info['weights'], det_info['cat_ids']
+ elif os.path.exists(det_model):
+ det_cfg = Config.fromfile(det_model)
+ det_scope = det_cfg.default_scope
+
+ if has_mmdet:
+ self.detector = DetInferencer(
+ det_model, det_weights, device=device, scope=det_scope)
+ else:
+ raise RuntimeError(
+ 'MMDetection (v3.0.0 or above) is required to build '
+ 'inferencers for top-down pose estimation models.')
+
+ if isinstance(det_cat_ids, (tuple, list)):
+ self.det_cat_ids = det_cat_ids
+ else:
+ self.det_cat_ids = (det_cat_ids, )
+
+ self._video_input = False
+
+ def update_model_visualizer_settings(self,
+ draw_heatmap: bool = False,
+ skeleton_style: str = 'mmpose',
+ **kwargs) -> None:
+ """Update the settings of models and visualizer according to inference
+ arguments.
+
+ Args:
+ draw_heatmaps (bool, optional): Flag to visualize predicted
+ heatmaps. If not provided, it defaults to False.
+ skeleton_style (str, optional): Skeleton style selection. Valid
+ options are 'mmpose' and 'openpose'. Defaults to 'mmpose'.
+ """
+ self.model.test_cfg['output_heatmaps'] = draw_heatmap
+
+ if skeleton_style not in ['mmpose', 'openpose']:
+ raise ValueError('`skeleton_style` must be either \'mmpose\' '
+ 'or \'openpose\'')
+
+ if skeleton_style == 'openpose':
+ self.visualizer.set_dataset_meta(self.model.dataset_meta,
+ skeleton_style)
+
+ def preprocess_single(self,
+ input: InputType,
+ index: int,
+ bbox_thr: float = 0.3,
+ nms_thr: float = 0.3,
+ bboxes: Union[List[List], List[np.ndarray],
+ np.ndarray] = []):
+ """Process a single input into a model-feedable format.
+
+ Args:
+ input (InputType): Input given by user.
+ index (int): index of the input
+ bbox_thr (float): threshold for bounding box detection.
+ Defaults to 0.3.
+ nms_thr (float): IoU threshold for bounding box NMS.
+ Defaults to 0.3.
+
+ Yields:
+ Any: Data processed by the ``pipeline`` and ``collate_fn``.
+ """
+
+ if isinstance(input, str):
+ data_info = dict(img_path=input)
+ else:
+ data_info = dict(img=input, img_path=f'{index}.jpg'.rjust(10, '0'))
+ data_info.update(self.model.dataset_meta)
+
+ if self.cfg.data_mode == 'topdown':
+ if self.detector is not None:
+ det_results = self.detector(
+ input, return_datasample=True)['predictions']
+ pred_instance = det_results[0].pred_instances.cpu().numpy()
+ bboxes = np.concatenate(
+ (pred_instance.bboxes, pred_instance.scores[:, None]),
+ axis=1)
+
+ label_mask = np.zeros(len(bboxes), dtype=np.uint8)
+ for cat_id in self.det_cat_ids:
+ label_mask = np.logical_or(label_mask,
+ pred_instance.labels == cat_id)
+
+ bboxes = bboxes[np.logical_and(
+ label_mask, pred_instance.scores > bbox_thr)]
+ bboxes = bboxes[nms(bboxes, nms_thr)]
+
+ data_infos = []
+ if len(bboxes) > 0:
+ for bbox in bboxes:
+ inst = data_info.copy()
+ inst['bbox'] = bbox[None, :4]
+ inst['bbox_score'] = bbox[4:5]
+ data_infos.append(self.pipeline(inst))
+ else:
+ inst = data_info.copy()
+
+ # get bbox from the image size
+ if isinstance(input, str):
+ input = mmcv.imread(input)
+ h, w = input.shape[:2]
+
+ inst['bbox'] = np.array([[0, 0, w, h]], dtype=np.float32)
+ inst['bbox_score'] = np.ones(1, dtype=np.float32)
+ data_infos.append(self.pipeline(inst))
+
+ else: # bottom-up
+ data_infos = [self.pipeline(data_info)]
+
+ return data_infos
+
+ @torch.no_grad()
+ def forward(self,
+ inputs: Union[dict, tuple],
+ merge_results: bool = True,
+ bbox_thr: float = -1):
+ """Performs a forward pass through the model.
+
+ Args:
+ inputs (Union[dict, tuple]): The input data to be processed. Can
+ be either a dictionary or a tuple.
+ merge_results (bool, optional): Whether to merge data samples,
+ default to True. This is only applicable when the data_mode
+ is 'topdown'.
+ bbox_thr (float, optional): A threshold for the bounding box
+ scores. Bounding boxes with scores greater than this value
+ will be retained. Default value is -1 which retains all
+ bounding boxes.
+
+ Returns:
+ A list of data samples with prediction instances.
+ """
+ data_samples = self.model.test_step(inputs)
+ if self.cfg.data_mode == 'topdown' and merge_results:
+ data_samples = [merge_data_samples(data_samples)]
+ if bbox_thr > 0:
+ for ds in data_samples:
+ if 'bbox_scores' in ds.pred_instances:
+ ds.pred_instances = ds.pred_instances[
+ ds.pred_instances.bbox_scores > bbox_thr]
+ return data_samples
+
+ def __call__(
+ self,
+ inputs: InputsType,
+ return_datasample: bool = False,
+ batch_size: int = 1,
+ out_dir: Optional[str] = None,
+ **kwargs,
+ ) -> dict:
+ """Call the inferencer.
+
+ Args:
+ inputs (InputsType): Inputs for the inferencer.
+ return_datasample (bool): Whether to return results as
+ :obj:`BaseDataElement`. Defaults to False.
+ batch_size (int): Batch size. Defaults to 1.
+ out_dir (str, optional): directory to save visualization
+ results and predictions. Will be overoden if vis_out_dir or
+ pred_out_dir are given. Defaults to None
+ **kwargs: Key words arguments passed to :meth:`preprocess`,
+ :meth:`forward`, :meth:`visualize` and :meth:`postprocess`.
+ Each key in kwargs should be in the corresponding set of
+ ``preprocess_kwargs``, ``forward_kwargs``,
+ ``visualize_kwargs`` and ``postprocess_kwargs``.
+
+ Returns:
+ dict: Inference and visualization results.
+ """
+ if out_dir is not None:
+ if 'vis_out_dir' not in kwargs:
+ kwargs['vis_out_dir'] = f'{out_dir}/visualizations'
+ if 'pred_out_dir' not in kwargs:
+ kwargs['pred_out_dir'] = f'{out_dir}/predictions'
+
+ (
+ preprocess_kwargs,
+ forward_kwargs,
+ visualize_kwargs,
+ postprocess_kwargs,
+ ) = self._dispatch_kwargs(**kwargs)
+
+ self.update_model_visualizer_settings(**kwargs)
+
+ # preprocessing
+ if isinstance(inputs, str) and inputs.startswith('webcam'):
+ inputs = self._get_webcam_inputs(inputs)
+ batch_size = 1
+ if not visualize_kwargs.get('show', False):
+ warnings.warn('The display mode is closed when using webcam '
+ 'input. It will be turned on automatically.')
+ visualize_kwargs['show'] = True
+ else:
+ inputs = self._inputs_to_list(inputs)
+
+ forward_kwargs['bbox_thr'] = preprocess_kwargs.get('bbox_thr', -1)
+ inputs = self.preprocess(
+ inputs, batch_size=batch_size, **preprocess_kwargs)
+
+ preds = []
+
+ for proc_inputs, ori_inputs in inputs:
+ preds = self.forward(proc_inputs, **forward_kwargs)
+
+ visualization = self.visualize(ori_inputs, preds,
+ **visualize_kwargs)
+ results = self.postprocess(preds, visualization, return_datasample,
+ **postprocess_kwargs)
+ yield results
+
+ if self._video_input:
+ self._finalize_video_processing(
+ postprocess_kwargs.get('pred_out_dir', ''))
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/pose3d_inferencer.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/pose3d_inferencer.py
new file mode 100644
index 0000000000000000000000000000000000000000..45099b1a28bd1bbbdddc0d5d39b01f24d54f087a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/pose3d_inferencer.py
@@ -0,0 +1,523 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os
+import warnings
+from collections import defaultdict
+from functools import partial
+from typing import Callable, Dict, List, Optional, Sequence, Tuple, Union
+
+import cv2
+import mmcv
+import numpy as np
+import torch
+from mmengine.config import Config, ConfigDict
+from mmengine.fileio import join_path
+from mmengine.infer.infer import ModelType
+from mmengine.model import revert_sync_batchnorm
+from mmengine.registry import init_default_scope
+from mmengine.structures import InstanceData
+from mmengine.utils import mkdir_or_exist
+
+from mmpose.apis import (_track_by_iou, _track_by_oks, collate_pose_sequence,
+ convert_keypoint_definition, extract_pose_sequence)
+from mmpose.registry import INFERENCERS
+from mmpose.structures import PoseDataSample, merge_data_samples
+from .base_mmpose_inferencer import BaseMMPoseInferencer
+from .pose2d_inferencer import Pose2DInferencer
+
+InstanceList = List[InstanceData]
+InputType = Union[str, np.ndarray]
+InputsType = Union[InputType, Sequence[InputType]]
+PredType = Union[InstanceData, InstanceList]
+ImgType = Union[np.ndarray, Sequence[np.ndarray]]
+ConfigType = Union[Config, ConfigDict]
+ResType = Union[Dict, List[Dict], InstanceData, List[InstanceData]]
+
+
+@INFERENCERS.register_module(name='pose-estimation-3d')
+@INFERENCERS.register_module()
+class Pose3DInferencer(BaseMMPoseInferencer):
+ """The inferencer for 3D pose estimation.
+
+ Args:
+ model (str, optional): Pretrained 2D pose estimation algorithm.
+ It's the path to the config file or the model name defined in
+ metafile. For example, it could be:
+
+ - model alias, e.g. ``'body'``,
+ - config name, e.g. ``'simcc_res50_8xb64-210e_coco-256x192'``,
+ - config path
+
+ Defaults to ``None``.
+ weights (str, optional): Path to the checkpoint. If it is not
+ specified and "model" is a model name of metafile, the weights
+ will be loaded from metafile. Defaults to None.
+ device (str, optional): Device to run inference. If None, the
+ available device will be automatically used. Defaults to None.
+ scope (str, optional): The scope of the model. Defaults to "mmpose".
+ det_model (str, optional): Config path or alias of detection model.
+ Defaults to None.
+ det_weights (str, optional): Path to the checkpoints of detection
+ model. Defaults to None.
+ det_cat_ids (int or list[int], optional): Category id for
+ detection model. Defaults to None.
+ output_heatmaps (bool, optional): Flag to visualize predicted
+ heatmaps. If set to None, the default setting from the model
+ config will be used. Default is None.
+ """
+
+ preprocess_kwargs: set = {
+ 'bbox_thr', 'nms_thr', 'bboxes', 'use_oks_tracking', 'tracking_thr',
+ 'norm_pose_2d'
+ }
+ forward_kwargs: set = {'rebase_keypoint_height'}
+ visualize_kwargs: set = {
+ 'return_vis',
+ 'show',
+ 'wait_time',
+ 'draw_bbox',
+ 'radius',
+ 'thickness',
+ 'kpt_thr',
+ 'vis_out_dir',
+ }
+ postprocess_kwargs: set = {'pred_out_dir'}
+
+ def __init__(self,
+ model: Union[ModelType, str],
+ weights: Optional[str] = None,
+ pose2d_model: Optional[Union[ModelType, str]] = None,
+ pose2d_weights: Optional[str] = None,
+ device: Optional[str] = None,
+ scope: Optional[str] = 'mmpose',
+ det_model: Optional[Union[ModelType, str]] = None,
+ det_weights: Optional[str] = None,
+ det_cat_ids: Optional[Union[int, Tuple]] = None) -> None:
+
+ init_default_scope(scope)
+ super().__init__(
+ model=model, weights=weights, device=device, scope=scope)
+ self.model = revert_sync_batchnorm(self.model)
+
+ # assign dataset metainfo to self.visualizer
+ self.visualizer.set_dataset_meta(self.model.dataset_meta)
+
+ # initialize 2d pose estimator
+ self.pose2d_model = Pose2DInferencer(
+ pose2d_model if pose2d_model else 'human', pose2d_weights, device,
+ scope, det_model, det_weights, det_cat_ids)
+
+ # helper functions
+ self._keypoint_converter = partial(
+ convert_keypoint_definition,
+ pose_det_dataset=self.pose2d_model.cfg.test_dataloader.
+ dataset['type'],
+ pose_lift_dataset=self.cfg.test_dataloader.dataset['type'],
+ )
+
+ self._pose_seq_extractor = partial(
+ extract_pose_sequence,
+ causal=self.cfg.test_dataloader.dataset.get('causal', False),
+ seq_len=self.cfg.test_dataloader.dataset.get('seq_len', 1),
+ step=self.cfg.test_dataloader.dataset.get('seq_step', 1))
+
+ self._video_input = False
+ self._buffer = defaultdict(list)
+
+ def preprocess_single(self,
+ input: InputType,
+ index: int,
+ bbox_thr: float = 0.3,
+ nms_thr: float = 0.3,
+ bboxes: Union[List[List], List[np.ndarray],
+ np.ndarray] = [],
+ use_oks_tracking: bool = False,
+ tracking_thr: float = 0.3,
+ norm_pose_2d: bool = False):
+ """Process a single input into a model-feedable format.
+
+ Args:
+ input (InputType): The input provided by the user.
+ index (int): The index of the input.
+ bbox_thr (float, optional): The threshold for bounding box
+ detection. Defaults to 0.3.
+ nms_thr (float, optional): The Intersection over Union (IoU)
+ threshold for bounding box Non-Maximum Suppression (NMS).
+ Defaults to 0.3.
+ bboxes (Union[List[List], List[np.ndarray], np.ndarray]):
+ The bounding boxes to use. Defaults to [].
+ use_oks_tracking (bool, optional): A flag that indicates
+ whether OKS-based tracking should be used. Defaults to False.
+ tracking_thr (float, optional): The threshold for tracking.
+ Defaults to 0.3.
+ norm_pose_2d (bool, optional): A flag that indicates whether 2D
+ pose normalization should be used. Defaults to False.
+
+ Yields:
+ Any: The data processed by the pipeline and collate_fn.
+
+ This method first calculates 2D keypoints using the provided
+ pose2d_model. The method also performs instance matching, which
+ can use either OKS-based tracking or IOU-based tracking.
+ """
+
+ # calculate 2d keypoints
+ results_pose2d = next(
+ self.pose2d_model(
+ input,
+ bbox_thr=bbox_thr,
+ nms_thr=nms_thr,
+ bboxes=bboxes,
+ merge_results=False,
+ return_datasample=True))['predictions']
+
+ for ds in results_pose2d:
+ ds.pred_instances.set_field(
+ (ds.pred_instances.bboxes[..., 2:] -
+ ds.pred_instances.bboxes[..., :2]).prod(-1), 'areas')
+
+ if not self._video_input:
+ height, width = results_pose2d[0].metainfo['ori_shape']
+
+ # Clear the buffer if inputs are individual images to prevent
+ # carryover effects from previous images
+ self._buffer.clear()
+
+ else:
+ height = self.video_info['height']
+ width = self.video_info['width']
+ img_path = results_pose2d[0].metainfo['img_path']
+
+ # instance matching
+ if use_oks_tracking:
+ _track = partial(_track_by_oks)
+ else:
+ _track = _track_by_iou
+
+ for result in results_pose2d:
+ track_id, self._buffer['results_pose2d_last'], _ = _track(
+ result, self._buffer['results_pose2d_last'], tracking_thr)
+ if track_id == -1:
+ pred_instances = result.pred_instances.cpu().numpy()
+ keypoints = pred_instances.keypoints
+ if np.count_nonzero(keypoints[:, :, 1]) >= 3:
+ next_id = self._buffer.get('next_id', 0)
+ result.set_field(next_id, 'track_id')
+ self._buffer['next_id'] = next_id + 1
+ else:
+ # If the number of keypoints detected is small,
+ # delete that person instance.
+ result.pred_instances.keypoints[..., 1] = -10
+ result.pred_instances.bboxes *= 0
+ result.set_field(-1, 'track_id')
+ else:
+ result.set_field(track_id, 'track_id')
+ self._buffer['pose2d_results'] = merge_data_samples(results_pose2d)
+
+ # convert keypoints
+ results_pose2d_converted = [ds.cpu().numpy() for ds in results_pose2d]
+ for ds in results_pose2d_converted:
+ ds.pred_instances.keypoints = self._keypoint_converter(
+ ds.pred_instances.keypoints)
+ self._buffer['pose_est_results_list'].append(results_pose2d_converted)
+
+ # extract and pad input pose2d sequence
+ pose_results_2d = self._pose_seq_extractor(
+ self._buffer['pose_est_results_list'],
+ frame_idx=index if self._video_input else 0)
+ causal = self.cfg.test_dataloader.dataset.get('causal', False)
+ target_idx = -1 if causal else len(pose_results_2d) // 2
+
+ stats_info = self.model.dataset_meta.get('stats_info', {})
+ bbox_center = stats_info.get('bbox_center', None)
+ bbox_scale = stats_info.get('bbox_scale', None)
+
+ for i, pose_res in enumerate(pose_results_2d):
+ for j, data_sample in enumerate(pose_res):
+ kpts = data_sample.pred_instances.keypoints
+ bboxes = data_sample.pred_instances.bboxes
+ keypoints = []
+ for k in range(len(kpts)):
+ kpt = kpts[k]
+ if norm_pose_2d:
+ bbox = bboxes[k]
+ center = np.array([[(bbox[0] + bbox[2]) / 2,
+ (bbox[1] + bbox[3]) / 2]])
+ scale = max(bbox[2] - bbox[0], bbox[3] - bbox[1])
+ keypoints.append((kpt[:, :2] - center) / scale *
+ bbox_scale + bbox_center)
+ else:
+ keypoints.append(kpt[:, :2])
+ pose_results_2d[i][j].pred_instances.keypoints = np.array(
+ keypoints)
+ pose_sequences_2d = collate_pose_sequence(pose_results_2d, True,
+ target_idx)
+ if not pose_sequences_2d:
+ return []
+
+ data_list = []
+ for i, pose_seq in enumerate(pose_sequences_2d):
+ data_info = dict()
+
+ keypoints_2d = pose_seq.pred_instances.keypoints
+ keypoints_2d = np.squeeze(
+ keypoints_2d,
+ axis=0) if keypoints_2d.ndim == 4 else keypoints_2d
+
+ T, K, C = keypoints_2d.shape
+
+ data_info['keypoints'] = keypoints_2d
+ data_info['keypoints_visible'] = np.ones((
+ T,
+ K,
+ ),
+ dtype=np.float32)
+ data_info['lifting_target'] = np.zeros((K, 3), dtype=np.float32)
+ data_info['lifting_target_visible'] = np.ones((K, 1),
+ dtype=np.float32)
+ data_info['camera_param'] = dict(w=width, h=height)
+
+ data_info.update(self.model.dataset_meta)
+ data_info = self.pipeline(data_info)
+ data_info['data_samples'].set_field(
+ img_path, 'img_path', field_type='metainfo')
+ data_list.append(data_info)
+
+ return data_list
+
+ @torch.no_grad()
+ def forward(self,
+ inputs: Union[dict, tuple],
+ rebase_keypoint_height: bool = False):
+ """Perform forward pass through the model and process the results.
+
+ Args:
+ inputs (Union[dict, tuple]): The inputs for the model.
+ rebase_keypoint_height (bool, optional): Flag to rebase the
+ height of the keypoints (z-axis). Defaults to False.
+
+ Returns:
+ list: A list of data samples, each containing the model's output
+ results.
+ """
+
+ pose_lift_results = self.model.test_step(inputs)
+
+ # Post-processing of pose estimation results
+ pose_est_results_converted = self._buffer['pose_est_results_list'][-1]
+ for idx, pose_lift_res in enumerate(pose_lift_results):
+ # Update track_id from the pose estimation results
+ pose_lift_res.track_id = pose_est_results_converted[idx].get(
+ 'track_id', 1e4)
+
+ # Invert x and z values of the keypoints
+ keypoints = pose_lift_res.pred_instances.keypoints
+ keypoints = keypoints[..., [0, 2, 1]]
+ keypoints[..., 0] = -keypoints[..., 0]
+ keypoints[..., 2] = -keypoints[..., 2]
+
+ # If rebase_keypoint_height is True, adjust z-axis values
+ if rebase_keypoint_height:
+ keypoints[..., 2] -= np.min(
+ keypoints[..., 2], axis=-1, keepdims=True)
+
+ pose_lift_results[idx].pred_instances.keypoints = keypoints
+
+ pose_lift_results = sorted(
+ pose_lift_results, key=lambda x: x.get('track_id', 1e4))
+
+ data_samples = [merge_data_samples(pose_lift_results)]
+ return data_samples
+
+ def __call__(
+ self,
+ inputs: InputsType,
+ return_datasample: bool = False,
+ batch_size: int = 1,
+ out_dir: Optional[str] = None,
+ **kwargs,
+ ) -> dict:
+ """Call the inferencer.
+
+ Args:
+ inputs (InputsType): Inputs for the inferencer.
+ return_datasample (bool): Whether to return results as
+ :obj:`BaseDataElement`. Defaults to False.
+ batch_size (int): Batch size. Defaults to 1.
+ out_dir (str, optional): directory to save visualization
+ results and predictions. Will be overoden if vis_out_dir or
+ pred_out_dir are given. Defaults to None
+ **kwargs: Key words arguments passed to :meth:`preprocess`,
+ :meth:`forward`, :meth:`visualize` and :meth:`postprocess`.
+ Each key in kwargs should be in the corresponding set of
+ ``preprocess_kwargs``, ``forward_kwargs``,
+ ``visualize_kwargs`` and ``postprocess_kwargs``.
+
+ Returns:
+ dict: Inference and visualization results.
+ """
+ if out_dir is not None:
+ if 'vis_out_dir' not in kwargs:
+ kwargs['vis_out_dir'] = f'{out_dir}/visualizations'
+ if 'pred_out_dir' not in kwargs:
+ kwargs['pred_out_dir'] = f'{out_dir}/predictions'
+
+ (
+ preprocess_kwargs,
+ forward_kwargs,
+ visualize_kwargs,
+ postprocess_kwargs,
+ ) = self._dispatch_kwargs(**kwargs)
+
+ self.update_model_visualizer_settings(**kwargs)
+
+ # preprocessing
+ if isinstance(inputs, str) and inputs.startswith('webcam'):
+ inputs = self._get_webcam_inputs(inputs)
+ batch_size = 1
+ if not visualize_kwargs.get('show', False):
+ warnings.warn('The display mode is closed when using webcam '
+ 'input. It will be turned on automatically.')
+ visualize_kwargs['show'] = True
+ else:
+ inputs = self._inputs_to_list(inputs)
+
+ inputs = self.preprocess(
+ inputs, batch_size=batch_size, **preprocess_kwargs)
+
+ preds = []
+
+ for proc_inputs, ori_inputs in inputs:
+ preds = self.forward(proc_inputs, **forward_kwargs)
+
+ visualization = self.visualize(ori_inputs, preds,
+ **visualize_kwargs)
+ results = self.postprocess(preds, visualization, return_datasample,
+ **postprocess_kwargs)
+ yield results
+
+ if self._video_input:
+ self._finalize_video_processing(
+ postprocess_kwargs.get('pred_out_dir', ''))
+ self._buffer.clear()
+
+ def visualize(self,
+ inputs: list,
+ preds: List[PoseDataSample],
+ return_vis: bool = False,
+ show: bool = False,
+ draw_bbox: bool = False,
+ wait_time: float = 0,
+ radius: int = 3,
+ thickness: int = 1,
+ kpt_thr: float = 0.3,
+ vis_out_dir: str = '',
+ window_name: str = '',
+ window_close_event_handler: Optional[Callable] = None
+ ) -> List[np.ndarray]:
+ """Visualize predictions.
+
+ Args:
+ inputs (list): Inputs preprocessed by :meth:`_inputs_to_list`.
+ preds (Any): Predictions of the model.
+ return_vis (bool): Whether to return images with predicted results.
+ show (bool): Whether to display the image in a popup window.
+ Defaults to False.
+ wait_time (float): The interval of show (ms). Defaults to 0
+ draw_bbox (bool): Whether to draw the bounding boxes.
+ Defaults to False
+ radius (int): Keypoint radius for visualization. Defaults to 3
+ thickness (int): Link thickness for visualization. Defaults to 1
+ kpt_thr (float): The threshold to visualize the keypoints.
+ Defaults to 0.3
+ vis_out_dir (str, optional): Directory to save visualization
+ results w/o predictions. If left as empty, no file will
+ be saved. Defaults to ''.
+ window_name (str, optional): Title of display window.
+ window_close_event_handler (callable, optional):
+
+ Returns:
+ List[np.ndarray]: Visualization results.
+ """
+ if (not return_vis) and (not show) and (not vis_out_dir):
+ return
+
+ if getattr(self, 'visualizer', None) is None:
+ raise ValueError('Visualization needs the "visualizer" term'
+ 'defined in the config, but got None.')
+
+ self.visualizer.radius = radius
+ self.visualizer.line_width = thickness
+ det_kpt_color = self.pose2d_model.visualizer.kpt_color
+ det_dataset_skeleton = self.pose2d_model.visualizer.skeleton
+ det_dataset_link_color = self.pose2d_model.visualizer.link_color
+ self.visualizer.det_kpt_color = det_kpt_color
+ self.visualizer.det_dataset_skeleton = det_dataset_skeleton
+ self.visualizer.det_dataset_link_color = det_dataset_link_color
+
+ results = []
+
+ for single_input, pred in zip(inputs, preds):
+ if isinstance(single_input, str):
+ img = mmcv.imread(single_input, channel_order='rgb')
+ elif isinstance(single_input, np.ndarray):
+ img = mmcv.bgr2rgb(single_input)
+ else:
+ raise ValueError('Unsupported input type: '
+ f'{type(single_input)}')
+
+ # since visualization and inference utilize the same process,
+ # the wait time is reduced when a video input is utilized,
+ # thereby eliminating the issue of inference getting stuck.
+ wait_time = 1e-5 if self._video_input else wait_time
+
+ visualization = self.visualizer.add_datasample(
+ window_name,
+ img,
+ data_sample=pred,
+ det_data_sample=self._buffer['pose2d_results'],
+ draw_gt=False,
+ draw_bbox=draw_bbox,
+ show=show,
+ wait_time=wait_time,
+ kpt_thr=kpt_thr)
+ results.append(visualization)
+
+ if vis_out_dir:
+ out_img = mmcv.rgb2bgr(visualization)
+ _, file_extension = os.path.splitext(vis_out_dir)
+ if file_extension:
+ dir_name = os.path.dirname(vis_out_dir)
+ file_name = os.path.basename(vis_out_dir)
+ else:
+ dir_name = vis_out_dir
+ file_name = None
+ mkdir_or_exist(dir_name)
+
+ if self._video_input:
+
+ if self.video_info['writer'] is None:
+ fourcc = cv2.VideoWriter_fourcc(*'mp4v')
+ if file_name is None:
+ file_name = os.path.basename(
+ self.video_info['name'])
+ out_file = join_path(dir_name, file_name)
+ self.video_info['writer'] = cv2.VideoWriter(
+ out_file, fourcc, self.video_info['fps'],
+ (visualization.shape[1], visualization.shape[0]))
+ self.video_info['writer'].write(out_img)
+
+ else:
+ img_name = os.path.basename(pred.metainfo['img_path'])
+ file_name = file_name if file_name else img_name
+ out_file = join_path(dir_name, file_name)
+ mmcv.imwrite(out_img, out_file)
+
+ if return_vis:
+ return results
+ else:
+ return []
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/utils/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/utils/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..54e98e672107735223ba0eec0d77427c925c9b26
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/utils/__init__.py
@@ -0,0 +1,10 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .default_det_models import default_det_models
+from .get_model_alias import get_model_aliases
+
+__all__ = ['default_det_models', 'get_model_aliases']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/utils/default_det_models.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/utils/default_det_models.py
new file mode 100644
index 0000000000000000000000000000000000000000..fa75e47e963105e6b77653531faca81e8e6149e9
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/utils/default_det_models.py
@@ -0,0 +1,36 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+
+from mmengine.config.utils import MODULE2PACKAGE
+from mmengine.utils import get_installed_path
+
+mmpose_path = get_installed_path(MODULE2PACKAGE['mmpose'])
+
+default_det_models = dict(
+ human=dict(model='rtmdet-m', weights=None, cat_ids=(0, )),
+ face=dict(
+ model=osp.join(mmpose_path, '.mim',
+ 'demo/mmdetection_cfg/yolox-s_8xb8-300e_coco-face.py'),
+ weights='https://download.openmmlab.com/mmpose/mmdet_pretrained/'
+ 'yolo-x_8xb8-300e_coco-face_13274d7c.pth',
+ cat_ids=(0, )),
+ hand=dict(
+ model=osp.join(
+ mmpose_path, '.mim', 'demo/mmdetection_cfg/'
+ 'ssdlite_mobilenetv2_scratch_600e_onehand.py'),
+ weights='https://download.openmmlab.com/mmpose/mmdet_pretrained/'
+ 'ssdlite_mobilenetv2_scratch_600e_onehand-4f9f8686_20220523.pth',
+ cat_ids=(0, )),
+ animal=dict(
+ model='rtmdet-m',
+ weights=None,
+ cat_ids=(15, 16, 17, 18, 19, 20, 21, 22, 23)),
+)
+
+default_det_models['body'] = default_det_models['human']
+default_det_models['wholebody'] = default_det_models['human']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/utils/get_model_alias.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/utils/get_model_alias.py
new file mode 100644
index 0000000000000000000000000000000000000000..00127843ec1982f672b7bacaf97b64cfadadded3
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/apis/inferencers/utils/get_model_alias.py
@@ -0,0 +1,42 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Dict
+
+from mmengine.infer import BaseInferencer
+
+
+def get_model_aliases(scope: str = 'mmpose') -> Dict[str, str]:
+ """Retrieve model aliases and their corresponding configuration names.
+
+ Args:
+ scope (str, optional): The scope for the model aliases. Defaults
+ to 'mmpose'.
+
+ Returns:
+ Dict[str, str]: A dictionary containing model aliases as keys and
+ their corresponding configuration names as values.
+ """
+
+ # Get a list of model configurations from the metafile
+ repo_or_mim_dir = BaseInferencer._get_repo_or_mim_dir(scope)
+ model_cfgs = BaseInferencer._get_models_from_metafile(repo_or_mim_dir)
+
+ model_alias_dict = dict()
+ for model_cfg in model_cfgs:
+ if 'Alias' in model_cfg:
+ if isinstance(model_cfg['Alias'], str):
+ model_alias_dict[model_cfg['Alias']] = model_cfg['Name']
+ elif isinstance(model_cfg['Alias'], list):
+ for alias in model_cfg['Alias']:
+ model_alias_dict[alias] = model_cfg['Name']
+ else:
+ raise ValueError(
+ 'encounter an unexpected alias type. Please raise an '
+ 'issue at https://github.com/open-mmlab/mmpose/issues '
+ 'to announce us')
+
+ return model_alias_dict
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..543620617abedece4354b80e5a77900677cf263d
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__init__.py
@@ -0,0 +1,23 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .associative_embedding import AssociativeEmbedding
+from .decoupled_heatmap import DecoupledHeatmap
+from .image_pose_lifting import ImagePoseLifting
+from .integral_regression_label import IntegralRegressionLabel
+from .megvii_heatmap import MegviiHeatmap
+from .msra_heatmap import MSRAHeatmap
+from .regression_label import RegressionLabel
+from .simcc_label import SimCCLabel
+from .spr import SPR
+from .udp_heatmap import UDPHeatmap
+from .video_pose_lifting import VideoPoseLifting
+
+__all__ = [
+ 'MSRAHeatmap', 'MegviiHeatmap', 'UDPHeatmap', 'RegressionLabel',
+ 'SimCCLabel', 'IntegralRegressionLabel', 'AssociativeEmbedding', 'SPR',
+ 'DecoupledHeatmap', 'VideoPoseLifting', 'ImagePoseLifting',
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7fddd87bc7c574185106868d6204116d3efae8d1
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/associative_embedding.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/associative_embedding.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cf9b8d85edb1f9c0d4ecbab503f5e13c13260ced
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/associative_embedding.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/base.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/base.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4690219a95325d67d21a67d9f2bbe892350fe783
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/base.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/decoupled_heatmap.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/decoupled_heatmap.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5b74fba9724984b8776051527f6df42ca50c894e
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/decoupled_heatmap.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/image_pose_lifting.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/image_pose_lifting.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..809582ab88c07d92dd5a056743274099422a2b47
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/image_pose_lifting.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/integral_regression_label.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/integral_regression_label.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..782f96823818692ef3456aacd8a38a23c2ad366e
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/integral_regression_label.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/megvii_heatmap.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/megvii_heatmap.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5ce17dd9511f5ba969b37acda0525465dabdacb2
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/megvii_heatmap.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/msra_heatmap.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/msra_heatmap.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..dcd1e1583232bd782864d8225713af72c13c9f3b
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/msra_heatmap.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/regression_label.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/regression_label.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9678171a6c7a816291bef4913b2f893a4c41f2de
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/regression_label.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/simcc_label.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/simcc_label.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cf9235aa73daf623e4daa90f9c7f5135a9807e93
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/simcc_label.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/spr.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/spr.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3361bcc1736784dde1b704d229c5a091e46dd32c
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/spr.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/udp_heatmap.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/udp_heatmap.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..232e0cc94973b9313d0cd9b9465f68b22bac8aba
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/udp_heatmap.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/video_pose_lifting.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/video_pose_lifting.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cbb9bfbde530fd292e01d3cc0aa99cadc0078d70
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/__pycache__/video_pose_lifting.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/associative_embedding.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/associative_embedding.py
new file mode 100644
index 0000000000000000000000000000000000000000..f7ec253c046f97a87009bfae55255189684f1f5d
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/associative_embedding.py
@@ -0,0 +1,517 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from collections import namedtuple
+from itertools import product
+from typing import Any, List, Optional, Tuple
+
+import numpy as np
+import torch
+from munkres import Munkres
+from torch import Tensor
+
+from mmpose.registry import KEYPOINT_CODECS
+from mmpose.utils.tensor_utils import to_numpy
+from .base import BaseKeypointCodec
+from .utils import (batch_heatmap_nms, generate_gaussian_heatmaps,
+ generate_udp_gaussian_heatmaps, refine_keypoints,
+ refine_keypoints_dark_udp)
+
+
+def _group_keypoints_by_tags(vals: np.ndarray,
+ tags: np.ndarray,
+ locs: np.ndarray,
+ keypoint_order: List[int],
+ val_thr: float,
+ tag_thr: float = 1.0,
+ max_groups: Optional[int] = None) -> np.ndarray:
+ """Group the keypoints by tags using Munkres algorithm.
+
+ Note:
+
+ - keypoint number: K
+ - candidate number: M
+ - tag dimenssion: L
+ - coordinate dimension: D
+ - group number: G
+
+ Args:
+ vals (np.ndarray): The heatmap response values of keypoints in shape
+ (K, M)
+ tags (np.ndarray): The tags of the keypoint candidates in shape
+ (K, M, L)
+ locs (np.ndarray): The locations of the keypoint candidates in shape
+ (K, M, D)
+ keypoint_order (List[int]): The grouping order of the keypoints.
+ The groupping usually starts from a keypoints around the head and
+ torso, and gruadually moves out to the limbs
+ val_thr (float): The threshold of the keypoint response value
+ tag_thr (float): The maximum allowed tag distance when matching a
+ keypoint to a group. A keypoint with larger tag distance to any
+ of the existing groups will initializes a new group
+ max_groups (int, optional): The maximum group number. ``None`` means
+ no limitation. Defaults to ``None``
+
+ Returns:
+ np.ndarray: grouped keypoints in shape (G, K, D+1), where the last
+ dimenssion is the concatenated keypoint coordinates and scores.
+ """
+ K, M, D = locs.shape
+ assert vals.shape == tags.shape[:2] == (K, M)
+ assert len(keypoint_order) == K
+
+ # Build Munkres instance
+ munkres = Munkres()
+
+ # Build a group pool, each group contains the keypoints of an instance
+ groups = []
+
+ Group = namedtuple('Group', field_names=['kpts', 'scores', 'tag_list'])
+
+ def _init_group():
+ """Initialize a group, which is composed of the keypoints, keypoint
+ scores and the tag of each keypoint."""
+ _group = Group(
+ kpts=np.zeros((K, D), dtype=np.float32),
+ scores=np.zeros(K, dtype=np.float32),
+ tag_list=[])
+ return _group
+
+ for i in keypoint_order:
+ # Get all valid candidate of the i-th keypoints
+ valid = vals[i] > val_thr
+ if not valid.any():
+ continue
+
+ tags_i = tags[i, valid] # (M', L)
+ vals_i = vals[i, valid] # (M',)
+ locs_i = locs[i, valid] # (M', D)
+
+ if len(groups) == 0: # Initialize the group pool
+ for tag, val, loc in zip(tags_i, vals_i, locs_i):
+ group = _init_group()
+ group.kpts[i] = loc
+ group.scores[i] = val
+ group.tag_list.append(tag)
+
+ groups.append(group)
+
+ else: # Match keypoints to existing groups
+ groups = groups[:max_groups]
+ group_tags = [np.mean(g.tag_list, axis=0) for g in groups]
+
+ # Calculate distance matrix between group tags and tag candidates
+ # of the i-th keypoint
+ # Shape: (M', 1, L) , (1, G, L) -> (M', G, L)
+ diff = tags_i[:, None] - np.array(group_tags)[None]
+ dists = np.linalg.norm(diff, ord=2, axis=2)
+ num_kpts, num_groups = dists.shape[:2]
+
+ # Experimental cost function for keypoint-group matching
+ costs = np.round(dists) * 100 - vals_i[..., None]
+ if num_kpts > num_groups:
+ padding = np.full((num_kpts, num_kpts - num_groups),
+ 1e10,
+ dtype=np.float32)
+ costs = np.concatenate((costs, padding), axis=1)
+
+ # Match keypoints and groups by Munkres algorithm
+ matches = munkres.compute(costs)
+ for kpt_idx, group_idx in matches:
+ if group_idx < num_groups and dists[kpt_idx,
+ group_idx] < tag_thr:
+ # Add the keypoint to the matched group
+ group = groups[group_idx]
+ else:
+ # Initialize a new group with unmatched keypoint
+ group = _init_group()
+ groups.append(group)
+
+ group.kpts[i] = locs_i[kpt_idx]
+ group.scores[i] = vals_i[kpt_idx]
+ group.tag_list.append(tags_i[kpt_idx])
+
+ groups = groups[:max_groups]
+ if groups:
+ grouped_keypoints = np.stack(
+ [np.r_['1', g.kpts, g.scores[:, None]] for g in groups])
+ else:
+ grouped_keypoints = np.empty((0, K, D + 1))
+
+ return grouped_keypoints
+
+
+@KEYPOINT_CODECS.register_module()
+class AssociativeEmbedding(BaseKeypointCodec):
+ """Encode/decode keypoints with the method introduced in "Associative
+ Embedding". This is an asymmetric codec, where the keypoints are
+ represented as gaussian heatmaps and position indices during encoding, and
+ restored from predicted heatmaps and group tags.
+
+ See the paper `Associative Embedding: End-to-End Learning for Joint
+ Detection and Grouping`_ by Newell et al (2017) for details
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+ - embedding tag dimension: L
+ - image size: [w, h]
+ - heatmap size: [W, H]
+
+ Encoded:
+
+ - heatmaps (np.ndarray): The generated heatmap in shape (K, H, W)
+ where [W, H] is the `heatmap_size`
+ - keypoint_indices (np.ndarray): The keypoint position indices in shape
+ (N, K, 2). Each keypoint's index is [i, v], where i is the position
+ index in the heatmap (:math:`i=y*w+x`) and v is the visibility
+ - keypoint_weights (np.ndarray): The target weights in shape (N, K)
+
+ Args:
+ input_size (tuple): Image size in [w, h]
+ heatmap_size (tuple): Heatmap size in [W, H]
+ sigma (float): The sigma value of the Gaussian heatmap
+ use_udp (bool): Whether use unbiased data processing. See
+ `UDP (CVPR 2020)`_ for details. Defaults to ``False``
+ decode_keypoint_order (List[int]): The grouping order of the
+ keypoint indices. The groupping usually starts from a keypoints
+ around the head and torso, and gruadually moves out to the limbs
+ decode_keypoint_thr (float): The threshold of keypoint response value
+ in heatmaps. Defaults to 0.1
+ decode_tag_thr (float): The maximum allowed tag distance when matching
+ a keypoint to a group. A keypoint with larger tag distance to any
+ of the existing groups will initializes a new group. Defaults to
+ 1.0
+ decode_nms_kernel (int): The kernel size of the NMS during decoding,
+ which should be an odd integer. Defaults to 5
+ decode_gaussian_kernel (int): The kernel size of the Gaussian blur
+ during decoding, which should be an odd integer. It is only used
+ when ``self.use_udp==True``. Defaults to 3
+ decode_topk (int): The number top-k candidates of each keypoints that
+ will be retrieved from the heatmaps during dedocding. Defaults to
+ 20
+ decode_max_instances (int, optional): The maximum number of instances
+ to decode. ``None`` means no limitation to the instance number.
+ Defaults to ``None``
+
+ .. _`Associative Embedding: End-to-End Learning for Joint Detection and
+ Grouping`: https://arxiv.org/abs/1611.05424
+ .. _`UDP (CVPR 2020)`: https://arxiv.org/abs/1911.07524
+ """
+
+ def __init__(
+ self,
+ input_size: Tuple[int, int],
+ heatmap_size: Tuple[int, int],
+ sigma: Optional[float] = None,
+ use_udp: bool = False,
+ decode_keypoint_order: List[int] = [],
+ decode_nms_kernel: int = 5,
+ decode_gaussian_kernel: int = 3,
+ decode_keypoint_thr: float = 0.1,
+ decode_tag_thr: float = 1.0,
+ decode_topk: int = 20,
+ decode_max_instances: Optional[int] = None,
+ ) -> None:
+ super().__init__()
+ self.input_size = input_size
+ self.heatmap_size = heatmap_size
+ self.use_udp = use_udp
+ self.decode_nms_kernel = decode_nms_kernel
+ self.decode_gaussian_kernel = decode_gaussian_kernel
+ self.decode_keypoint_thr = decode_keypoint_thr
+ self.decode_tag_thr = decode_tag_thr
+ self.decode_topk = decode_topk
+ self.decode_max_instances = decode_max_instances
+ self.dedecode_keypoint_order = decode_keypoint_order.copy()
+
+ if self.use_udp:
+ self.scale_factor = ((np.array(input_size) - 1) /
+ (np.array(heatmap_size) - 1)).astype(
+ np.float32)
+ else:
+ self.scale_factor = (np.array(input_size) /
+ heatmap_size).astype(np.float32)
+
+ if sigma is None:
+ sigma = (heatmap_size[0] * heatmap_size[1])**0.5 / 64
+ self.sigma = sigma
+
+ def encode(
+ self,
+ keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None
+ ) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
+ """Encode keypoints into heatmaps and position indices. Note that the
+ original keypoint coordinates should be in the input image space.
+
+ Args:
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+
+ Returns:
+ dict:
+ - heatmaps (np.ndarray): The generated heatmap in shape
+ (K, H, W) where [W, H] is the `heatmap_size`
+ - keypoint_indices (np.ndarray): The keypoint position indices
+ in shape (N, K, 2). Each keypoint's index is [i, v], where i
+ is the position index in the heatmap (:math:`i=y*w+x`) and v
+ is the visibility
+ - keypoint_weights (np.ndarray): The target weights in shape
+ (N, K)
+ """
+
+ if keypoints_visible is None:
+ keypoints_visible = np.ones(keypoints.shape[:2], dtype=np.float32)
+
+ # keypoint coordinates in heatmap
+ _keypoints = keypoints / self.scale_factor
+
+ if self.use_udp:
+ heatmaps, keypoint_weights = generate_udp_gaussian_heatmaps(
+ heatmap_size=self.heatmap_size,
+ keypoints=_keypoints,
+ keypoints_visible=keypoints_visible,
+ sigma=self.sigma)
+ else:
+ heatmaps, keypoint_weights = generate_gaussian_heatmaps(
+ heatmap_size=self.heatmap_size,
+ keypoints=_keypoints,
+ keypoints_visible=keypoints_visible,
+ sigma=self.sigma)
+
+ keypoint_indices = self._encode_keypoint_indices(
+ heatmap_size=self.heatmap_size,
+ keypoints=_keypoints,
+ keypoints_visible=keypoints_visible)
+
+ encoded = dict(
+ heatmaps=heatmaps,
+ keypoint_indices=keypoint_indices,
+ keypoint_weights=keypoint_weights)
+
+ return encoded
+
+ def _encode_keypoint_indices(self, heatmap_size: Tuple[int, int],
+ keypoints: np.ndarray,
+ keypoints_visible: np.ndarray) -> np.ndarray:
+ w, h = heatmap_size
+ N, K, _ = keypoints.shape
+ keypoint_indices = np.zeros((N, K, 2), dtype=np.int64)
+
+ for n, k in product(range(N), range(K)):
+ x, y = (keypoints[n, k] + 0.5).astype(np.int64)
+ index = y * w + x
+ vis = (keypoints_visible[n, k] > 0.5 and 0 <= x < w and 0 <= y < h)
+ keypoint_indices[n, k] = [index, vis]
+
+ return keypoint_indices
+
+ def decode(self, encoded: Any) -> Tuple[np.ndarray, np.ndarray]:
+ raise NotImplementedError()
+
+ def _get_batch_topk(self, batch_heatmaps: Tensor, batch_tags: Tensor,
+ k: int):
+ """Get top-k response values from the heatmaps and corresponding tag
+ values from the tagging heatmaps.
+
+ Args:
+ batch_heatmaps (Tensor): Keypoint detection heatmaps in shape
+ (B, K, H, W)
+ batch_tags (Tensor): Tagging heatmaps in shape (B, C, H, W), where
+ the tag dim C is 2*K when using flip testing, or K otherwise
+ k (int): The number of top responses to get
+
+ Returns:
+ tuple:
+ - topk_vals (Tensor): Top-k response values of each heatmap in
+ shape (B, K, Topk)
+ - topk_tags (Tensor): The corresponding embedding tags of the
+ top-k responses, in shape (B, K, Topk, L)
+ - topk_locs (Tensor): The location of the top-k responses in each
+ heatmap, in shape (B, K, Topk, 2) where last dimension
+ represents x and y coordinates
+ """
+ B, K, H, W = batch_heatmaps.shape
+ L = batch_tags.shape[1] // K
+
+ # shape of topk_val, top_indices: (B, K, TopK)
+ topk_vals, topk_indices = batch_heatmaps.flatten(-2, -1).topk(
+ k, dim=-1)
+
+ topk_tags_per_kpts = [
+ torch.gather(_tag, dim=2, index=topk_indices)
+ for _tag in torch.unbind(batch_tags.view(B, L, K, H * W), dim=1)
+ ]
+
+ topk_tags = torch.stack(topk_tags_per_kpts, dim=-1) # (B, K, TopK, L)
+ topk_locs = torch.stack([topk_indices % W, topk_indices // W],
+ dim=-1) # (B, K, TopK, 2)
+
+ return topk_vals, topk_tags, topk_locs
+
+ def _group_keypoints(self, batch_vals: np.ndarray, batch_tags: np.ndarray,
+ batch_locs: np.ndarray):
+ """Group keypoints into groups (each represents an instance) by tags.
+
+ Args:
+ batch_vals (Tensor): Heatmap response values of keypoint
+ candidates in shape (B, K, Topk)
+ batch_tags (Tensor): Tags of keypoint candidates in shape
+ (B, K, Topk, L)
+ batch_locs (Tensor): Locations of keypoint candidates in shape
+ (B, K, Topk, 2)
+
+ Returns:
+ List[np.ndarray]: Grouping results of a batch, each element is a
+ np.ndarray (in shape [N, K, D+1]) that contains the groups
+ detected in an image, including both keypoint coordinates and
+ scores.
+ """
+
+ def _group_func(inputs: Tuple):
+ vals, tags, locs = inputs
+ return _group_keypoints_by_tags(
+ vals,
+ tags,
+ locs,
+ keypoint_order=self.dedecode_keypoint_order,
+ val_thr=self.decode_keypoint_thr,
+ tag_thr=self.decode_tag_thr,
+ max_groups=self.decode_max_instances)
+
+ _results = map(_group_func, zip(batch_vals, batch_tags, batch_locs))
+ results = list(_results)
+ return results
+
+ def _fill_missing_keypoints(self, keypoints: np.ndarray,
+ keypoint_scores: np.ndarray,
+ heatmaps: np.ndarray, tags: np.ndarray):
+ """Fill the missing keypoints in the initial predictions.
+
+ Args:
+ keypoints (np.ndarray): Keypoint predictions in shape (N, K, D)
+ keypoint_scores (np.ndarray): Keypint score predictions in shape
+ (N, K), in which 0 means the corresponding keypoint is
+ missing in the initial prediction
+ heatmaps (np.ndarry): Heatmaps in shape (K, H, W)
+ tags (np.ndarray): Tagging heatmaps in shape (C, H, W) where
+ C=L*K
+
+ Returns:
+ tuple:
+ - keypoints (np.ndarray): Keypoint predictions with missing
+ ones filled
+ - keypoint_scores (np.ndarray): Keypoint score predictions with
+ missing ones filled
+ """
+
+ N, K = keypoints.shape[:2]
+ H, W = heatmaps.shape[1:]
+ L = tags.shape[0] // K
+ keypoint_tags = [tags[k::K] for k in range(K)]
+
+ for n in range(N):
+ # Calculate the instance tag (mean tag of detected keypoints)
+ _tag = []
+ for k in range(K):
+ if keypoint_scores[n, k] > 0:
+ x, y = keypoints[n, k, :2].astype(np.int64)
+ x = np.clip(x, 0, W - 1)
+ y = np.clip(y, 0, H - 1)
+ _tag.append(keypoint_tags[k][:, y, x])
+
+ tag = np.mean(_tag, axis=0)
+ tag = tag.reshape(L, 1, 1)
+ # Search maximum response of the missing keypoints
+ for k in range(K):
+ if keypoint_scores[n, k] > 0:
+ continue
+ dist_map = np.linalg.norm(
+ keypoint_tags[k] - tag, ord=2, axis=0)
+ cost_map = np.round(dist_map) * 100 - heatmaps[k] # H, W
+ y, x = np.unravel_index(np.argmin(cost_map), shape=(H, W))
+ keypoints[n, k] = [x, y]
+ keypoint_scores[n, k] = heatmaps[k, y, x]
+
+ return keypoints, keypoint_scores
+
+ def batch_decode(self, batch_heatmaps: Tensor, batch_tags: Tensor
+ ) -> Tuple[List[np.ndarray], List[np.ndarray]]:
+ """Decode the keypoint coordinates from a batch of heatmaps and tagging
+ heatmaps. The decoded keypoint coordinates are in the input image
+ space.
+
+ Args:
+ batch_heatmaps (Tensor): Keypoint detection heatmaps in shape
+ (B, K, H, W)
+ batch_tags (Tensor): Tagging heatmaps in shape (B, C, H, W), where
+ :math:`C=L*K`
+
+ Returns:
+ tuple:
+ - batch_keypoints (List[np.ndarray]): Decoded keypoint coordinates
+ of the batch, each is in shape (N, K, D)
+ - batch_scores (List[np.ndarray]): Decoded keypoint scores of the
+ batch, each is in shape (N, K). It usually represents the
+ confidience of the keypoint prediction
+ """
+ B, _, H, W = batch_heatmaps.shape
+ assert batch_tags.shape[0] == B and batch_tags.shape[2:4] == (H, W), (
+ f'Mismatched shapes of heatmap ({batch_heatmaps.shape}) and '
+ f'tagging map ({batch_tags.shape})')
+
+ # Heatmap NMS
+ batch_heatmaps = batch_heatmap_nms(batch_heatmaps,
+ self.decode_nms_kernel)
+
+ # Get top-k in each heatmap and and convert to numpy
+ batch_topk_vals, batch_topk_tags, batch_topk_locs = to_numpy(
+ self._get_batch_topk(
+ batch_heatmaps, batch_tags, k=self.decode_topk))
+
+ # Group keypoint candidates into groups (instances)
+ batch_groups = self._group_keypoints(batch_topk_vals, batch_topk_tags,
+ batch_topk_locs)
+
+ # Convert to numpy
+ batch_heatmaps_np = to_numpy(batch_heatmaps)
+ batch_tags_np = to_numpy(batch_tags)
+
+ # Refine the keypoint prediction
+ batch_keypoints = []
+ batch_keypoint_scores = []
+ for i, (groups, heatmaps, tags) in enumerate(
+ zip(batch_groups, batch_heatmaps_np, batch_tags_np)):
+
+ keypoints, scores = groups[..., :-1], groups[..., -1]
+
+ if keypoints.size > 0:
+ # identify missing keypoints
+ keypoints, scores = self._fill_missing_keypoints(
+ keypoints, scores, heatmaps, tags)
+
+ # refine keypoint coordinates according to heatmap distribution
+ if self.use_udp:
+ keypoints = refine_keypoints_dark_udp(
+ keypoints,
+ heatmaps,
+ blur_kernel_size=self.decode_gaussian_kernel)
+ else:
+ keypoints = refine_keypoints(keypoints, heatmaps)
+
+ batch_keypoints.append(keypoints)
+ batch_keypoint_scores.append(scores)
+
+ # restore keypoint scale
+ batch_keypoints = [
+ kpts * self.scale_factor for kpts in batch_keypoints
+ ]
+
+ return batch_keypoints, batch_keypoint_scores
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/base.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/base.py
new file mode 100644
index 0000000000000000000000000000000000000000..50efe4e740135b905031eaa2d8c2371107367c42
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/base.py
@@ -0,0 +1,82 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from abc import ABCMeta, abstractmethod
+from typing import Any, List, Optional, Tuple
+
+import numpy as np
+from mmengine.utils import is_method_overridden
+
+
+class BaseKeypointCodec(metaclass=ABCMeta):
+ """The base class of the keypoint codec.
+
+ A keypoint codec is a module to encode keypoint coordinates to specific
+ representation (e.g. heatmap) and vice versa. A subclass should implement
+ the methods :meth:`encode` and :meth:`decode`.
+ """
+
+ # pass additional encoding arguments to the `encode` method, beyond the
+ # mandatory `keypoints` and `keypoints_visible` arguments.
+ auxiliary_encode_keys = set()
+
+ @abstractmethod
+ def encode(self,
+ keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None) -> dict:
+ """Encode keypoints.
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+
+ Args:
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibility in shape
+ (N, K, D)
+
+ Returns:
+ dict: Encoded items.
+ """
+
+ @abstractmethod
+ def decode(self, encoded: Any) -> Tuple[np.ndarray, np.ndarray]:
+ """Decode keypoints.
+
+ Args:
+ encoded (any): Encoded keypoint representation using the codec
+
+ Returns:
+ tuple:
+ - keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ - keypoints_visible (np.ndarray): Keypoint visibility in shape
+ (N, K, D)
+ """
+
+ def batch_decode(self, batch_encoded: Any
+ ) -> Tuple[List[np.ndarray], List[np.ndarray]]:
+ """Decode keypoints.
+
+ Args:
+ batch_encoded (any): A batch of encoded keypoint
+ representations
+
+ Returns:
+ tuple:
+ - batch_keypoints (List[np.ndarray]): Each element is keypoint
+ coordinates in shape (N, K, D)
+ - batch_keypoints (List[np.ndarray]): Each element is keypoint
+ visibility in shape (N, K)
+ """
+ raise NotImplementedError()
+
+ @property
+ def support_batch_decoding(self) -> bool:
+ """Return whether the codec support decoding from batch data."""
+ return is_method_overridden('batch_decode', BaseKeypointCodec,
+ self.__class__)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/decoupled_heatmap.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/decoupled_heatmap.py
new file mode 100644
index 0000000000000000000000000000000000000000..c6e55fb61d6b2d5245a8e1a109e0ca474b71420c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/decoupled_heatmap.py
@@ -0,0 +1,270 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import random
+from typing import Optional, Tuple
+
+import numpy as np
+
+from mmpose.registry import KEYPOINT_CODECS
+from .base import BaseKeypointCodec
+from .utils import (generate_gaussian_heatmaps, get_diagonal_lengths,
+ get_instance_bbox, get_instance_root)
+from .utils.post_processing import get_heatmap_maximum
+from .utils.refinement import refine_keypoints
+
+
+@KEYPOINT_CODECS.register_module()
+class DecoupledHeatmap(BaseKeypointCodec):
+ """Encode/decode keypoints with the method introduced in the paper CID.
+
+ See the paper Contextual Instance Decoupling for Robust Multi-Person
+ Pose Estimation`_ by Wang et al (2022) for details
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+ - image size: [w, h]
+ - heatmap size: [W, H]
+
+ Encoded:
+ - heatmaps (np.ndarray): The coupled heatmap in shape
+ (1+K, H, W) where [W, H] is the `heatmap_size`.
+ - instance_heatmaps (np.ndarray): The decoupled heatmap in shape
+ (M*K, H, W) where M is the number of instances.
+ - keypoint_weights (np.ndarray): The weight for heatmaps in shape
+ (M*K).
+ - instance_coords (np.ndarray): The coordinates of instance roots
+ in shape (M, 2)
+
+ Args:
+ input_size (tuple): Image size in [w, h]
+ heatmap_size (tuple): Heatmap size in [W, H]
+ root_type (str): The method to generate the instance root. Options
+ are:
+
+ - ``'kpt_center'``: Average coordinate of all visible keypoints.
+ - ``'bbox_center'``: Center point of bounding boxes outlined by
+ all visible keypoints.
+
+ Defaults to ``'kpt_center'``
+
+ heatmap_min_overlap (float): Minimum overlap rate among instances.
+ Used when calculating sigmas for instances. Defaults to 0.7
+ background_weight (float): Loss weight of background pixels.
+ Defaults to 0.1
+ encode_max_instances (int): The maximum number of instances
+ to encode for each sample. Defaults to 30
+
+ .. _`CID`: https://openaccess.thecvf.com/content/CVPR2022/html/Wang_
+ Contextual_Instance_Decoupling_for_Robust_Multi-Person_Pose_Estimation_
+ CVPR_2022_paper.html
+ """
+
+ # DecoupledHeatmap requires bounding boxes to determine the size of each
+ # instance, so that it can assign varying sigmas based on their size
+ auxiliary_encode_keys = {'bbox'}
+
+ def __init__(
+ self,
+ input_size: Tuple[int, int],
+ heatmap_size: Tuple[int, int],
+ root_type: str = 'kpt_center',
+ heatmap_min_overlap: float = 0.7,
+ encode_max_instances: int = 30,
+ ):
+ super().__init__()
+
+ self.input_size = input_size
+ self.heatmap_size = heatmap_size
+ self.root_type = root_type
+ self.encode_max_instances = encode_max_instances
+ self.heatmap_min_overlap = heatmap_min_overlap
+
+ self.scale_factor = (np.array(input_size) /
+ heatmap_size).astype(np.float32)
+
+ def _get_instance_wise_sigmas(
+ self,
+ bbox: np.ndarray,
+ ) -> np.ndarray:
+ """Get sigma values for each instance according to their size.
+
+ Args:
+ bbox (np.ndarray): Bounding box in shape (N, 4, 2)
+
+ Returns:
+ np.ndarray: Array containing the sigma values for each instance.
+ """
+ sigmas = np.zeros((bbox.shape[0], ), dtype=np.float32)
+
+ heights = np.sqrt(np.power(bbox[:, 0] - bbox[:, 1], 2).sum(axis=-1))
+ widths = np.sqrt(np.power(bbox[:, 0] - bbox[:, 2], 2).sum(axis=-1))
+
+ for i in range(bbox.shape[0]):
+ h, w = heights[i], widths[i]
+
+ # compute sigma for each instance
+ # condition 1
+ a1, b1 = 1, h + w
+ c1 = w * h * (1 - self.heatmap_min_overlap) / (
+ 1 + self.heatmap_min_overlap)
+ sq1 = np.sqrt(b1**2 - 4 * a1 * c1)
+ r1 = (b1 + sq1) / 2
+
+ # condition 2
+ a2 = 4
+ b2 = 2 * (h + w)
+ c2 = (1 - self.heatmap_min_overlap) * w * h
+ sq2 = np.sqrt(b2**2 - 4 * a2 * c2)
+ r2 = (b2 + sq2) / 2
+
+ # condition 3
+ a3 = 4 * self.heatmap_min_overlap
+ b3 = -2 * self.heatmap_min_overlap * (h + w)
+ c3 = (self.heatmap_min_overlap - 1) * w * h
+ sq3 = np.sqrt(b3**2 - 4 * a3 * c3)
+ r3 = (b3 + sq3) / 2
+
+ sigmas[i] = min(r1, r2, r3) / 3
+
+ return sigmas
+
+ def encode(self,
+ keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None,
+ bbox: Optional[np.ndarray] = None) -> dict:
+ """Encode keypoints into heatmaps.
+
+ Args:
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+ bbox (np.ndarray): Bounding box in shape (N, 8) which includes
+ coordinates of 4 corners.
+
+ Returns:
+ dict:
+ - heatmaps (np.ndarray): The coupled heatmap in shape
+ (1+K, H, W) where [W, H] is the `heatmap_size`.
+ - instance_heatmaps (np.ndarray): The decoupled heatmap in shape
+ (N*K, H, W) where M is the number of instances.
+ - keypoint_weights (np.ndarray): The weight for heatmaps in shape
+ (N*K).
+ - instance_coords (np.ndarray): The coordinates of instance roots
+ in shape (N, 2)
+ """
+
+ if keypoints_visible is None:
+ keypoints_visible = np.ones(keypoints.shape[:2], dtype=np.float32)
+ if bbox is None:
+ # generate pseudo bbox via visible keypoints
+ bbox = get_instance_bbox(keypoints, keypoints_visible)
+ bbox = np.tile(bbox, 2).reshape(-1, 4, 2)
+ # corner order: left_top, left_bottom, right_top, right_bottom
+ bbox[:, 1:3, 0] = bbox[:, 0:2, 0]
+
+ # keypoint coordinates in heatmap
+ _keypoints = keypoints / self.scale_factor
+ _bbox = bbox.reshape(-1, 4, 2) / self.scale_factor
+
+ # compute the root and scale of each instance
+ roots, roots_visible = get_instance_root(_keypoints, keypoints_visible,
+ self.root_type)
+
+ sigmas = self._get_instance_wise_sigmas(_bbox)
+
+ # generate global heatmaps
+ heatmaps, keypoint_weights = generate_gaussian_heatmaps(
+ heatmap_size=self.heatmap_size,
+ keypoints=np.concatenate((_keypoints, roots[:, None]), axis=1),
+ keypoints_visible=np.concatenate(
+ (keypoints_visible, roots_visible[:, None]), axis=1),
+ sigma=sigmas)
+ roots_visible = keypoint_weights[:, -1]
+
+ # select instances
+ inst_roots, inst_indices = [], []
+ diagonal_lengths = get_diagonal_lengths(_keypoints, keypoints_visible)
+ for i in np.argsort(diagonal_lengths):
+ if roots_visible[i] < 1:
+ continue
+ # rand root point in 3x3 grid
+ x, y = roots[i] + np.random.randint(-1, 2, (2, ))
+ x = max(0, min(x, self.heatmap_size[0] - 1))
+ y = max(0, min(y, self.heatmap_size[1] - 1))
+ if (x, y) not in inst_roots:
+ inst_roots.append((x, y))
+ inst_indices.append(i)
+ if len(inst_indices) > self.encode_max_instances:
+ rand_indices = random.sample(
+ range(len(inst_indices)), self.encode_max_instances)
+ inst_roots = [inst_roots[i] for i in rand_indices]
+ inst_indices = [inst_indices[i] for i in rand_indices]
+
+ # generate instance-wise heatmaps
+ inst_heatmaps, inst_heatmap_weights = [], []
+ for i in inst_indices:
+ inst_heatmap, inst_heatmap_weight = generate_gaussian_heatmaps(
+ heatmap_size=self.heatmap_size,
+ keypoints=_keypoints[i:i + 1],
+ keypoints_visible=keypoints_visible[i:i + 1],
+ sigma=sigmas[i].item())
+ inst_heatmaps.append(inst_heatmap)
+ inst_heatmap_weights.append(inst_heatmap_weight)
+
+ if len(inst_indices) > 0:
+ inst_heatmaps = np.concatenate(inst_heatmaps)
+ inst_heatmap_weights = np.concatenate(inst_heatmap_weights)
+ inst_roots = np.array(inst_roots, dtype=np.int32)
+ else:
+ inst_heatmaps = np.empty((0, *self.heatmap_size[::-1]))
+ inst_heatmap_weights = np.empty((0, ))
+ inst_roots = np.empty((0, 2), dtype=np.int32)
+
+ encoded = dict(
+ heatmaps=heatmaps,
+ instance_heatmaps=inst_heatmaps,
+ keypoint_weights=inst_heatmap_weights,
+ instance_coords=inst_roots)
+
+ return encoded
+
+ def decode(self, instance_heatmaps: np.ndarray,
+ instance_scores: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
+ """Decode keypoint coordinates from decoupled heatmaps. The decoded
+ keypoint coordinates are in the input image space.
+
+ Args:
+ instance_heatmaps (np.ndarray): Heatmaps in shape (N, K, H, W)
+ instance_scores (np.ndarray): Confidence of instance roots
+ prediction in shape (N, 1)
+
+ Returns:
+ tuple:
+ - keypoints (np.ndarray): Decoded keypoint coordinates in shape
+ (N, K, D)
+ - scores (np.ndarray): The keypoint scores in shape (N, K). It
+ usually represents the confidence of the keypoint prediction
+ """
+ keypoints, keypoint_scores = [], []
+
+ for i in range(instance_heatmaps.shape[0]):
+ heatmaps = instance_heatmaps[i].copy()
+ kpts, scores = get_heatmap_maximum(heatmaps)
+ keypoints.append(refine_keypoints(kpts[None], heatmaps))
+ keypoint_scores.append(scores[None])
+
+ keypoints = np.concatenate(keypoints)
+ # Restore the keypoint scale
+ keypoints = keypoints * self.scale_factor
+
+ keypoint_scores = np.concatenate(keypoint_scores)
+ keypoint_scores *= instance_scores
+
+ return keypoints, keypoint_scores
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/image_pose_lifting.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/image_pose_lifting.py
new file mode 100644
index 0000000000000000000000000000000000000000..378297dd13af346bb91c11332326653573aeade8
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/image_pose_lifting.py
@@ -0,0 +1,208 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional, Tuple
+
+import numpy as np
+
+from mmpose.registry import KEYPOINT_CODECS
+from .base import BaseKeypointCodec
+
+
+@KEYPOINT_CODECS.register_module()
+class ImagePoseLifting(BaseKeypointCodec):
+ r"""Generate keypoint coordinates for pose lifter.
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+ - pose-lifitng target dimension: C
+
+ Args:
+ num_keypoints (int): The number of keypoints in the dataset.
+ root_index (int): Root keypoint index in the pose.
+ remove_root (bool): If true, remove the root keypoint from the pose.
+ Default: ``False``.
+ save_index (bool): If true, store the root position separated from the
+ original pose. Default: ``False``.
+ keypoints_mean (np.ndarray, optional): Mean values of keypoints
+ coordinates in shape (K, D).
+ keypoints_std (np.ndarray, optional): Std values of keypoints
+ coordinates in shape (K, D).
+ target_mean (np.ndarray, optional): Mean values of pose-lifitng target
+ coordinates in shape (K, C).
+ target_std (np.ndarray, optional): Std values of pose-lifitng target
+ coordinates in shape (K, C).
+ """
+
+ auxiliary_encode_keys = {'lifting_target', 'lifting_target_visible'}
+
+ def __init__(self,
+ num_keypoints: int,
+ root_index: int,
+ remove_root: bool = False,
+ save_index: bool = False,
+ keypoints_mean: Optional[np.ndarray] = None,
+ keypoints_std: Optional[np.ndarray] = None,
+ target_mean: Optional[np.ndarray] = None,
+ target_std: Optional[np.ndarray] = None):
+ super().__init__()
+
+ self.num_keypoints = num_keypoints
+ self.root_index = root_index
+ self.remove_root = remove_root
+ self.save_index = save_index
+ if keypoints_mean is not None and keypoints_std is not None:
+ assert keypoints_mean.shape == keypoints_std.shape
+ if target_mean is not None and target_std is not None:
+ assert target_mean.shape == target_std.shape
+ self.keypoints_mean = keypoints_mean
+ self.keypoints_std = keypoints_std
+ self.target_mean = target_mean
+ self.target_std = target_std
+
+ def encode(self,
+ keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None,
+ lifting_target: Optional[np.ndarray] = None,
+ lifting_target_visible: Optional[np.ndarray] = None) -> dict:
+ """Encoding keypoints from input image space to normalized space.
+
+ Args:
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D).
+ keypoints_visible (np.ndarray, optional): Keypoint visibilities in
+ shape (N, K).
+ lifting_target (np.ndarray, optional): 3d target coordinate in
+ shape (K, C).
+ lifting_target_visible (np.ndarray, optional): Target coordinate in
+ shape (K, ).
+
+ Returns:
+ encoded (dict): Contains the following items:
+
+ - keypoint_labels (np.ndarray): The processed keypoints in
+ shape (K * D, N) where D is 2 for 2d coordinates.
+ - lifting_target_label: The processed target coordinate in
+ shape (K, C) or (K-1, C).
+ - lifting_target_weights (np.ndarray): The target weights in
+ shape (K, ) or (K-1, ).
+ - trajectory_weights (np.ndarray): The trajectory weights in
+ shape (K, ).
+ - target_root (np.ndarray): The root coordinate of target in
+ shape (C, ).
+
+ In addition, there are some optional items it may contain:
+
+ - target_root_removed (bool): Indicate whether the root of
+ pose lifting target is removed. Added if ``self.remove_root``
+ is ``True``.
+ - target_root_index (int): An integer indicating the index of
+ root. Added if ``self.remove_root`` and ``self.save_index``
+ are ``True``.
+ """
+ if keypoints_visible is None:
+ keypoints_visible = np.ones(keypoints.shape[:2], dtype=np.float32)
+
+ if lifting_target is None:
+ lifting_target = keypoints[0]
+
+ # set initial value for `lifting_target_weights`
+ # and `trajectory_weights`
+ if lifting_target_visible is None:
+ lifting_target_visible = np.ones(
+ lifting_target.shape[:-1], dtype=np.float32)
+ lifting_target_weights = lifting_target_visible
+ trajectory_weights = (1 / lifting_target[:, 2])
+ else:
+ valid = lifting_target_visible > 0.5
+ lifting_target_weights = np.where(valid, 1., 0.).astype(np.float32)
+ trajectory_weights = lifting_target_weights
+
+ encoded = dict()
+
+ # Zero-center the target pose around a given root keypoint
+ assert (lifting_target.ndim >= 2 and
+ lifting_target.shape[-2] > self.root_index), \
+ f'Got invalid joint shape {lifting_target.shape}'
+
+ root = lifting_target[..., self.root_index, :]
+ lifting_target_label = lifting_target - root
+
+ if self.remove_root:
+ lifting_target_label = np.delete(
+ lifting_target_label, self.root_index, axis=-2)
+ assert lifting_target_weights.ndim in {1, 2}
+ axis_to_remove = -2 if lifting_target_weights.ndim == 2 else -1
+ lifting_target_weights = np.delete(
+ lifting_target_weights, self.root_index, axis=axis_to_remove)
+ # Add a flag to avoid latter transforms that rely on the root
+ # joint or the original joint index
+ encoded['target_root_removed'] = True
+
+ # Save the root index which is necessary to restore the global pose
+ if self.save_index:
+ encoded['target_root_index'] = self.root_index
+
+ # Normalize the 2D keypoint coordinate with mean and std
+ keypoint_labels = keypoints.copy()
+ if self.keypoints_mean is not None and self.keypoints_std is not None:
+ keypoints_shape = keypoints.shape
+ assert self.keypoints_mean.shape == keypoints_shape[1:]
+
+ keypoint_labels = (keypoint_labels -
+ self.keypoints_mean) / self.keypoints_std
+ if self.target_mean is not None and self.target_std is not None:
+ target_shape = lifting_target_label.shape
+ assert self.target_mean.shape == target_shape
+
+ lifting_target_label = (lifting_target_label -
+ self.target_mean) / self.target_std
+
+ # Generate reshaped keypoint coordinates
+ assert keypoint_labels.ndim in {2, 3}
+ if keypoint_labels.ndim == 2:
+ keypoint_labels = keypoint_labels[None, ...]
+
+ encoded['keypoint_labels'] = keypoint_labels
+ encoded['lifting_target_label'] = lifting_target_label
+ encoded['lifting_target_weights'] = lifting_target_weights
+ encoded['trajectory_weights'] = trajectory_weights
+ encoded['target_root'] = root
+
+ return encoded
+
+ def decode(self,
+ encoded: np.ndarray,
+ target_root: Optional[np.ndarray] = None
+ ) -> Tuple[np.ndarray, np.ndarray]:
+ """Decode keypoint coordinates from normalized space to input image
+ space.
+
+ Args:
+ encoded (np.ndarray): Coordinates in shape (N, K, C).
+ target_root (np.ndarray, optional): The target root coordinate.
+ Default: ``None``.
+
+ Returns:
+ keypoints (np.ndarray): Decoded coordinates in shape (N, K, C).
+ scores (np.ndarray): The keypoint scores in shape (N, K).
+ """
+ keypoints = encoded.copy()
+
+ if self.target_mean is not None and self.target_std is not None:
+ assert self.target_mean.shape == keypoints.shape[1:]
+ keypoints = keypoints * self.target_std + self.target_mean
+
+ if target_root.size > 0:
+ keypoints = keypoints + np.expand_dims(target_root, axis=0)
+ if self.remove_root:
+ keypoints = np.insert(
+ keypoints, self.root_index, target_root, axis=1)
+ scores = np.ones(keypoints.shape[:-1], dtype=np.float32)
+
+ return keypoints, scores
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/integral_regression_label.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/integral_regression_label.py
new file mode 100644
index 0000000000000000000000000000000000000000..d36e9b7799e1506a6b46049ec0b27063863d06e7
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/integral_regression_label.py
@@ -0,0 +1,120 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+
+from typing import Optional, Tuple
+
+import numpy as np
+
+from mmpose.registry import KEYPOINT_CODECS
+from .base import BaseKeypointCodec
+from .msra_heatmap import MSRAHeatmap
+from .regression_label import RegressionLabel
+
+
+@KEYPOINT_CODECS.register_module()
+class IntegralRegressionLabel(BaseKeypointCodec):
+ """Generate keypoint coordinates and normalized heatmaps. See the paper:
+ `DSNT`_ by Nibali et al(2018).
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+ - image size: [w, h]
+
+ Encoded:
+
+ - keypoint_labels (np.ndarray): The normalized regression labels in
+ shape (N, K, D) where D is 2 for 2d coordinates
+ - heatmaps (np.ndarray): The generated heatmap in shape (K, H, W) where
+ [W, H] is the `heatmap_size`
+ - keypoint_weights (np.ndarray): The target weights in shape (N, K)
+
+ Args:
+ input_size (tuple): Input image size in [w, h]
+ heatmap_size (tuple): Heatmap size in [W, H]
+ sigma (float): The sigma value of the Gaussian heatmap
+ unbiased (bool): Whether use unbiased method (DarkPose) in ``'msra'``
+ encoding. See `Dark Pose`_ for details. Defaults to ``False``
+ blur_kernel_size (int): The Gaussian blur kernel size of the heatmap
+ modulation in DarkPose. The kernel size and sigma should follow
+ the expirical formula :math:`sigma = 0.3*((ks-1)*0.5-1)+0.8`.
+ Defaults to 11
+ normalize (bool): Whether to normalize the heatmaps. Defaults to True.
+
+ .. _`DSNT`: https://arxiv.org/abs/1801.07372
+ """
+
+ def __init__(self,
+ input_size: Tuple[int, int],
+ heatmap_size: Tuple[int, int],
+ sigma: float,
+ unbiased: bool = False,
+ blur_kernel_size: int = 11,
+ normalize: bool = True) -> None:
+ super().__init__()
+
+ self.heatmap_codec = MSRAHeatmap(input_size, heatmap_size, sigma,
+ unbiased, blur_kernel_size)
+ self.keypoint_codec = RegressionLabel(input_size)
+ self.normalize = normalize
+
+ def encode(self,
+ keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None) -> dict:
+ """Encoding keypoints to regression labels and heatmaps.
+
+ Args:
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+
+ Returns:
+ dict:
+ - keypoint_labels (np.ndarray): The normalized regression labels in
+ shape (N, K, D) where D is 2 for 2d coordinates
+ - heatmaps (np.ndarray): The generated heatmap in shape
+ (K, H, W) where [W, H] is the `heatmap_size`
+ - keypoint_weights (np.ndarray): The target weights in shape
+ (N, K)
+ """
+ encoded_hm = self.heatmap_codec.encode(keypoints, keypoints_visible)
+ encoded_kp = self.keypoint_codec.encode(keypoints, keypoints_visible)
+
+ heatmaps = encoded_hm['heatmaps']
+ keypoint_labels = encoded_kp['keypoint_labels']
+ keypoint_weights = encoded_kp['keypoint_weights']
+
+ if self.normalize:
+ val_sum = heatmaps.sum(axis=(-1, -2)).reshape(-1, 1, 1) + 1e-24
+ heatmaps = heatmaps / val_sum
+
+ encoded = dict(
+ keypoint_labels=keypoint_labels,
+ heatmaps=heatmaps,
+ keypoint_weights=keypoint_weights)
+
+ return encoded
+
+ def decode(self, encoded: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
+ """Decode keypoint coordinates from normalized space to input image
+ space.
+
+ Args:
+ encoded (np.ndarray): Coordinates in shape (N, K, D)
+
+ Returns:
+ tuple:
+ - keypoints (np.ndarray): Decoded coordinates in shape (N, K, D)
+ - socres (np.ndarray): The keypoint scores in shape (N, K).
+ It usually represents the confidence of the keypoint prediction
+ """
+
+ keypoints, scores = self.keypoint_codec.decode(encoded)
+
+ return keypoints, scores
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/megvii_heatmap.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/megvii_heatmap.py
new file mode 100644
index 0000000000000000000000000000000000000000..760ca1152956a9562c39cef44f2853bc6fb08662
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/megvii_heatmap.py
@@ -0,0 +1,149 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from itertools import product
+from typing import Optional, Tuple
+
+import cv2
+import numpy as np
+
+from mmpose.registry import KEYPOINT_CODECS
+from .base import BaseKeypointCodec
+from .utils import gaussian_blur, get_heatmap_maximum
+
+
+@KEYPOINT_CODECS.register_module()
+class MegviiHeatmap(BaseKeypointCodec):
+ """Represent keypoints as heatmaps via "Megvii" approach. See `MSPN`_
+ (2019) and `CPN`_ (2018) for details.
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+ - image size: [w, h]
+ - heatmap size: [W, H]
+
+ Encoded:
+
+ - heatmaps (np.ndarray): The generated heatmap in shape (K, H, W)
+ where [W, H] is the `heatmap_size`
+ - keypoint_weights (np.ndarray): The target weights in shape (N, K)
+
+ Args:
+ input_size (tuple): Image size in [w, h]
+ heatmap_size (tuple): Heatmap size in [W, H]
+ kernel_size (tuple): The kernel size of the heatmap gaussian in
+ [ks_x, ks_y]
+
+ .. _`MSPN`: https://arxiv.org/abs/1901.00148
+ .. _`CPN`: https://arxiv.org/abs/1711.07319
+ """
+
+ def __init__(
+ self,
+ input_size: Tuple[int, int],
+ heatmap_size: Tuple[int, int],
+ kernel_size: int,
+ ) -> None:
+
+ super().__init__()
+ self.input_size = input_size
+ self.heatmap_size = heatmap_size
+ self.kernel_size = kernel_size
+ self.scale_factor = (np.array(input_size) /
+ heatmap_size).astype(np.float32)
+
+ def encode(self,
+ keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None) -> dict:
+ """Encode keypoints into heatmaps. Note that the original keypoint
+ coordinates should be in the input image space.
+
+ Args:
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+
+ Returns:
+ dict:
+ - heatmaps (np.ndarray): The generated heatmap in shape
+ (K, H, W) where [W, H] is the `heatmap_size`
+ - keypoint_weights (np.ndarray): The target weights in shape
+ (N, K)
+ """
+
+ N, K, _ = keypoints.shape
+ W, H = self.heatmap_size
+
+ assert N == 1, (
+ f'{self.__class__.__name__} only support single-instance '
+ 'keypoint encoding')
+
+ heatmaps = np.zeros((K, H, W), dtype=np.float32)
+ keypoint_weights = keypoints_visible.copy()
+
+ for n, k in product(range(N), range(K)):
+ # skip unlabled keypoints
+ if keypoints_visible[n, k] < 0.5:
+ continue
+
+ # get center coordinates
+ kx, ky = (keypoints[n, k] / self.scale_factor).astype(np.int64)
+ if kx < 0 or kx >= W or ky < 0 or ky >= H:
+ keypoint_weights[n, k] = 0
+ continue
+
+ heatmaps[k, ky, kx] = 1.
+ kernel_size = (self.kernel_size, self.kernel_size)
+ heatmaps[k] = cv2.GaussianBlur(heatmaps[k], kernel_size, 0)
+
+ # normalize the heatmap
+ heatmaps[k] = heatmaps[k] / heatmaps[k, ky, kx] * 255.
+
+ encoded = dict(heatmaps=heatmaps, keypoint_weights=keypoint_weights)
+
+ return encoded
+
+ def decode(self, encoded: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
+ """Decode keypoint coordinates from heatmaps. The decoded keypoint
+ coordinates are in the input image space.
+
+ Args:
+ encoded (np.ndarray): Heatmaps in shape (K, H, W)
+
+ Returns:
+ tuple:
+ - keypoints (np.ndarray): Decoded keypoint coordinates in shape
+ (K, D)
+ - scores (np.ndarray): The keypoint scores in shape (K,). It
+ usually represents the confidence of the keypoint prediction
+ """
+ heatmaps = gaussian_blur(encoded.copy(), self.kernel_size)
+ K, H, W = heatmaps.shape
+
+ keypoints, scores = get_heatmap_maximum(heatmaps)
+
+ for k in range(K):
+ heatmap = heatmaps[k]
+ px = int(keypoints[k, 0])
+ py = int(keypoints[k, 1])
+ if 1 < px < W - 1 and 1 < py < H - 1:
+ diff = np.array([
+ heatmap[py][px + 1] - heatmap[py][px - 1],
+ heatmap[py + 1][px] - heatmap[py - 1][px]
+ ])
+ keypoints[k] += (np.sign(diff) * 0.25 + 0.5)
+
+ scores = scores / 255.0 + 0.5
+
+ # Unsqueeze the instance dimension for single-instance results
+ # and restore the keypoint scales
+ keypoints = keypoints[None] * self.scale_factor
+ scores = scores[None]
+
+ return keypoints, scores
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/msra_heatmap.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/msra_heatmap.py
new file mode 100644
index 0000000000000000000000000000000000000000..fd750881fdae012abcdcfaebe2a3a70a1888e674
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/msra_heatmap.py
@@ -0,0 +1,155 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional, Tuple
+
+import numpy as np
+
+from mmpose.registry import KEYPOINT_CODECS
+from .base import BaseKeypointCodec
+from .utils.gaussian_heatmap import (generate_gaussian_heatmaps,
+ generate_unbiased_gaussian_heatmaps)
+from .utils.post_processing import get_heatmap_maximum
+from .utils.refinement import refine_keypoints, refine_keypoints_dark
+
+
+@KEYPOINT_CODECS.register_module()
+class MSRAHeatmap(BaseKeypointCodec):
+ """Represent keypoints as heatmaps via "MSRA" approach. See the paper:
+ `Simple Baselines for Human Pose Estimation and Tracking`_ by Xiao et al
+ (2018) for details.
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+ - image size: [w, h]
+ - heatmap size: [W, H]
+
+ Encoded:
+
+ - heatmaps (np.ndarray): The generated heatmap in shape (K, H, W)
+ where [W, H] is the `heatmap_size`
+ - keypoint_weights (np.ndarray): The target weights in shape (N, K)
+
+ Args:
+ input_size (tuple): Image size in [w, h]
+ heatmap_size (tuple): Heatmap size in [W, H]
+ sigma (float): The sigma value of the Gaussian heatmap
+ unbiased (bool): Whether use unbiased method (DarkPose) in ``'msra'``
+ encoding. See `Dark Pose`_ for details. Defaults to ``False``
+ blur_kernel_size (int): The Gaussian blur kernel size of the heatmap
+ modulation in DarkPose. The kernel size and sigma should follow
+ the expirical formula :math:`sigma = 0.3*((ks-1)*0.5-1)+0.8`.
+ Defaults to 11
+
+ .. _`Simple Baselines for Human Pose Estimation and Tracking`:
+ https://arxiv.org/abs/1804.06208
+ .. _`Dark Pose`: https://arxiv.org/abs/1910.06278
+ """
+
+ def __init__(self,
+ input_size: Tuple[int, int],
+ heatmap_size: Tuple[int, int],
+ sigma: float,
+ unbiased: bool = False,
+ blur_kernel_size: int = 11) -> None:
+ super().__init__()
+ self.input_size = input_size
+ self.heatmap_size = heatmap_size
+ self.sigma = sigma
+ self.unbiased = unbiased
+
+ # The Gaussian blur kernel size of the heatmap modulation
+ # in DarkPose and the sigma value follows the expirical
+ # formula :math:`sigma = 0.3*((ks-1)*0.5-1)+0.8`
+ # which gives:
+ # sigma~=3 if ks=17
+ # sigma=2 if ks=11;
+ # sigma~=1.5 if ks=7;
+ # sigma~=1 if ks=3;
+ self.blur_kernel_size = blur_kernel_size
+ self.scale_factor = (np.array(input_size) /
+ heatmap_size).astype(np.float32)
+
+ def encode(self,
+ keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None) -> dict:
+ """Encode keypoints into heatmaps. Note that the original keypoint
+ coordinates should be in the input image space.
+
+ Args:
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+
+ Returns:
+ dict:
+ - heatmaps (np.ndarray): The generated heatmap in shape
+ (K, H, W) where [W, H] is the `heatmap_size`
+ - keypoint_weights (np.ndarray): The target weights in shape
+ (N, K)
+ """
+
+ assert keypoints.shape[0] == 1, (
+ f'{self.__class__.__name__} only support single-instance '
+ 'keypoint encoding')
+
+ if keypoints_visible is None:
+ keypoints_visible = np.ones(keypoints.shape[:2], dtype=np.float32)
+
+ if self.unbiased:
+ heatmaps, keypoint_weights = generate_unbiased_gaussian_heatmaps(
+ heatmap_size=self.heatmap_size,
+ keypoints=keypoints / self.scale_factor,
+ keypoints_visible=keypoints_visible,
+ sigma=self.sigma)
+ else:
+ heatmaps, keypoint_weights = generate_gaussian_heatmaps(
+ heatmap_size=self.heatmap_size,
+ keypoints=keypoints / self.scale_factor,
+ keypoints_visible=keypoints_visible,
+ sigma=self.sigma)
+
+ encoded = dict(heatmaps=heatmaps, keypoint_weights=keypoint_weights)
+
+ return encoded
+
+ def decode(self, encoded: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
+ """Decode keypoint coordinates from heatmaps. The decoded keypoint
+ coordinates are in the input image space.
+
+ Args:
+ encoded (np.ndarray): Heatmaps in shape (K, H, W)
+
+ Returns:
+ tuple:
+ - keypoints (np.ndarray): Decoded keypoint coordinates in shape
+ (N, K, D)
+ - scores (np.ndarray): The keypoint scores in shape (N, K). It
+ usually represents the confidence of the keypoint prediction
+ """
+ heatmaps = encoded.copy()
+ K, H, W = heatmaps.shape
+
+ keypoints, scores = get_heatmap_maximum(heatmaps)
+
+ # Unsqueeze the instance dimension for single-instance results
+ keypoints, scores = keypoints[None], scores[None]
+
+ if self.unbiased:
+ # Alleviate biased coordinate
+ keypoints = refine_keypoints_dark(
+ keypoints, heatmaps, blur_kernel_size=self.blur_kernel_size)
+
+ else:
+ keypoints = refine_keypoints(keypoints, heatmaps)
+
+ # Restore the keypoint scale
+ keypoints = keypoints * self.scale_factor
+
+ return keypoints, scores
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/regression_label.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/regression_label.py
new file mode 100644
index 0000000000000000000000000000000000000000..9815c52199fdad85efe080da985916d4e17e569e
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/regression_label.py
@@ -0,0 +1,108 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+
+from typing import Optional, Tuple
+
+import numpy as np
+
+from mmpose.registry import KEYPOINT_CODECS
+from .base import BaseKeypointCodec
+
+
+@KEYPOINT_CODECS.register_module()
+class RegressionLabel(BaseKeypointCodec):
+ r"""Generate keypoint coordinates.
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+ - image size: [w, h]
+
+ Encoded:
+
+ - keypoint_labels (np.ndarray): The normalized regression labels in
+ shape (N, K, D) where D is 2 for 2d coordinates
+ - keypoint_weights (np.ndarray): The target weights in shape (N, K)
+
+ Args:
+ input_size (tuple): Input image size in [w, h]
+
+ """
+
+ def __init__(self, input_size: Tuple[int, int]) -> None:
+ super().__init__()
+
+ self.input_size = input_size
+
+ def encode(self,
+ keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None) -> dict:
+ """Encoding keypoints from input image space to normalized space.
+
+ Args:
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+
+ Returns:
+ dict:
+ - keypoint_labels (np.ndarray): The normalized regression labels in
+ shape (N, K, D) where D is 2 for 2d coordinates
+ - keypoint_weights (np.ndarray): The target weights in shape
+ (N, K)
+ """
+ if keypoints_visible is None:
+ keypoints_visible = np.ones(keypoints.shape[:2], dtype=np.float32)
+
+ w, h = self.input_size
+ valid = ((keypoints >= 0) &
+ (keypoints <= [w - 1, h - 1])).all(axis=-1) & (
+ keypoints_visible > 0.5)
+
+ keypoint_labels = (keypoints / np.array([w, h])).astype(np.float32)
+ keypoint_weights = np.where(valid, 1., 0.).astype(np.float32)
+
+ encoded = dict(
+ keypoint_labels=keypoint_labels, keypoint_weights=keypoint_weights)
+
+ return encoded
+
+ def decode(self, encoded: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
+ """Decode keypoint coordinates from normalized space to input image
+ space.
+
+ Args:
+ encoded (np.ndarray): Coordinates in shape (N, K, D)
+
+ Returns:
+ tuple:
+ - keypoints (np.ndarray): Decoded coordinates in shape (N, K, D)
+ - scores (np.ndarray): The keypoint scores in shape (N, K).
+ It usually represents the confidence of the keypoint prediction
+ """
+
+ if encoded.shape[-1] == 2:
+ N, K, _ = encoded.shape
+ normalized_coords = encoded.copy()
+ scores = np.ones((N, K), dtype=np.float32)
+ elif encoded.shape[-1] == 4:
+ # split coords and sigma if outputs contain output_sigma
+ normalized_coords = encoded[..., :2].copy()
+ output_sigma = encoded[..., 2:4].copy()
+
+ scores = (1 - output_sigma).mean(axis=-1)
+ else:
+ raise ValueError(
+ 'Keypoint dimension should be 2 or 4 (with sigma), '
+ f'but got {encoded.shape[-1]}')
+
+ w, h = self.input_size
+ keypoints = normalized_coords * np.array([w, h])
+
+ return keypoints, scores
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/simcc_label.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/simcc_label.py
new file mode 100644
index 0000000000000000000000000000000000000000..a9da003cf74ec0b84bdd6baf35dc24e74c5d065a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/simcc_label.py
@@ -0,0 +1,291 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from itertools import product
+from typing import Optional, Tuple, Union
+
+import numpy as np
+
+from mmpose.codecs.utils import get_simcc_maximum
+from mmpose.codecs.utils.refinement import refine_simcc_dark
+from mmpose.registry import KEYPOINT_CODECS
+from .base import BaseKeypointCodec
+
+
+@KEYPOINT_CODECS.register_module()
+class SimCCLabel(BaseKeypointCodec):
+ r"""Generate keypoint representation via "SimCC" approach.
+ See the paper: `SimCC: a Simple Coordinate Classification Perspective for
+ Human Pose Estimation`_ by Li et al (2022) for more details.
+ Old name: SimDR
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+ - image size: [w, h]
+
+ Encoded:
+
+ - keypoint_x_labels (np.ndarray): The generated SimCC label for x-axis.
+ The label shape is (N, K, Wx) if ``smoothing_type=='gaussian'``
+ and (N, K) if `smoothing_type=='standard'``, where
+ :math:`Wx=w*simcc_split_ratio`
+ - keypoint_y_labels (np.ndarray): The generated SimCC label for y-axis.
+ The label shape is (N, K, Wy) if ``smoothing_type=='gaussian'``
+ and (N, K) if `smoothing_type=='standard'``, where
+ :math:`Wy=h*simcc_split_ratio`
+ - keypoint_weights (np.ndarray): The target weights in shape (N, K)
+
+ Args:
+ input_size (tuple): Input image size in [w, h]
+ smoothing_type (str): The SimCC label smoothing strategy. Options are
+ ``'gaussian'`` and ``'standard'``. Defaults to ``'gaussian'``
+ sigma (float | int | tuple): The sigma value in the Gaussian SimCC
+ label. Defaults to 6.0
+ simcc_split_ratio (float): The ratio of the label size to the input
+ size. For example, if the input width is ``w``, the x label size
+ will be :math:`w*simcc_split_ratio`. Defaults to 2.0
+ label_smooth_weight (float): Label Smoothing weight. Defaults to 0.0
+ normalize (bool): Whether to normalize the heatmaps. Defaults to True.
+
+ .. _`SimCC: a Simple Coordinate Classification Perspective for Human Pose
+ Estimation`: https://arxiv.org/abs/2107.03332
+ """
+
+ def __init__(self,
+ input_size: Tuple[int, int],
+ smoothing_type: str = 'gaussian',
+ sigma: Union[float, int, Tuple[float]] = 6.0,
+ simcc_split_ratio: float = 2.0,
+ label_smooth_weight: float = 0.0,
+ normalize: bool = True,
+ use_dark: bool = False) -> None:
+ super().__init__()
+
+ self.input_size = input_size
+ self.smoothing_type = smoothing_type
+ self.simcc_split_ratio = simcc_split_ratio
+ self.label_smooth_weight = label_smooth_weight
+ self.normalize = normalize
+ self.use_dark = use_dark
+
+ if isinstance(sigma, (float, int)):
+ self.sigma = np.array([sigma, sigma])
+ else:
+ self.sigma = np.array(sigma)
+
+ if self.smoothing_type not in {'gaussian', 'standard'}:
+ raise ValueError(
+ f'{self.__class__.__name__} got invalid `smoothing_type` value'
+ f'{self.smoothing_type}. Should be one of '
+ '{"gaussian", "standard"}')
+
+ if self.smoothing_type == 'gaussian' and self.label_smooth_weight > 0:
+ raise ValueError('Attribute `label_smooth_weight` is only '
+ 'used for `standard` mode.')
+
+ if self.label_smooth_weight < 0.0 or self.label_smooth_weight > 1.0:
+ raise ValueError('`label_smooth_weight` should be in range [0, 1]')
+
+ def encode(self,
+ keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None) -> dict:
+ """Encoding keypoints into SimCC labels. Note that the original
+ keypoint coordinates should be in the input image space.
+
+ Args:
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+
+ Returns:
+ dict:
+ - keypoint_x_labels (np.ndarray): The generated SimCC label for
+ x-axis.
+ The label shape is (N, K, Wx) if ``smoothing_type=='gaussian'``
+ and (N, K) if `smoothing_type=='standard'``, where
+ :math:`Wx=w*simcc_split_ratio`
+ - keypoint_y_labels (np.ndarray): The generated SimCC label for
+ y-axis.
+ The label shape is (N, K, Wy) if ``smoothing_type=='gaussian'``
+ and (N, K) if `smoothing_type=='standard'``, where
+ :math:`Wy=h*simcc_split_ratio`
+ - keypoint_weights (np.ndarray): The target weights in shape
+ (N, K)
+ """
+ if keypoints_visible is None:
+ keypoints_visible = np.ones(keypoints.shape[:2], dtype=np.float32)
+
+ if self.smoothing_type == 'gaussian':
+ x_labels, y_labels, keypoint_weights = self._generate_gaussian(
+ keypoints, keypoints_visible)
+ elif self.smoothing_type == 'standard':
+ x_labels, y_labels, keypoint_weights = self._generate_standard(
+ keypoints, keypoints_visible)
+ else:
+ raise ValueError(
+ f'{self.__class__.__name__} got invalid `smoothing_type` value'
+ f'{self.smoothing_type}. Should be one of '
+ '{"gaussian", "standard"}')
+
+ encoded = dict(
+ keypoint_x_labels=x_labels,
+ keypoint_y_labels=y_labels,
+ keypoint_weights=keypoint_weights)
+
+ return encoded
+
+ def decode(self, simcc_x: np.ndarray,
+ simcc_y: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
+ """Decode keypoint coordinates from SimCC representations. The decoded
+ coordinates are in the input image space.
+
+ Args:
+ encoded (Tuple[np.ndarray, np.ndarray]): SimCC labels for x-axis
+ and y-axis
+ simcc_x (np.ndarray): SimCC label for x-axis
+ simcc_y (np.ndarray): SimCC label for y-axis
+
+ Returns:
+ tuple:
+ - keypoints (np.ndarray): Decoded coordinates in shape (N, K, D)
+ - socres (np.ndarray): The keypoint scores in shape (N, K).
+ It usually represents the confidence of the keypoint prediction
+ """
+
+ keypoints, scores = get_simcc_maximum(simcc_x, simcc_y)
+
+ # Unsqueeze the instance dimension for single-instance results
+ if keypoints.ndim == 2:
+ keypoints = keypoints[None, :]
+ scores = scores[None, :]
+
+ if self.use_dark:
+ x_blur = int((self.sigma[0] * 20 - 7) // 3)
+ y_blur = int((self.sigma[1] * 20 - 7) // 3)
+ x_blur -= int((x_blur % 2) == 0)
+ y_blur -= int((y_blur % 2) == 0)
+ keypoints[:, :, 0] = refine_simcc_dark(keypoints[:, :, 0], simcc_x,
+ x_blur)
+ keypoints[:, :, 1] = refine_simcc_dark(keypoints[:, :, 1], simcc_y,
+ y_blur)
+
+ keypoints /= self.simcc_split_ratio
+
+ return keypoints, scores
+
+ def _map_coordinates(
+ self,
+ keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None
+ ) -> Tuple[np.ndarray, np.ndarray]:
+ """Mapping keypoint coordinates into SimCC space."""
+
+ keypoints_split = keypoints.copy()
+ keypoints_split = np.around(keypoints_split * self.simcc_split_ratio)
+ keypoints_split = keypoints_split.astype(np.int64)
+ keypoint_weights = keypoints_visible.copy()
+
+ return keypoints_split, keypoint_weights
+
+ def _generate_standard(
+ self,
+ keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None
+ ) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
+ """Encoding keypoints into SimCC labels with Standard Label Smoothing
+ strategy.
+
+ Labels will be one-hot vectors if self.label_smooth_weight==0.0
+ """
+
+ N, K, _ = keypoints.shape
+ w, h = self.input_size
+ W = np.around(w * self.simcc_split_ratio).astype(int)
+ H = np.around(h * self.simcc_split_ratio).astype(int)
+
+ keypoints_split, keypoint_weights = self._map_coordinates(
+ keypoints, keypoints_visible)
+
+ target_x = np.zeros((N, K, W), dtype=np.float32)
+ target_y = np.zeros((N, K, H), dtype=np.float32)
+
+ for n, k in product(range(N), range(K)):
+ # skip unlabled keypoints
+ if keypoints_visible[n, k] < 0.5:
+ continue
+
+ # get center coordinates
+ mu_x, mu_y = keypoints_split[n, k].astype(np.int64)
+
+ # detect abnormal coords and assign the weight 0
+ if mu_x >= W or mu_y >= H or mu_x < 0 or mu_y < 0:
+ keypoint_weights[n, k] = 0
+ continue
+
+ if self.label_smooth_weight > 0:
+ target_x[n, k] = self.label_smooth_weight / (W - 1)
+ target_y[n, k] = self.label_smooth_weight / (H - 1)
+
+ target_x[n, k, mu_x] = 1.0 - self.label_smooth_weight
+ target_y[n, k, mu_y] = 1.0 - self.label_smooth_weight
+
+ return target_x, target_y, keypoint_weights
+
+ def _generate_gaussian(
+ self,
+ keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None
+ ) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
+ """Encoding keypoints into SimCC labels with Gaussian Label Smoothing
+ strategy."""
+
+ N, K, _ = keypoints.shape
+ w, h = self.input_size
+ W = np.around(w * self.simcc_split_ratio).astype(int)
+ H = np.around(h * self.simcc_split_ratio).astype(int)
+
+ keypoints_split, keypoint_weights = self._map_coordinates(
+ keypoints, keypoints_visible)
+
+ target_x = np.zeros((N, K, W), dtype=np.float32)
+ target_y = np.zeros((N, K, H), dtype=np.float32)
+
+ # 3-sigma rule
+ radius = self.sigma * 3
+
+ # xy grid
+ x = np.arange(0, W, 1, dtype=np.float32)
+ y = np.arange(0, H, 1, dtype=np.float32)
+
+ for n, k in product(range(N), range(K)):
+ # skip unlabled keypoints
+ if keypoints_visible[n, k] < 0.5:
+ continue
+
+ mu = keypoints_split[n, k]
+
+ # check that the gaussian has in-bounds part
+ left, top = mu - radius
+ right, bottom = mu + radius + 1
+
+ if left >= W or top >= H or right < 0 or bottom < 0:
+ keypoint_weights[n, k] = 0
+ continue
+
+ mu_x, mu_y = mu
+
+ target_x[n, k] = np.exp(-((x - mu_x)**2) / (2 * self.sigma[0]**2))
+ target_y[n, k] = np.exp(-((y - mu_y)**2) / (2 * self.sigma[1]**2))
+
+ if self.normalize:
+ norm_value = self.sigma * np.sqrt(np.pi * 2)
+ target_x /= norm_value[0]
+ target_y /= norm_value[1]
+
+ return target_x, target_y, keypoint_weights
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/spr.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/spr.py
new file mode 100644
index 0000000000000000000000000000000000000000..690d580069561c19b83af4e511f8d0eccad1c7d3
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/spr.py
@@ -0,0 +1,304 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional, Tuple, Union
+
+import numpy as np
+import torch
+from torch import Tensor
+
+from mmpose.registry import KEYPOINT_CODECS
+from .base import BaseKeypointCodec
+from .utils import (batch_heatmap_nms, generate_displacement_heatmap,
+ generate_gaussian_heatmaps, get_diagonal_lengths,
+ get_instance_root)
+
+
+@KEYPOINT_CODECS.register_module()
+class SPR(BaseKeypointCodec):
+ """Encode/decode keypoints with Structured Pose Representation (SPR).
+
+ See the paper `Single-stage multi-person pose machines`_
+ by Nie et al (2017) for details
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+ - image size: [w, h]
+ - heatmap size: [W, H]
+
+ Encoded:
+
+ - heatmaps (np.ndarray): The generated heatmap in shape (1, H, W)
+ where [W, H] is the `heatmap_size`. If the keypoint heatmap is
+ generated together, the output heatmap shape is (K+1, H, W)
+ - heatmap_weights (np.ndarray): The target weights for heatmaps which
+ has same shape with heatmaps.
+ - displacements (np.ndarray): The dense keypoint displacement in
+ shape (K*2, H, W).
+ - displacement_weights (np.ndarray): The target weights for heatmaps
+ which has same shape with displacements.
+
+ Args:
+ input_size (tuple): Image size in [w, h]
+ heatmap_size (tuple): Heatmap size in [W, H]
+ sigma (float or tuple, optional): The sigma values of the Gaussian
+ heatmaps. If sigma is a tuple, it includes both sigmas for root
+ and keypoint heatmaps. ``None`` means the sigmas are computed
+ automatically from the heatmap size. Defaults to ``None``
+ generate_keypoint_heatmaps (bool): Whether to generate Gaussian
+ heatmaps for each keypoint. Defaults to ``False``
+ root_type (str): The method to generate the instance root. Options
+ are:
+
+ - ``'kpt_center'``: Average coordinate of all visible keypoints.
+ - ``'bbox_center'``: Center point of bounding boxes outlined by
+ all visible keypoints.
+
+ Defaults to ``'kpt_center'``
+
+ minimal_diagonal_length (int or float): The threshold of diagonal
+ length of instance bounding box. Small instances will not be
+ used in training. Defaults to 32
+ background_weight (float): Loss weight of background pixels.
+ Defaults to 0.1
+ decode_thr (float): The threshold of keypoint response value in
+ heatmaps. Defaults to 0.01
+ decode_nms_kernel (int): The kernel size of the NMS during decoding,
+ which should be an odd integer. Defaults to 5
+ decode_max_instances (int): The maximum number of instances
+ to decode. Defaults to 30
+
+ .. _`Single-stage multi-person pose machines`:
+ https://arxiv.org/abs/1908.09220
+ """
+
+ def __init__(
+ self,
+ input_size: Tuple[int, int],
+ heatmap_size: Tuple[int, int],
+ sigma: Optional[Union[float, Tuple[float]]] = None,
+ generate_keypoint_heatmaps: bool = False,
+ root_type: str = 'kpt_center',
+ minimal_diagonal_length: Union[int, float] = 5,
+ background_weight: float = 0.1,
+ decode_nms_kernel: int = 5,
+ decode_max_instances: int = 30,
+ decode_thr: float = 0.01,
+ ):
+ super().__init__()
+
+ self.input_size = input_size
+ self.heatmap_size = heatmap_size
+ self.generate_keypoint_heatmaps = generate_keypoint_heatmaps
+ self.root_type = root_type
+ self.minimal_diagonal_length = minimal_diagonal_length
+ self.background_weight = background_weight
+ self.decode_nms_kernel = decode_nms_kernel
+ self.decode_max_instances = decode_max_instances
+ self.decode_thr = decode_thr
+
+ self.scale_factor = (np.array(input_size) /
+ heatmap_size).astype(np.float32)
+
+ if sigma is None:
+ sigma = (heatmap_size[0] * heatmap_size[1])**0.5 / 32
+ if generate_keypoint_heatmaps:
+ # sigma for root heatmap and keypoint heatmaps
+ self.sigma = (sigma, sigma // 2)
+ else:
+ self.sigma = (sigma, )
+ else:
+ if not isinstance(sigma, (tuple, list)):
+ sigma = (sigma, )
+ if generate_keypoint_heatmaps:
+ assert len(sigma) == 2, 'sigma for keypoints must be given ' \
+ 'if `generate_keypoint_heatmaps` ' \
+ 'is True. e.g. sigma=(4, 2)'
+ self.sigma = sigma
+
+ def _get_heatmap_weights(self,
+ heatmaps,
+ fg_weight: float = 1,
+ bg_weight: float = 0):
+ """Generate weight array for heatmaps.
+
+ Args:
+ heatmaps (np.ndarray): Root and keypoint (optional) heatmaps
+ fg_weight (float): Weight for foreground pixels. Defaults to 1.0
+ bg_weight (float): Weight for background pixels. Defaults to 0.0
+
+ Returns:
+ np.ndarray: Heatmap weight array in the same shape with heatmaps
+ """
+ heatmap_weights = np.ones(heatmaps.shape) * bg_weight
+ heatmap_weights[heatmaps > 0] = fg_weight
+ return heatmap_weights
+
+ def encode(self,
+ keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None) -> dict:
+ """Encode keypoints into root heatmaps and keypoint displacement
+ fields. Note that the original keypoint coordinates should be in the
+ input image space.
+
+ Args:
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+
+ Returns:
+ dict:
+ - heatmaps (np.ndarray): The generated heatmap in shape
+ (1, H, W) where [W, H] is the `heatmap_size`. If keypoint
+ heatmaps are generated together, the shape is (K+1, H, W)
+ - heatmap_weights (np.ndarray): The pixel-wise weight for heatmaps
+ which has same shape with `heatmaps`
+ - displacements (np.ndarray): The generated displacement fields in
+ shape (K*D, H, W). The vector on each pixels represents the
+ displacement of keypoints belong to the associated instance
+ from this pixel.
+ - displacement_weights (np.ndarray): The pixel-wise weight for
+ displacements which has same shape with `displacements`
+ """
+
+ if keypoints_visible is None:
+ keypoints_visible = np.ones(keypoints.shape[:2], dtype=np.float32)
+
+ # keypoint coordinates in heatmap
+ _keypoints = keypoints / self.scale_factor
+
+ # compute the root and scale of each instance
+ roots, roots_visible = get_instance_root(_keypoints, keypoints_visible,
+ self.root_type)
+ diagonal_lengths = get_diagonal_lengths(_keypoints, keypoints_visible)
+
+ # discard the small instances
+ roots_visible[diagonal_lengths < self.minimal_diagonal_length] = 0
+
+ # generate heatmaps
+ heatmaps, _ = generate_gaussian_heatmaps(
+ heatmap_size=self.heatmap_size,
+ keypoints=roots[:, None],
+ keypoints_visible=roots_visible[:, None],
+ sigma=self.sigma[0])
+ heatmap_weights = self._get_heatmap_weights(
+ heatmaps, bg_weight=self.background_weight)
+
+ if self.generate_keypoint_heatmaps:
+ keypoint_heatmaps, _ = generate_gaussian_heatmaps(
+ heatmap_size=self.heatmap_size,
+ keypoints=_keypoints,
+ keypoints_visible=keypoints_visible,
+ sigma=self.sigma[1])
+
+ keypoint_heatmaps_weights = self._get_heatmap_weights(
+ keypoint_heatmaps, bg_weight=self.background_weight)
+
+ heatmaps = np.concatenate((keypoint_heatmaps, heatmaps), axis=0)
+ heatmap_weights = np.concatenate(
+ (keypoint_heatmaps_weights, heatmap_weights), axis=0)
+
+ # generate displacements
+ displacements, displacement_weights = \
+ generate_displacement_heatmap(
+ self.heatmap_size,
+ _keypoints,
+ keypoints_visible,
+ roots,
+ roots_visible,
+ diagonal_lengths,
+ self.sigma[0],
+ )
+
+ encoded = dict(
+ heatmaps=heatmaps,
+ heatmap_weights=heatmap_weights,
+ displacements=displacements,
+ displacement_weights=displacement_weights)
+
+ return encoded
+
+ def decode(self, heatmaps: Tensor,
+ displacements: Tensor) -> Tuple[np.ndarray, np.ndarray]:
+ """Decode the keypoint coordinates from heatmaps and displacements. The
+ decoded keypoint coordinates are in the input image space.
+
+ Args:
+ heatmaps (Tensor): Encoded root and keypoints (optional) heatmaps
+ in shape (1, H, W) or (K+1, H, W)
+ displacements (Tensor): Encoded keypoints displacement fields
+ in shape (K*D, H, W)
+
+ Returns:
+ tuple:
+ - keypoints (Tensor): Decoded keypoint coordinates in shape
+ (N, K, D)
+ - scores (tuple):
+ - root_scores (Tensor): The root scores in shape (N, )
+ - keypoint_scores (Tensor): The keypoint scores in
+ shape (N, K). If keypoint heatmaps are not generated,
+ `keypoint_scores` will be `None`
+ """
+ # heatmaps, displacements = encoded
+ _k, h, w = displacements.shape
+ k = _k // 2
+ displacements = displacements.view(k, 2, h, w)
+
+ # convert displacements to a dense keypoint prediction
+ y, x = torch.meshgrid(torch.arange(h), torch.arange(w))
+ regular_grid = torch.stack([x, y], dim=0).to(displacements)
+ posemaps = (regular_grid[None] + displacements).flatten(2)
+
+ # find local maximum on root heatmap
+ root_heatmap_peaks = batch_heatmap_nms(heatmaps[None, -1:],
+ self.decode_nms_kernel)
+ root_scores, pos_idx = root_heatmap_peaks.flatten().topk(
+ self.decode_max_instances)
+ mask = root_scores > self.decode_thr
+ root_scores, pos_idx = root_scores[mask], pos_idx[mask]
+
+ keypoints = posemaps[:, :, pos_idx].permute(2, 0, 1).contiguous()
+
+ if self.generate_keypoint_heatmaps and heatmaps.shape[0] == 1 + k:
+ # compute scores for each keypoint
+ keypoint_scores = self.get_keypoint_scores(heatmaps[:k], keypoints)
+ else:
+ keypoint_scores = None
+
+ keypoints = torch.cat([
+ kpt * self.scale_factor[i]
+ for i, kpt in enumerate(keypoints.split(1, -1))
+ ],
+ dim=-1)
+ return keypoints, (root_scores, keypoint_scores)
+
+ def get_keypoint_scores(self, heatmaps: Tensor, keypoints: Tensor):
+ """Calculate the keypoint scores with keypoints heatmaps and
+ coordinates.
+
+ Args:
+ heatmaps (Tensor): Keypoint heatmaps in shape (K, H, W)
+ keypoints (Tensor): Keypoint coordinates in shape (N, K, D)
+
+ Returns:
+ Tensor: Keypoint scores in [N, K]
+ """
+ k, h, w = heatmaps.shape
+ keypoints = torch.stack((
+ keypoints[..., 0] / (w - 1) * 2 - 1,
+ keypoints[..., 1] / (h - 1) * 2 - 1,
+ ),
+ dim=-1)
+ keypoints = keypoints.transpose(0, 1).unsqueeze(1).contiguous()
+
+ keypoint_scores = torch.nn.functional.grid_sample(
+ heatmaps.unsqueeze(1), keypoints,
+ padding_mode='border').view(k, -1).transpose(0, 1).contiguous()
+
+ return keypoint_scores
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/udp_heatmap.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/udp_heatmap.py
new file mode 100644
index 0000000000000000000000000000000000000000..ccb44a546c455649c7b60d28785e7e326d013478
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/udp_heatmap.py
@@ -0,0 +1,190 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional, Tuple
+
+import cv2
+import numpy as np
+
+from mmpose.registry import KEYPOINT_CODECS
+from .base import BaseKeypointCodec
+from .utils import (generate_offset_heatmap, generate_udp_gaussian_heatmaps,
+ get_heatmap_maximum, refine_keypoints_dark_udp)
+
+
+@KEYPOINT_CODECS.register_module()
+class UDPHeatmap(BaseKeypointCodec):
+ r"""Generate keypoint heatmaps by Unbiased Data Processing (UDP).
+ See the paper: `The Devil is in the Details: Delving into Unbiased Data
+ Processing for Human Pose Estimation`_ by Huang et al (2020) for details.
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+ - image size: [w, h]
+ - heatmap size: [W, H]
+
+ Encoded:
+
+ - heatmap (np.ndarray): The generated heatmap in shape (C_out, H, W)
+ where [W, H] is the `heatmap_size`, and the C_out is the output
+ channel number which depends on the `heatmap_type`. If
+ `heatmap_type=='gaussian'`, C_out equals to keypoint number K;
+ if `heatmap_type=='combined'`, C_out equals to K*3
+ (x_offset, y_offset and class label)
+ - keypoint_weights (np.ndarray): The target weights in shape (K,)
+
+ Args:
+ input_size (tuple): Image size in [w, h]
+ heatmap_size (tuple): Heatmap size in [W, H]
+ heatmap_type (str): The heatmap type to encode the keypoitns. Options
+ are:
+
+ - ``'gaussian'``: Gaussian heatmap
+ - ``'combined'``: Combination of a binary label map and offset
+ maps for X and Y axes.
+
+ sigma (float): The sigma value of the Gaussian heatmap when
+ ``heatmap_type=='gaussian'``. Defaults to 2.0
+ radius_factor (float): The radius factor of the binary label
+ map when ``heatmap_type=='combined'``. The positive region is
+ defined as the neighbor of the keypoit with the radius
+ :math:`r=radius_factor*max(W, H)`. Defaults to 0.0546875
+ blur_kernel_size (int): The Gaussian blur kernel size of the heatmap
+ modulation in DarkPose. Defaults to 11
+
+ .. _`The Devil is in the Details: Delving into Unbiased Data Processing for
+ Human Pose Estimation`: https://arxiv.org/abs/1911.07524
+ """
+
+ def __init__(self,
+ input_size: Tuple[int, int],
+ heatmap_size: Tuple[int, int],
+ heatmap_type: str = 'gaussian',
+ sigma: float = 2.,
+ radius_factor: float = 0.0546875,
+ blur_kernel_size: int = 11) -> None:
+ super().__init__()
+ self.input_size = input_size
+ self.heatmap_size = heatmap_size
+ self.sigma = sigma
+ self.radius_factor = radius_factor
+ self.heatmap_type = heatmap_type
+ self.blur_kernel_size = blur_kernel_size
+ self.scale_factor = ((np.array(input_size) - 1) /
+ (np.array(heatmap_size) - 1)).astype(np.float32)
+
+ if self.heatmap_type not in {'gaussian', 'combined'}:
+ raise ValueError(
+ f'{self.__class__.__name__} got invalid `heatmap_type` value'
+ f'{self.heatmap_type}. Should be one of '
+ '{"gaussian", "combined"}')
+
+ def encode(self,
+ keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None) -> dict:
+ """Encode keypoints into heatmaps. Note that the original keypoint
+ coordinates should be in the input image space.
+
+ Args:
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+
+ Returns:
+ dict:
+ - heatmap (np.ndarray): The generated heatmap in shape
+ (C_out, H, W) where [W, H] is the `heatmap_size`, and the
+ C_out is the output channel number which depends on the
+ `heatmap_type`. If `heatmap_type=='gaussian'`, C_out equals to
+ keypoint number K; if `heatmap_type=='combined'`, C_out
+ equals to K*3 (x_offset, y_offset and class label)
+ - keypoint_weights (np.ndarray): The target weights in shape
+ (K,)
+ """
+ assert keypoints.shape[0] == 1, (
+ f'{self.__class__.__name__} only support single-instance '
+ 'keypoint encoding')
+
+ if keypoints_visible is None:
+ keypoints_visible = np.ones(keypoints.shape[:2], dtype=np.float32)
+
+ if self.heatmap_type == 'gaussian':
+ heatmaps, keypoint_weights = generate_udp_gaussian_heatmaps(
+ heatmap_size=self.heatmap_size,
+ keypoints=keypoints / self.scale_factor,
+ keypoints_visible=keypoints_visible,
+ sigma=self.sigma)
+ elif self.heatmap_type == 'combined':
+ heatmaps, keypoint_weights = generate_offset_heatmap(
+ heatmap_size=self.heatmap_size,
+ keypoints=keypoints / self.scale_factor,
+ keypoints_visible=keypoints_visible,
+ radius_factor=self.radius_factor)
+ else:
+ raise ValueError(
+ f'{self.__class__.__name__} got invalid `heatmap_type` value'
+ f'{self.heatmap_type}. Should be one of '
+ '{"gaussian", "combined"}')
+
+ encoded = dict(heatmaps=heatmaps, keypoint_weights=keypoint_weights)
+
+ return encoded
+
+ def decode(self, encoded: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
+ """Decode keypoint coordinates from heatmaps. The decoded keypoint
+ coordinates are in the input image space.
+
+ Args:
+ encoded (np.ndarray): Heatmaps in shape (K, H, W)
+
+ Returns:
+ tuple:
+ - keypoints (np.ndarray): Decoded keypoint coordinates in shape
+ (N, K, D)
+ - scores (np.ndarray): The keypoint scores in shape (N, K). It
+ usually represents the confidence of the keypoint prediction
+ """
+ heatmaps = encoded.copy()
+
+ if self.heatmap_type == 'gaussian':
+ keypoints, scores = get_heatmap_maximum(heatmaps)
+ # unsqueeze the instance dimension for single-instance results
+ keypoints = keypoints[None]
+ scores = scores[None]
+
+ keypoints = refine_keypoints_dark_udp(
+ keypoints, heatmaps, blur_kernel_size=self.blur_kernel_size)
+
+ elif self.heatmap_type == 'combined':
+ _K, H, W = heatmaps.shape
+ K = _K // 3
+
+ for cls_heatmap in heatmaps[::3]:
+ # Apply Gaussian blur on classification maps
+ ks = 2 * self.blur_kernel_size + 1
+ cv2.GaussianBlur(cls_heatmap, (ks, ks), 0, cls_heatmap)
+
+ # valid radius
+ radius = self.radius_factor * max(W, H)
+
+ x_offset = heatmaps[1::3].flatten() * radius
+ y_offset = heatmaps[2::3].flatten() * radius
+ keypoints, scores = get_heatmap_maximum(heatmaps=heatmaps[::3])
+ index = (keypoints[..., 0] + keypoints[..., 1] * W).flatten()
+ index += W * H * np.arange(0, K)
+ index = index.astype(int)
+ keypoints += np.stack((x_offset[index], y_offset[index]), axis=-1)
+ # unsqueeze the instance dimension for single-instance results
+ keypoints = keypoints[None].astype(np.float32)
+ scores = scores[None]
+
+ W, H = self.heatmap_size
+ keypoints = keypoints / [W - 1, H - 1] * self.input_size
+
+ return keypoints, scores
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..c08a03d1f832c411888228a7dacfc158d9969d16
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__init__.py
@@ -0,0 +1,28 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .gaussian_heatmap import (generate_gaussian_heatmaps,
+ generate_udp_gaussian_heatmaps,
+ generate_unbiased_gaussian_heatmaps)
+from .instance_property import (get_diagonal_lengths, get_instance_bbox,
+ get_instance_root)
+from .offset_heatmap import (generate_displacement_heatmap,
+ generate_offset_heatmap)
+from .post_processing import (batch_heatmap_nms, gaussian_blur,
+ gaussian_blur1d, get_heatmap_maximum,
+ get_simcc_maximum, get_simcc_normalized)
+from .refinement import (refine_keypoints, refine_keypoints_dark,
+ refine_keypoints_dark_udp, refine_simcc_dark)
+
+__all__ = [
+ 'generate_gaussian_heatmaps', 'generate_udp_gaussian_heatmaps',
+ 'generate_unbiased_gaussian_heatmaps', 'gaussian_blur',
+ 'get_heatmap_maximum', 'get_simcc_maximum', 'generate_offset_heatmap',
+ 'batch_heatmap_nms', 'refine_keypoints', 'refine_keypoints_dark',
+ 'refine_keypoints_dark_udp', 'generate_displacement_heatmap',
+ 'refine_simcc_dark', 'gaussian_blur1d', 'get_diagonal_lengths',
+ 'get_instance_root', 'get_instance_bbox', 'get_simcc_normalized'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..022460453d0eaea1cee5d8384e5f18f7cb6573e5
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/gaussian_heatmap.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/gaussian_heatmap.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fd2c31c935d91b94d9e4494f05695b942eb4b991
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/gaussian_heatmap.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/instance_property.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/instance_property.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7da894cd25f1245608bb6dcce0893e8f93e03809
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/instance_property.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/offset_heatmap.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/offset_heatmap.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ffbb67341f60818cc3995c4cdadc4e8b689088d3
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/offset_heatmap.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/post_processing.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/post_processing.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..428dc424174ddff70575a0a9507284cdbcacd55c
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/post_processing.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/refinement.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/refinement.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d5e0a445d4050430d6fcecf1257bdeb4f6f9215e
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/__pycache__/refinement.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/gaussian_heatmap.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/gaussian_heatmap.py
new file mode 100644
index 0000000000000000000000000000000000000000..cfa01424f970b4b48103d36c9d996de8339168b0
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/gaussian_heatmap.py
@@ -0,0 +1,232 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from itertools import product
+from typing import Tuple, Union
+
+import numpy as np
+
+
+def generate_gaussian_heatmaps(
+ heatmap_size: Tuple[int, int],
+ keypoints: np.ndarray,
+ keypoints_visible: np.ndarray,
+ sigma: Union[float, Tuple[float], np.ndarray],
+) -> Tuple[np.ndarray, np.ndarray]:
+ """Generate gaussian heatmaps of keypoints.
+
+ Args:
+ heatmap_size (Tuple[int, int]): Heatmap size in [W, H]
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+ sigma (float or List[float]): A list of sigma values of the Gaussian
+ heatmap for each instance. If sigma is given as a single float
+ value, it will be expanded into a tuple
+
+ Returns:
+ tuple:
+ - heatmaps (np.ndarray): The generated heatmap in shape
+ (K, H, W) where [W, H] is the `heatmap_size`
+ - keypoint_weights (np.ndarray): The target weights in shape
+ (N, K)
+ """
+
+ N, K, _ = keypoints.shape
+ W, H = heatmap_size
+
+ heatmaps = np.zeros((K, H, W), dtype=np.float32)
+ keypoint_weights = keypoints_visible.copy()
+
+ if isinstance(sigma, (int, float)):
+ sigma = (sigma, ) * N
+
+ for n in range(N):
+ # 3-sigma rule
+ radius = sigma[n] * 3
+
+ # xy grid
+ gaussian_size = 2 * radius + 1
+ x = np.arange(0, gaussian_size, 1, dtype=np.float32)
+ y = x[:, None]
+ x0 = y0 = gaussian_size // 2
+
+ for k in range(K):
+ # skip unlabled keypoints
+ if keypoints_visible[n, k] < 0.5:
+ continue
+
+ # get gaussian center coordinates
+ mu = (keypoints[n, k] + 0.5).astype(np.int64)
+
+ # check that the gaussian has in-bounds part
+ left, top = (mu - radius).astype(np.int64)
+ right, bottom = (mu + radius + 1).astype(np.int64)
+
+ if left >= W or top >= H or right < 0 or bottom < 0:
+ keypoint_weights[n, k] = 0
+ continue
+
+ # The gaussian is not normalized,
+ # we want the center value to equal 1
+ gaussian = np.exp(-((x - x0)**2 + (y - y0)**2) / (2 * sigma[n]**2))
+
+ # valid range in gaussian
+ g_x1 = max(0, -left)
+ g_x2 = min(W, right) - left
+ g_y1 = max(0, -top)
+ g_y2 = min(H, bottom) - top
+
+ # valid range in heatmap
+ h_x1 = max(0, left)
+ h_x2 = min(W, right)
+ h_y1 = max(0, top)
+ h_y2 = min(H, bottom)
+
+ heatmap_region = heatmaps[k, h_y1:h_y2, h_x1:h_x2]
+ gaussian_regsion = gaussian[g_y1:g_y2, g_x1:g_x2]
+
+ _ = np.maximum(
+ heatmap_region, gaussian_regsion, out=heatmap_region)
+
+ return heatmaps, keypoint_weights
+
+
+def generate_unbiased_gaussian_heatmaps(
+ heatmap_size: Tuple[int, int],
+ keypoints: np.ndarray,
+ keypoints_visible: np.ndarray,
+ sigma: float,
+) -> Tuple[np.ndarray, np.ndarray]:
+ """Generate gaussian heatmaps of keypoints using `Dark Pose`_.
+
+ Args:
+ heatmap_size (Tuple[int, int]): Heatmap size in [W, H]
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+
+ Returns:
+ tuple:
+ - heatmaps (np.ndarray): The generated heatmap in shape
+ (K, H, W) where [W, H] is the `heatmap_size`
+ - keypoint_weights (np.ndarray): The target weights in shape
+ (N, K)
+
+ .. _`Dark Pose`: https://arxiv.org/abs/1910.06278
+ """
+
+ N, K, _ = keypoints.shape
+ W, H = heatmap_size
+
+ heatmaps = np.zeros((K, H, W), dtype=np.float32)
+ keypoint_weights = keypoints_visible.copy()
+
+ # 3-sigma rule
+ radius = sigma * 3
+
+ # xy grid
+ x = np.arange(0, W, 1, dtype=np.float32)
+ y = np.arange(0, H, 1, dtype=np.float32)[:, None]
+
+ for n, k in product(range(N), range(K)):
+ # skip unlabled keypoints
+ if keypoints_visible[n, k] < 0.5:
+ continue
+
+ mu = keypoints[n, k]
+ # check that the gaussian has in-bounds part
+ left, top = mu - radius
+ right, bottom = mu + radius + 1
+
+ if left >= W or top >= H or right < 0 or bottom < 0:
+ keypoint_weights[n, k] = 0
+ continue
+
+ gaussian = np.exp(-((x - mu[0])**2 + (y - mu[1])**2) / (2 * sigma**2))
+
+ _ = np.maximum(gaussian, heatmaps[k], out=heatmaps[k])
+
+ return heatmaps, keypoint_weights
+
+
+def generate_udp_gaussian_heatmaps(
+ heatmap_size: Tuple[int, int],
+ keypoints: np.ndarray,
+ keypoints_visible: np.ndarray,
+ sigma: float,
+) -> Tuple[np.ndarray, np.ndarray]:
+ """Generate gaussian heatmaps of keypoints using `UDP`_.
+
+ Args:
+ heatmap_size (Tuple[int, int]): Heatmap size in [W, H]
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+ sigma (float): The sigma value of the Gaussian heatmap
+
+ Returns:
+ tuple:
+ - heatmaps (np.ndarray): The generated heatmap in shape
+ (K, H, W) where [W, H] is the `heatmap_size`
+ - keypoint_weights (np.ndarray): The target weights in shape
+ (N, K)
+
+ .. _`UDP`: https://arxiv.org/abs/1911.07524
+ """
+
+ N, K, _ = keypoints.shape
+ W, H = heatmap_size
+
+ heatmaps = np.zeros((K, H, W), dtype=np.float32)
+ keypoint_weights = keypoints_visible.copy()
+
+ # 3-sigma rule
+ radius = sigma * 3
+
+ # xy grid
+ gaussian_size = 2 * radius + 1
+ x = np.arange(0, gaussian_size, 1, dtype=np.float32)
+ y = x[:, None]
+
+ for n, k in product(range(N), range(K)):
+ # skip unlabled keypoints
+ if keypoints_visible[n, k] < 0.5:
+ continue
+
+ mu = (keypoints[n, k] + 0.5).astype(np.int64)
+ # check that the gaussian has in-bounds part
+ left, top = (mu - radius).astype(np.int64)
+ right, bottom = (mu + radius + 1).astype(np.int64)
+
+ if left >= W or top >= H or right < 0 or bottom < 0:
+ keypoint_weights[n, k] = 0
+ continue
+
+ mu_ac = keypoints[n, k]
+ x0 = y0 = gaussian_size // 2
+ x0 += mu_ac[0] - mu[0]
+ y0 += mu_ac[1] - mu[1]
+ gaussian = np.exp(-((x - x0)**2 + (y - y0)**2) / (2 * sigma**2))
+
+ # valid range in gaussian
+ g_x1 = max(0, -left)
+ g_x2 = min(W, right) - left
+ g_y1 = max(0, -top)
+ g_y2 = min(H, bottom) - top
+
+ # valid range in heatmap
+ h_x1 = max(0, left)
+ h_x2 = min(W, right)
+ h_y1 = max(0, top)
+ h_y2 = min(H, bottom)
+
+ heatmap_region = heatmaps[k, h_y1:h_y2, h_x1:h_x2]
+ gaussian_regsion = gaussian[g_y1:g_y2, g_x1:g_x2]
+
+ _ = np.maximum(heatmap_region, gaussian_regsion, out=heatmap_region)
+
+ return heatmaps, keypoint_weights
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/instance_property.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/instance_property.py
new file mode 100644
index 0000000000000000000000000000000000000000..4ba6180d43b5533208ddf022dbae5d4bf7b31064
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/instance_property.py
@@ -0,0 +1,116 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional
+
+import numpy as np
+
+
+def get_instance_root(keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None,
+ root_type: str = 'kpt_center') -> np.ndarray:
+ """Calculate the coordinates and visibility of instance roots.
+
+ Args:
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+ root_type (str): Calculation of instance roots which should
+ be one of the following options:
+
+ - ``'kpt_center'``: The roots' coordinates are the mean
+ coordinates of visible keypoints
+ - ``'bbox_center'``: The roots' are the center of bounding
+ boxes outlined by visible keypoints
+
+ Defaults to ``'kpt_center'``
+
+ Returns:
+ tuple
+ - roots_coordinate(np.ndarray): Coordinates of instance roots in
+ shape [N, D]
+ - roots_visible(np.ndarray): Visibility of instance roots in
+ shape [N]
+ """
+
+ roots_coordinate = np.zeros((keypoints.shape[0], 2), dtype=np.float32)
+ roots_visible = np.ones((keypoints.shape[0]), dtype=np.float32) * 2
+
+ for i in range(keypoints.shape[0]):
+
+ # collect visible keypoints
+ if keypoints_visible is not None:
+ visible_keypoints = keypoints[i][keypoints_visible[i] > 0]
+ else:
+ visible_keypoints = keypoints[i]
+ if visible_keypoints.size == 0:
+ roots_visible[i] = 0
+ continue
+
+ # compute the instance root with visible keypoints
+ if root_type == 'kpt_center':
+ roots_coordinate[i] = visible_keypoints.mean(axis=0)
+ roots_visible[i] = 1
+ elif root_type == 'bbox_center':
+ roots_coordinate[i] = (visible_keypoints.max(axis=0) +
+ visible_keypoints.min(axis=0)) / 2.0
+ roots_visible[i] = 1
+ else:
+ raise ValueError(
+ f'the value of `root_type` must be \'kpt_center\' or '
+ f'\'bbox_center\', but got \'{root_type}\'')
+
+ return roots_coordinate, roots_visible
+
+
+def get_instance_bbox(keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None
+ ) -> np.ndarray:
+ """Calculate the pseudo instance bounding box from visible keypoints. The
+ bounding boxes are in the xyxy format.
+
+ Args:
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+
+ Returns:
+ np.ndarray: bounding boxes in [N, 4]
+ """
+ bbox = np.zeros((keypoints.shape[0], 4), dtype=np.float32)
+ for i in range(keypoints.shape[0]):
+ if keypoints_visible is not None:
+ visible_keypoints = keypoints[i][keypoints_visible[i] > 0]
+ else:
+ visible_keypoints = keypoints[i]
+ if visible_keypoints.size == 0:
+ continue
+
+ bbox[i, :2] = visible_keypoints.min(axis=0)
+ bbox[i, 2:] = visible_keypoints.max(axis=0)
+ return bbox
+
+
+def get_diagonal_lengths(keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None
+ ) -> np.ndarray:
+ """Calculate the diagonal length of instance bounding box from visible
+ keypoints.
+
+ Args:
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+
+ Returns:
+ np.ndarray: bounding box diagonal length in [N]
+ """
+ pseudo_bbox = get_instance_bbox(keypoints, keypoints_visible)
+ pseudo_bbox = pseudo_bbox.reshape(-1, 2, 2)
+ h_w_diff = pseudo_bbox[:, 1] - pseudo_bbox[:, 0]
+ diagonal_length = np.sqrt(np.power(h_w_diff, 2).sum(axis=1))
+
+ return diagonal_length
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/offset_heatmap.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/offset_heatmap.py
new file mode 100644
index 0000000000000000000000000000000000000000..c1c5e0701abf9781b5e32557a12540492b10d5e5
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/offset_heatmap.py
@@ -0,0 +1,148 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from itertools import product
+from typing import Tuple
+
+import numpy as np
+
+
+def generate_offset_heatmap(
+ heatmap_size: Tuple[int, int],
+ keypoints: np.ndarray,
+ keypoints_visible: np.ndarray,
+ radius_factor: float,
+) -> Tuple[np.ndarray, np.ndarray]:
+ """Generate offset heatmaps of keypoints, where each keypoint is
+ represented by 3 maps: one pixel-level class label map (1 for keypoint and
+ 0 for non-keypoint) and 2 pixel-level offset maps for x and y directions
+ respectively.
+
+ Args:
+ heatmap_size (Tuple[int, int]): Heatmap size in [W, H]
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+ radius_factor (float): The radius factor of the binary label
+ map. The positive region is defined as the neighbor of the
+ keypoint with the radius :math:`r=radius_factor*max(W, H)`
+
+ Returns:
+ tuple:
+ - heatmap (np.ndarray): The generated heatmap in shape
+ (K*3, H, W) where [W, H] is the `heatmap_size`
+ - keypoint_weights (np.ndarray): The target weights in shape
+ (K,)
+ """
+
+ N, K, _ = keypoints.shape
+ W, H = heatmap_size
+
+ heatmaps = np.zeros((K, 3, H, W), dtype=np.float32)
+ keypoint_weights = keypoints_visible.copy()
+
+ # xy grid
+ x = np.arange(0, W, 1)
+ y = np.arange(0, H, 1)[:, None]
+
+ # positive area radius in the classification map
+ radius = radius_factor * max(W, H)
+
+ for n, k in product(range(N), range(K)):
+ if keypoints_visible[n, k] < 0.5:
+ continue
+
+ mu = keypoints[n, k]
+
+ x_offset = (mu[0] - x) / radius
+ y_offset = (mu[1] - y) / radius
+
+ heatmaps[k, 0] = np.where(x_offset**2 + y_offset**2 <= 1, 1., 0.)
+ heatmaps[k, 1] = x_offset
+ heatmaps[k, 2] = y_offset
+
+ heatmaps = heatmaps.reshape(K * 3, H, W)
+
+ return heatmaps, keypoint_weights
+
+
+def generate_displacement_heatmap(
+ heatmap_size: Tuple[int, int],
+ keypoints: np.ndarray,
+ keypoints_visible: np.ndarray,
+ roots: np.ndarray,
+ roots_visible: np.ndarray,
+ diagonal_lengths: np.ndarray,
+ radius: float,
+):
+ """Generate displacement heatmaps of keypoints, where each keypoint is
+ represented by 3 maps: one pixel-level class label map (1 for keypoint and
+ 0 for non-keypoint) and 2 pixel-level offset maps for x and y directions
+ respectively.
+
+ Args:
+ heatmap_size (Tuple[int, int]): Heatmap size in [W, H]
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D)
+ keypoints_visible (np.ndarray): Keypoint visibilities in shape
+ (N, K)
+ roots (np.ndarray): Coordinates of instance centers in shape (N, D).
+ The displacement fields of each instance will locate around its
+ center.
+ roots_visible (np.ndarray): Roots visibilities in shape (N,)
+ diagonal_lengths (np.ndarray): Diaginal length of the bounding boxes
+ of each instance in shape (N,)
+ radius (float): The radius factor of the binary label
+ map. The positive region is defined as the neighbor of the
+ keypoint with the radius :math:`r=radius_factor*max(W, H)`
+
+ Returns:
+ tuple:
+ - displacements (np.ndarray): The generated displacement map in
+ shape (K*2, H, W) where [W, H] is the `heatmap_size`
+ - displacement_weights (np.ndarray): The target weights in shape
+ (K*2, H, W)
+ """
+ N, K, _ = keypoints.shape
+ W, H = heatmap_size
+
+ displacements = np.zeros((K * 2, H, W), dtype=np.float32)
+ displacement_weights = np.zeros((K * 2, H, W), dtype=np.float32)
+ instance_size_map = np.zeros((H, W), dtype=np.float32)
+
+ for n in range(N):
+ if (roots_visible[n] < 1 or (roots[n, 0] < 0 or roots[n, 1] < 0)
+ or (roots[n, 0] >= W or roots[n, 1] >= H)):
+ continue
+
+ diagonal_length = diagonal_lengths[n]
+
+ for k in range(K):
+ if keypoints_visible[n, k] < 1 or keypoints[n, k, 0] < 0 \
+ or keypoints[n, k, 1] < 0 or keypoints[n, k, 0] >= W \
+ or keypoints[n, k, 1] >= H:
+ continue
+
+ start_x = max(int(roots[n, 0] - radius), 0)
+ start_y = max(int(roots[n, 1] - radius), 0)
+ end_x = min(int(roots[n, 0] + radius), W)
+ end_y = min(int(roots[n, 1] + radius), H)
+
+ for x in range(start_x, end_x):
+ for y in range(start_y, end_y):
+ if displacements[2 * k, y,
+ x] != 0 or displacements[2 * k + 1, y,
+ x] != 0:
+ if diagonal_length > instance_size_map[y, x]:
+ # keep the gt displacement of smaller instance
+ continue
+
+ displacement_weights[2 * k:2 * k + 2, y,
+ x] = 1 / diagonal_length
+ displacements[2 * k:2 * k + 2, y,
+ x] = keypoints[n, k] - [x, y]
+ instance_size_map[y, x] = diagonal_length
+
+ return displacements, displacement_weights
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/post_processing.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/post_processing.py
new file mode 100644
index 0000000000000000000000000000000000000000..a8c6b9cf251beb9441aceef9440a11bfee45e541
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/post_processing.py
@@ -0,0 +1,232 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from itertools import product
+from typing import Tuple
+
+import cv2
+import numpy as np
+import torch
+import torch.nn.functional as F
+from torch import Tensor
+
+
+def get_simcc_normalized(batch_pred_simcc, sigma=None):
+ """Normalize the predicted SimCC.
+
+ Args:
+ batch_pred_simcc (torch.Tensor): The predicted SimCC.
+ sigma (float): The sigma of the Gaussian distribution.
+
+ Returns:
+ torch.Tensor: The normalized SimCC.
+ """
+ B, K, _ = batch_pred_simcc.shape
+
+ # Scale and clamp the tensor
+ if sigma is not None:
+ batch_pred_simcc = batch_pred_simcc / (sigma * np.sqrt(np.pi * 2))
+ batch_pred_simcc = batch_pred_simcc.clamp(min=0)
+
+ # Compute the binary mask
+ mask = (batch_pred_simcc.amax(dim=-1) > 1).reshape(B, K, 1)
+
+ # Normalize the tensor using the maximum value
+ norm = (batch_pred_simcc / batch_pred_simcc.amax(dim=-1).reshape(B, K, 1))
+
+ # Apply normalization
+ batch_pred_simcc = torch.where(mask, norm, batch_pred_simcc)
+
+ return batch_pred_simcc
+
+
+def get_simcc_maximum(simcc_x: np.ndarray,
+ simcc_y: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
+ """Get maximum response location and value from simcc representations.
+
+ Note:
+ instance number: N
+ num_keypoints: K
+ heatmap height: H
+ heatmap width: W
+
+ Args:
+ simcc_x (np.ndarray): x-axis SimCC in shape (K, Wx) or (N, K, Wx)
+ simcc_y (np.ndarray): y-axis SimCC in shape (K, Wy) or (N, K, Wy)
+
+ Returns:
+ tuple:
+ - locs (np.ndarray): locations of maximum heatmap responses in shape
+ (K, 2) or (N, K, 2)
+ - vals (np.ndarray): values of maximum heatmap responses in shape
+ (K,) or (N, K)
+ """
+
+ assert isinstance(simcc_x, np.ndarray), ('simcc_x should be numpy.ndarray')
+ assert isinstance(simcc_y, np.ndarray), ('simcc_y should be numpy.ndarray')
+ assert simcc_x.ndim == 2 or simcc_x.ndim == 3, (
+ f'Invalid shape {simcc_x.shape}')
+ assert simcc_y.ndim == 2 or simcc_y.ndim == 3, (
+ f'Invalid shape {simcc_y.shape}')
+ assert simcc_x.ndim == simcc_y.ndim, (
+ f'{simcc_x.shape} != {simcc_y.shape}')
+
+ if simcc_x.ndim == 3:
+ N, K, Wx = simcc_x.shape
+ simcc_x = simcc_x.reshape(N * K, -1)
+ simcc_y = simcc_y.reshape(N * K, -1)
+ else:
+ N = None
+
+ x_locs = np.argmax(simcc_x, axis=1)
+ y_locs = np.argmax(simcc_y, axis=1)
+ locs = np.stack((x_locs, y_locs), axis=-1).astype(np.float32)
+ max_val_x = np.amax(simcc_x, axis=1)
+ max_val_y = np.amax(simcc_y, axis=1)
+
+ mask = max_val_x > max_val_y
+ max_val_x[mask] = max_val_y[mask]
+ vals = max_val_x
+ locs[vals <= 0.] = -1
+
+ if N:
+ locs = locs.reshape(N, K, 2)
+ vals = vals.reshape(N, K)
+
+ return locs, vals
+
+
+def get_heatmap_maximum(heatmaps: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
+ """Get maximum response location and value from heatmaps.
+
+ Note:
+ batch_size: B
+ num_keypoints: K
+ heatmap height: H
+ heatmap width: W
+
+ Args:
+ heatmaps (np.ndarray): Heatmaps in shape (K, H, W) or (B, K, H, W)
+
+ Returns:
+ tuple:
+ - locs (np.ndarray): locations of maximum heatmap responses in shape
+ (K, 2) or (B, K, 2)
+ - vals (np.ndarray): values of maximum heatmap responses in shape
+ (K,) or (B, K)
+ """
+ assert isinstance(heatmaps,
+ np.ndarray), ('heatmaps should be numpy.ndarray')
+ assert heatmaps.ndim == 3 or heatmaps.ndim == 4, (
+ f'Invalid shape {heatmaps.shape}')
+
+ if heatmaps.ndim == 3:
+ K, H, W = heatmaps.shape
+ B = None
+ heatmaps_flatten = heatmaps.reshape(K, -1)
+ else:
+ B, K, H, W = heatmaps.shape
+ heatmaps_flatten = heatmaps.reshape(B * K, -1)
+
+ y_locs, x_locs = np.unravel_index(
+ np.argmax(heatmaps_flatten, axis=1), shape=(H, W))
+ locs = np.stack((x_locs, y_locs), axis=-1).astype(np.float32)
+ vals = np.amax(heatmaps_flatten, axis=1)
+ locs[vals <= 0.] = -1
+
+ if B:
+ locs = locs.reshape(B, K, 2)
+ vals = vals.reshape(B, K)
+
+ return locs, vals
+
+
+def gaussian_blur(heatmaps: np.ndarray, kernel: int = 11) -> np.ndarray:
+ """Modulate heatmap distribution with Gaussian.
+
+ Note:
+ - num_keypoints: K
+ - heatmap height: H
+ - heatmap width: W
+
+ Args:
+ heatmaps (np.ndarray[K, H, W]): model predicted heatmaps.
+ kernel (int): Gaussian kernel size (K) for modulation, which should
+ match the heatmap gaussian sigma when training.
+ K=17 for sigma=3 and k=11 for sigma=2.
+
+ Returns:
+ np.ndarray ([K, H, W]): Modulated heatmap distribution.
+ """
+ assert kernel % 2 == 1
+
+ border = (kernel - 1) // 2
+ K, H, W = heatmaps.shape
+
+ for k in range(K):
+ origin_max = np.max(heatmaps[k])
+ dr = np.zeros((H + 2 * border, W + 2 * border), dtype=np.float32)
+ dr[border:-border, border:-border] = heatmaps[k].copy()
+ dr = cv2.GaussianBlur(dr, (kernel, kernel), 0)
+ heatmaps[k] = dr[border:-border, border:-border].copy()
+ heatmaps[k] *= origin_max / np.max(heatmaps[k])
+ return heatmaps
+
+
+def gaussian_blur1d(simcc: np.ndarray, kernel: int = 11) -> np.ndarray:
+ """Modulate simcc distribution with Gaussian.
+
+ Note:
+ - num_keypoints: K
+ - simcc length: Wx
+
+ Args:
+ simcc (np.ndarray[K, Wx]): model predicted simcc.
+ kernel (int): Gaussian kernel size (K) for modulation, which should
+ match the simcc gaussian sigma when training.
+ K=17 for sigma=3 and k=11 for sigma=2.
+
+ Returns:
+ np.ndarray ([K, Wx]): Modulated simcc distribution.
+ """
+ assert kernel % 2 == 1
+
+ border = (kernel - 1) // 2
+ N, K, Wx = simcc.shape
+
+ for n, k in product(range(N), range(K)):
+ origin_max = np.max(simcc[n, k])
+ dr = np.zeros((1, Wx + 2 * border), dtype=np.float32)
+ dr[0, border:-border] = simcc[n, k].copy()
+ dr = cv2.GaussianBlur(dr, (kernel, 1), 0)
+ simcc[n, k] = dr[0, border:-border].copy()
+ simcc[n, k] *= origin_max / np.max(simcc[n, k])
+ return simcc
+
+
+def batch_heatmap_nms(batch_heatmaps: Tensor, kernel_size: int = 5):
+ """Apply NMS on a batch of heatmaps.
+
+ Args:
+ batch_heatmaps (Tensor): batch heatmaps in shape (B, K, H, W)
+ kernel_size (int): The kernel size of the NMS which should be
+ a odd integer. Defaults to 5
+
+ Returns:
+ Tensor: The batch heatmaps after NMS.
+ """
+
+ assert isinstance(kernel_size, int) and kernel_size % 2 == 1, \
+ f'The kernel_size should be an odd integer, got {kernel_size}'
+
+ padding = (kernel_size - 1) // 2
+
+ maximum = F.max_pool2d(
+ batch_heatmaps, kernel_size, stride=1, padding=padding)
+ maximum_indicator = torch.eq(batch_heatmaps, maximum)
+ batch_heatmaps = batch_heatmaps * maximum_indicator.float()
+
+ return batch_heatmaps
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/refinement.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/refinement.py
new file mode 100644
index 0000000000000000000000000000000000000000..ce90c8969fe6f75e6ab1948fb41b2cf558454f01
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/utils/refinement.py
@@ -0,0 +1,220 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from itertools import product
+
+import numpy as np
+
+from .post_processing import gaussian_blur, gaussian_blur1d
+
+
+def refine_keypoints(keypoints: np.ndarray,
+ heatmaps: np.ndarray) -> np.ndarray:
+ """Refine keypoint predictions by moving from the maximum towards the
+ second maximum by 0.25 pixel. The operation is in-place.
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+ - heatmap size: [W, H]
+
+ Args:
+ keypoints (np.ndarray): The keypoint coordinates in shape (N, K, D)
+ heatmaps (np.ndarray): The heatmaps in shape (K, H, W)
+
+ Returns:
+ np.ndarray: Refine keypoint coordinates in shape (N, K, D)
+ """
+ N, K = keypoints.shape[:2]
+ H, W = heatmaps.shape[1:]
+
+ for n, k in product(range(N), range(K)):
+ x, y = keypoints[n, k, :2].astype(int)
+
+ if 1 < x < W - 1 and 0 < y < H:
+ dx = heatmaps[k, y, x + 1] - heatmaps[k, y, x - 1]
+ else:
+ dx = 0.
+
+ if 1 < y < H - 1 and 0 < x < W:
+ dy = heatmaps[k, y + 1, x] - heatmaps[k, y - 1, x]
+ else:
+ dy = 0.
+
+ keypoints[n, k] += np.sign([dx, dy], dtype=np.float32) * 0.25
+
+ return keypoints
+
+
+def refine_keypoints_dark(keypoints: np.ndarray, heatmaps: np.ndarray,
+ blur_kernel_size: int) -> np.ndarray:
+ """Refine keypoint predictions using distribution aware coordinate
+ decoding. See `Dark Pose`_ for details. The operation is in-place.
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+ - heatmap size: [W, H]
+
+ Args:
+ keypoints (np.ndarray): The keypoint coordinates in shape (N, K, D)
+ heatmaps (np.ndarray): The heatmaps in shape (K, H, W)
+ blur_kernel_size (int): The Gaussian blur kernel size of the heatmap
+ modulation
+
+ Returns:
+ np.ndarray: Refine keypoint coordinates in shape (N, K, D)
+
+ .. _`Dark Pose`: https://arxiv.org/abs/1910.06278
+ """
+ N, K = keypoints.shape[:2]
+ H, W = heatmaps.shape[1:]
+
+ # modulate heatmaps
+ heatmaps = gaussian_blur(heatmaps, blur_kernel_size)
+ np.maximum(heatmaps, 1e-10, heatmaps)
+ np.log(heatmaps, heatmaps)
+
+ for n, k in product(range(N), range(K)):
+ x, y = keypoints[n, k, :2].astype(int)
+ if 1 < x < W - 2 and 1 < y < H - 2:
+ dx = 0.5 * (heatmaps[k, y, x + 1] - heatmaps[k, y, x - 1])
+ dy = 0.5 * (heatmaps[k, y + 1, x] - heatmaps[k, y - 1, x])
+
+ dxx = 0.25 * (
+ heatmaps[k, y, x + 2] - 2 * heatmaps[k, y, x] +
+ heatmaps[k, y, x - 2])
+ dxy = 0.25 * (
+ heatmaps[k, y + 1, x + 1] - heatmaps[k, y - 1, x + 1] -
+ heatmaps[k, y + 1, x - 1] + heatmaps[k, y - 1, x - 1])
+ dyy = 0.25 * (
+ heatmaps[k, y + 2, x] - 2 * heatmaps[k, y, x] +
+ heatmaps[k, y - 2, x])
+ derivative = np.array([[dx], [dy]])
+ hessian = np.array([[dxx, dxy], [dxy, dyy]])
+ if dxx * dyy - dxy**2 != 0:
+ hessianinv = np.linalg.inv(hessian)
+ offset = -hessianinv @ derivative
+ offset = np.squeeze(np.array(offset.T), axis=0)
+ keypoints[n, k, :2] += offset
+ return keypoints
+
+
+def refine_keypoints_dark_udp(keypoints: np.ndarray, heatmaps: np.ndarray,
+ blur_kernel_size: int) -> np.ndarray:
+ """Refine keypoint predictions using distribution aware coordinate decoding
+ for UDP. See `UDP`_ for details. The operation is in-place.
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+ - heatmap size: [W, H]
+
+ Args:
+ keypoints (np.ndarray): The keypoint coordinates in shape (N, K, D)
+ heatmaps (np.ndarray): The heatmaps in shape (K, H, W)
+ blur_kernel_size (int): The Gaussian blur kernel size of the heatmap
+ modulation
+
+ Returns:
+ np.ndarray: Refine keypoint coordinates in shape (N, K, D)
+
+ .. _`UDP`: https://arxiv.org/abs/1911.07524
+ """
+ N, K = keypoints.shape[:2]
+ H, W = heatmaps.shape[1:]
+
+ # modulate heatmaps
+ heatmaps = gaussian_blur(heatmaps, blur_kernel_size)
+ np.clip(heatmaps, 1e-3, 50., heatmaps)
+ np.log(heatmaps, heatmaps)
+
+ heatmaps_pad = np.pad(
+ heatmaps, ((0, 0), (1, 1), (1, 1)), mode='edge').flatten()
+
+ for n in range(N):
+ index = keypoints[n, :, 0] + 1 + (keypoints[n, :, 1] + 1) * (W + 2)
+ index += (W + 2) * (H + 2) * np.arange(0, K)
+ index = index.astype(int).reshape(-1, 1)
+ i_ = heatmaps_pad[index]
+ ix1 = heatmaps_pad[index + 1]
+ iy1 = heatmaps_pad[index + W + 2]
+ ix1y1 = heatmaps_pad[index + W + 3]
+ ix1_y1_ = heatmaps_pad[index - W - 3]
+ ix1_ = heatmaps_pad[index - 1]
+ iy1_ = heatmaps_pad[index - 2 - W]
+
+ dx = 0.5 * (ix1 - ix1_)
+ dy = 0.5 * (iy1 - iy1_)
+ derivative = np.concatenate([dx, dy], axis=1)
+ derivative = derivative.reshape(K, 2, 1)
+
+ dxx = ix1 - 2 * i_ + ix1_
+ dyy = iy1 - 2 * i_ + iy1_
+ dxy = 0.5 * (ix1y1 - ix1 - iy1 + i_ + i_ - ix1_ - iy1_ + ix1_y1_)
+ hessian = np.concatenate([dxx, dxy, dxy, dyy], axis=1)
+ hessian = hessian.reshape(K, 2, 2)
+ hessian = np.linalg.inv(hessian + np.finfo(np.float32).eps * np.eye(2))
+ keypoints[n] -= np.einsum('imn,ink->imk', hessian,
+ derivative).squeeze()
+
+ return keypoints
+
+
+def refine_simcc_dark(keypoints: np.ndarray, simcc: np.ndarray,
+ blur_kernel_size: int) -> np.ndarray:
+ """SimCC version. Refine keypoint predictions using distribution aware
+ coordinate decoding for UDP. See `UDP`_ for details. The operation is in-
+ place.
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+
+ Args:
+ keypoints (np.ndarray): The keypoint coordinates in shape (N, K, D)
+ simcc (np.ndarray): The heatmaps in shape (N, K, Wx)
+ blur_kernel_size (int): The Gaussian blur kernel size of the heatmap
+ modulation
+
+ Returns:
+ np.ndarray: Refine keypoint coordinates in shape (N, K, D)
+
+ .. _`UDP`: https://arxiv.org/abs/1911.07524
+ """
+ N = simcc.shape[0]
+
+ # modulate simcc
+ simcc = gaussian_blur1d(simcc, blur_kernel_size)
+ np.clip(simcc, 1e-3, 50., simcc)
+ np.log(simcc, simcc)
+
+ simcc = np.pad(simcc, ((0, 0), (0, 0), (2, 2)), 'edge')
+
+ for n in range(N):
+ px = (keypoints[n] + 2.5).astype(np.int64).reshape(-1, 1) # K, 1
+
+ dx0 = np.take_along_axis(simcc[n], px, axis=1) # K, 1
+ dx1 = np.take_along_axis(simcc[n], px + 1, axis=1)
+ dx_1 = np.take_along_axis(simcc[n], px - 1, axis=1)
+ dx2 = np.take_along_axis(simcc[n], px + 2, axis=1)
+ dx_2 = np.take_along_axis(simcc[n], px - 2, axis=1)
+
+ dx = 0.5 * (dx1 - dx_1)
+ dxx = 1e-9 + 0.25 * (dx2 - 2 * dx0 + dx_2)
+
+ offset = dx / dxx
+ keypoints[n] -= offset.reshape(-1)
+
+ return keypoints
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/video_pose_lifting.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/video_pose_lifting.py
new file mode 100644
index 0000000000000000000000000000000000000000..62cccd09e9de0fcb86a5105572a064d6ecd9ff47
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/codecs/video_pose_lifting.py
@@ -0,0 +1,207 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+
+from copy import deepcopy
+from typing import Optional, Tuple
+
+import numpy as np
+
+from mmpose.registry import KEYPOINT_CODECS
+from .base import BaseKeypointCodec
+
+
+@KEYPOINT_CODECS.register_module()
+class VideoPoseLifting(BaseKeypointCodec):
+ r"""Generate keypoint coordinates for pose lifter.
+
+ Note:
+
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+ - pose-lifitng target dimension: C
+
+ Args:
+ num_keypoints (int): The number of keypoints in the dataset.
+ zero_center: Whether to zero-center the target around root. Default:
+ ``True``.
+ root_index (int): Root keypoint index in the pose. Default: 0.
+ remove_root (bool): If true, remove the root keypoint from the pose.
+ Default: ``False``.
+ save_index (bool): If true, store the root position separated from the
+ original pose, only takes effect if ``remove_root`` is ``True``.
+ Default: ``False``.
+ normalize_camera (bool): Whether to normalize camera intrinsics.
+ Default: ``False``.
+ """
+
+ auxiliary_encode_keys = {
+ 'lifting_target', 'lifting_target_visible', 'camera_param'
+ }
+
+ def __init__(self,
+ num_keypoints: int,
+ zero_center: bool = True,
+ root_index: int = 0,
+ remove_root: bool = False,
+ save_index: bool = False,
+ normalize_camera: bool = False):
+ super().__init__()
+
+ self.num_keypoints = num_keypoints
+ self.zero_center = zero_center
+ self.root_index = root_index
+ self.remove_root = remove_root
+ self.save_index = save_index
+ self.normalize_camera = normalize_camera
+
+ def encode(self,
+ keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray] = None,
+ lifting_target: Optional[np.ndarray] = None,
+ lifting_target_visible: Optional[np.ndarray] = None,
+ camera_param: Optional[dict] = None) -> dict:
+ """Encoding keypoints from input image space to normalized space.
+
+ Args:
+ keypoints (np.ndarray): Keypoint coordinates in shape (N, K, D).
+ keypoints_visible (np.ndarray, optional): Keypoint visibilities in
+ shape (N, K).
+ lifting_target (np.ndarray, optional): 3d target coordinate in
+ shape (K, C).
+ lifting_target_visible (np.ndarray, optional): Target coordinate in
+ shape (K, ).
+ camera_param (dict, optional): The camera parameter dictionary.
+
+ Returns:
+ encoded (dict): Contains the following items:
+
+ - keypoint_labels (np.ndarray): The processed keypoints in
+ shape (K * D, N) where D is 2 for 2d coordinates.
+ - lifting_target_label: The processed target coordinate in
+ shape (K, C) or (K-1, C).
+ - lifting_target_weights (np.ndarray): The target weights in
+ shape (K, ) or (K-1, ).
+ - trajectory_weights (np.ndarray): The trajectory weights in
+ shape (K, ).
+
+ In addition, there are some optional items it may contain:
+
+ - target_root (np.ndarray): The root coordinate of target in
+ shape (C, ). Exists if ``self.zero_center`` is ``True``.
+ - target_root_removed (bool): Indicate whether the root of
+ pose-lifitng target is removed. Exists if
+ ``self.remove_root`` is ``True``.
+ - target_root_index (int): An integer indicating the index of
+ root. Exists if ``self.remove_root`` and ``self.save_index``
+ are ``True``.
+ - camera_param (dict): The updated camera parameter dictionary.
+ Exists if ``self.normalize_camera`` is ``True``.
+ """
+ if keypoints_visible is None:
+ keypoints_visible = np.ones(keypoints.shape[:2], dtype=np.float32)
+
+ if lifting_target is None:
+ lifting_target = keypoints[0]
+
+ # set initial value for `lifting_target_weights`
+ # and `trajectory_weights`
+ if lifting_target_visible is None:
+ lifting_target_visible = np.ones(
+ lifting_target.shape[:-1], dtype=np.float32)
+ lifting_target_weights = lifting_target_visible
+ trajectory_weights = (1 / lifting_target[:, 2])
+ else:
+ valid = lifting_target_visible > 0.5
+ lifting_target_weights = np.where(valid, 1., 0.).astype(np.float32)
+ trajectory_weights = lifting_target_weights
+
+ if camera_param is None:
+ camera_param = dict()
+
+ encoded = dict()
+
+ lifting_target_label = lifting_target.copy()
+ # Zero-center the target pose around a given root keypoint
+ if self.zero_center:
+ assert (lifting_target.ndim >= 2 and
+ lifting_target.shape[-2] > self.root_index), \
+ f'Got invalid joint shape {lifting_target.shape}'
+
+ root = lifting_target[..., self.root_index, :]
+ lifting_target_label = lifting_target_label - root
+ encoded['target_root'] = root
+
+ if self.remove_root:
+ lifting_target_label = np.delete(
+ lifting_target_label, self.root_index, axis=-2)
+ assert lifting_target_weights.ndim in {1, 2}
+ axis_to_remove = -2 if lifting_target_weights.ndim == 2 else -1
+ lifting_target_weights = np.delete(
+ lifting_target_weights,
+ self.root_index,
+ axis=axis_to_remove)
+ # Add a flag to avoid latter transforms that rely on the root
+ # joint or the original joint index
+ encoded['target_root_removed'] = True
+
+ # Save the root index for restoring the global pose
+ if self.save_index:
+ encoded['target_root_index'] = self.root_index
+
+ # Normalize the 2D keypoint coordinate with image width and height
+ _camera_param = deepcopy(camera_param)
+ assert 'w' in _camera_param and 'h' in _camera_param
+ center = np.array([0.5 * _camera_param['w'], 0.5 * _camera_param['h']],
+ dtype=np.float32)
+ scale = np.array(0.5 * _camera_param['w'], dtype=np.float32)
+
+ keypoint_labels = (keypoints - center) / scale
+
+ assert keypoint_labels.ndim in {2, 3}
+ if keypoint_labels.ndim == 2:
+ keypoint_labels = keypoint_labels[None, ...]
+
+ if self.normalize_camera:
+ assert 'f' in _camera_param and 'c' in _camera_param
+ _camera_param['f'] = _camera_param['f'] / scale
+ _camera_param['c'] = (_camera_param['c'] - center[:, None]) / scale
+ encoded['camera_param'] = _camera_param
+
+ encoded['keypoint_labels'] = keypoint_labels
+ encoded['lifting_target_label'] = lifting_target_label
+ encoded['lifting_target_weights'] = lifting_target_weights
+ encoded['trajectory_weights'] = trajectory_weights
+
+ return encoded
+
+ def decode(self,
+ encoded: np.ndarray,
+ target_root: Optional[np.ndarray] = None
+ ) -> Tuple[np.ndarray, np.ndarray]:
+ """Decode keypoint coordinates from normalized space to input image
+ space.
+
+ Args:
+ encoded (np.ndarray): Coordinates in shape (N, K, C).
+ target_root (np.ndarray, optional): The pose-lifitng target root
+ coordinate. Default: ``None``.
+
+ Returns:
+ keypoints (np.ndarray): Decoded coordinates in shape (N, K, C).
+ scores (np.ndarray): The keypoint scores in shape (N, K).
+ """
+ keypoints = encoded.copy()
+
+ if target_root.size > 0:
+ keypoints = keypoints + np.expand_dims(target_root, axis=0)
+ if self.remove_root:
+ keypoints = np.insert(
+ keypoints, self.root_index, target_root, axis=1)
+ scores = np.ones(keypoints.shape[:-1], dtype=np.float32)
+
+ return keypoints, scores
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e27a3b988d2cb0221f3cb87aca4d5dee88ac1700
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/__init__.py
@@ -0,0 +1,13 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .builder import build_dataset
+from .dataset_wrappers import CombinedDataset
+from .datasets import * # noqa
+from .samplers import MultiSourceSampler
+from .transforms import * # noqa
+
+__all__ = ['build_dataset', 'CombinedDataset', 'MultiSourceSampler']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..42c3d5ce8642f07bcc972b979d9c4dc64c78e673
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/__pycache__/builder.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/__pycache__/builder.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fb98517e4163a42a9f298b1be0f7ec6ea9fee7b0
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/__pycache__/builder.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/__pycache__/dataset_wrappers.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/__pycache__/dataset_wrappers.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..91d27fe88478dd5c8a8197be68853d7c1c1d9ed2
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/__pycache__/dataset_wrappers.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/__pycache__/samplers.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/__pycache__/samplers.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..abb495d4cfa47eeef7951f7ed2561f27d385a296
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/__pycache__/samplers.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/builder.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/builder.py
new file mode 100644
index 0000000000000000000000000000000000000000..ce9fee57338a7a716aa9069d50cf1f12ad497c9d
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/builder.py
@@ -0,0 +1,95 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+import platform
+import random
+
+import numpy as np
+import torch
+from mmengine import build_from_cfg, is_seq_of
+from mmengine.dataset import ConcatDataset, RepeatDataset
+
+from mmpose.registry import DATASETS
+
+if platform.system() != 'Windows':
+ # https://github.com/pytorch/pytorch/issues/973
+ import resource
+ rlimit = resource.getrlimit(resource.RLIMIT_NOFILE)
+ base_soft_limit = rlimit[0]
+ hard_limit = rlimit[1]
+ soft_limit = min(max(4096, base_soft_limit), hard_limit)
+ resource.setrlimit(resource.RLIMIT_NOFILE, (soft_limit, hard_limit))
+
+
+def _concat_dataset(cfg, default_args=None):
+ types = cfg['type']
+ ann_files = cfg['ann_file']
+ img_prefixes = cfg.get('img_prefix', None)
+ dataset_infos = cfg.get('dataset_info', None)
+
+ num_joints = cfg['data_cfg'].get('num_joints', None)
+ dataset_channel = cfg['data_cfg'].get('dataset_channel', None)
+
+ datasets = []
+ num_dset = len(ann_files)
+ for i in range(num_dset):
+ cfg_copy = copy.deepcopy(cfg)
+ cfg_copy['ann_file'] = ann_files[i]
+
+ if isinstance(types, (list, tuple)):
+ cfg_copy['type'] = types[i]
+ if isinstance(img_prefixes, (list, tuple)):
+ cfg_copy['img_prefix'] = img_prefixes[i]
+ if isinstance(dataset_infos, (list, tuple)):
+ cfg_copy['dataset_info'] = dataset_infos[i]
+
+ if isinstance(num_joints, (list, tuple)):
+ cfg_copy['data_cfg']['num_joints'] = num_joints[i]
+
+ if is_seq_of(dataset_channel, list):
+ cfg_copy['data_cfg']['dataset_channel'] = dataset_channel[i]
+
+ datasets.append(build_dataset(cfg_copy, default_args))
+
+ return ConcatDataset(datasets)
+
+
+def build_dataset(cfg, default_args=None):
+ """Build a dataset from config dict.
+
+ Args:
+ cfg (dict): Config dict. It should at least contain the key "type".
+ default_args (dict, optional): Default initialization arguments.
+ Default: None.
+
+ Returns:
+ Dataset: The constructed dataset.
+ """
+
+ if isinstance(cfg, (list, tuple)):
+ dataset = ConcatDataset([build_dataset(c, default_args) for c in cfg])
+ elif cfg['type'] == 'ConcatDataset':
+ dataset = ConcatDataset(
+ [build_dataset(c, default_args) for c in cfg['datasets']])
+ elif cfg['type'] == 'RepeatDataset':
+ dataset = RepeatDataset(
+ build_dataset(cfg['dataset'], default_args), cfg['times'])
+ elif isinstance(cfg.get('ann_file'), (list, tuple)):
+ dataset = _concat_dataset(cfg, default_args)
+ else:
+ dataset = build_from_cfg(cfg, DATASETS, default_args)
+ return dataset
+
+
+def worker_init_fn(worker_id, num_workers, rank, seed):
+ """Init the random seed for various workers."""
+ # The seed of each worker equals to
+ # num_worker * rank + worker_id + user_seed
+ worker_seed = num_workers * rank + worker_id + seed
+ np.random.seed(worker_seed)
+ random.seed(worker_seed)
+ torch.manual_seed(worker_seed)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/dataset_wrappers.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/dataset_wrappers.py
new file mode 100644
index 0000000000000000000000000000000000000000..80d35a0985113bdaac7130d4ebf8ecb502ecc179
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/dataset_wrappers.py
@@ -0,0 +1,148 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+
+from copy import deepcopy
+from typing import Any, Callable, List, Tuple, Union
+
+from mmengine.dataset import BaseDataset
+from mmengine.registry import build_from_cfg
+
+from mmpose.registry import DATASETS
+from .datasets.utils import parse_pose_metainfo
+
+
+@DATASETS.register_module()
+class CombinedDataset(BaseDataset):
+ """A wrapper of combined dataset.
+
+ Args:
+ metainfo (dict): The meta information of combined dataset.
+ datasets (list): The configs of datasets to be combined.
+ pipeline (list, optional): Processing pipeline. Defaults to [].
+ """
+
+ def __init__(self,
+ metainfo: dict,
+ datasets: list,
+ pipeline: List[Union[dict, Callable]] = [],
+ **kwargs):
+
+ self.datasets = []
+
+ for cfg in datasets:
+ dataset = build_from_cfg(cfg, DATASETS)
+ self.datasets.append(dataset)
+
+ self._lens = [len(dataset) for dataset in self.datasets]
+ self._len = sum(self._lens)
+
+ super(CombinedDataset, self).__init__(pipeline=pipeline, **kwargs)
+ self._metainfo = parse_pose_metainfo(metainfo)
+
+ @property
+ def metainfo(self):
+ return deepcopy(self._metainfo)
+
+ def __len__(self):
+ return self._len
+
+ def _get_subset_index(self, index: int) -> Tuple[int, int]:
+ """Given a data sample's global index, return the index of the sub-
+ dataset the data sample belongs to, and the local index within that
+ sub-dataset.
+
+ Args:
+ index (int): The global data sample index
+
+ Returns:
+ tuple[int, int]:
+ - subset_index (int): The index of the sub-dataset
+ - local_index (int): The index of the data sample within
+ the sub-dataset
+ """
+ if index >= len(self) or index < -len(self):
+ raise ValueError(
+ f'index({index}) is out of bounds for dataset with '
+ f'length({len(self)}).')
+
+ if index < 0:
+ index = index + len(self)
+
+ subset_index = 0
+ while index >= self._lens[subset_index]:
+ index -= self._lens[subset_index]
+ subset_index += 1
+ return subset_index, index
+
+ def prepare_data(self, idx: int) -> Any:
+ """Get data processed by ``self.pipeline``.The source dataset is
+ depending on the index.
+
+ Args:
+ idx (int): The index of ``data_info``.
+
+ Returns:
+ Any: Depends on ``self.pipeline``.
+ """
+ data_info = self.get_data_info(idx)
+
+ ## check if sample belongs to the goliath dataset
+ subset_idx, sample_idx = self._get_subset_index(idx)
+ transformed_data_info = self.pipeline(data_info)
+
+ if self.test_mode == False and 'data_samples' in transformed_data_info and 'gt_instance_labels' in transformed_data_info['data_samples'] and \
+ 'keypoints_visible' in transformed_data_info['data_samples'].gt_instance_labels:
+ num_transformed_keypoints = transformed_data_info['data_samples'].gt_instance_labels['keypoints_visible'].sum().item() ## after cropping
+
+ ## minimum visible keypoints for coco_wholebody is 8
+ if self.datasets[subset_idx].metainfo['dataset_name'] == 'coco_wholebody':
+ if num_transformed_keypoints < 8:
+ return None
+
+ ## if sample is from the goliath dataset, general minimum visible keypoints is 8
+ if self.datasets[subset_idx].metainfo['dataset_name'] == 'goliath':
+ if num_transformed_keypoints < 8:
+ return None ## we return None, then the base_dataset will return another random sample
+
+ ## general minimum visible keypoints is 4
+ if num_transformed_keypoints < 4:
+ return None
+
+ return transformed_data_info
+
+ def get_data_info(self, idx: int) -> dict:
+ """Get annotation by index.
+
+ Args:
+ idx (int): Global index of ``CombinedDataset``.
+ Returns:
+ dict: The idx-th annotation of the datasets.
+ """
+ subset_idx, sample_idx = self._get_subset_index(idx)
+ # Get data sample processed by ``subset.pipeline``
+ data_info = self.datasets[subset_idx][sample_idx]
+
+ # Add metainfo items that are required in the pipeline and the model
+ metainfo_keys = [
+ 'upper_body_ids', 'lower_body_ids', 'flip_pairs',
+ 'dataset_keypoint_weights', 'flip_indices'
+ ]
+
+ for key in metainfo_keys:
+ data_info[key] = deepcopy(self._metainfo[key])
+
+ return data_info
+
+ def full_init(self):
+ """Fully initialize all sub datasets."""
+
+ if self._fully_initialized:
+ return
+
+ for dataset in self.datasets:
+ dataset.full_init()
+ self._fully_initialized = True
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..a337511b20a74e57ff8a0d7aa9bd9f0774cc0ce9
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/__init__.py
@@ -0,0 +1,14 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .animal import * # noqa: F401, F403
+from .base import * # noqa: F401, F403
+from .body import * # noqa: F401, F403
+from .body3d import * # noqa: F401, F403
+from .face import * # noqa: F401, F403
+from .fashion import * # noqa: F401, F403
+from .hand import * # noqa: F401, F403
+from .wholebody import * # noqa: F401, F403
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..19c5d7ef63f80e051540f91bbe3f401a5e67b7e9
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/__pycache__/utils.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/__pycache__/utils.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ae829d9afe9a4222e0c3140ee0971518dcef263a
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/__pycache__/utils.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e1eb61422b245258cbab122c1de8629a901ccbb5
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__init__.py
@@ -0,0 +1,21 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .animalkingdom_dataset import AnimalKingdomDataset
+from .animalpose_dataset import AnimalPoseDataset
+from .ap10k_dataset import AP10KDataset
+from .atrw_dataset import ATRWDataset
+from .fly_dataset import FlyDataset
+from .horse10_dataset import Horse10Dataset
+from .locust_dataset import LocustDataset
+from .macaque_dataset import MacaqueDataset
+from .zebra_dataset import ZebraDataset
+
+__all__ = [
+ 'AnimalPoseDataset', 'AP10KDataset', 'Horse10Dataset', 'MacaqueDataset',
+ 'FlyDataset', 'LocustDataset', 'ZebraDataset', 'ATRWDataset',
+ 'AnimalKingdomDataset'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d9444e5818b9bcee5610d8dc8541c26cb5720b5f
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/animalkingdom_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/animalkingdom_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ae3c08ddc9f5b4509bdc0d5addb1a899dd901b1c
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/animalkingdom_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/animalpose_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/animalpose_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e838c7b9ee75582d4ecac87e2c3a23f32da38a7c
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/animalpose_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/ap10k_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/ap10k_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..485cb6828a0746aca6ad48b2466983594f745d6c
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/ap10k_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/atrw_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/atrw_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c5c00dfa9237fe74373386b97bfe06a5a5bf9231
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/atrw_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/fly_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/fly_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1fb42da7290f6da4d4ba133f6b2c510acd72a5ba
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/fly_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/horse10_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/horse10_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4c8ba9125da6dcdff52790be85a5800c58decaab
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/horse10_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/locust_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/locust_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fb81daea59e02a7f4e983a4a3fd2254f5420cb7f
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/locust_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/macaque_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/macaque_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7c171e53a3cdb2671673e5841b868d9ee8f27b23
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/macaque_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/zebra_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/zebra_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..dc3deeac03604ccfd8a207722879873de22f1c49
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/__pycache__/zebra_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/animalkingdom_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/animalkingdom_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..7d110b0e586a85da0c6c82f0e1c7bc54bc8ed555
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/animalkingdom_dataset.py
@@ -0,0 +1,91 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class AnimalKingdomDataset(BaseCocoStyleDataset):
+ """Animal Kingdom dataset for animal pose estimation.
+
+ "[CVPR2022] Animal Kingdom:
+ A Large and Diverse Dataset for Animal Behavior Understanding"
+ More details can be found in the `paper
+ `__ .
+
+ Website:
+
+ The dataset loads raw features and apply specified transforms
+ to return a dict containing the image tensors and other information.
+
+ Animal Kingdom keypoint indexes::
+
+ 0: 'Head_Mid_Top',
+ 1: 'Eye_Left',
+ 2: 'Eye_Right',
+ 3: 'Mouth_Front_Top',
+ 4: 'Mouth_Back_Left',
+ 5: 'Mouth_Back_Right',
+ 6: 'Mouth_Front_Bottom',
+ 7: 'Shoulder_Left',
+ 8: 'Shoulder_Right',
+ 9: 'Elbow_Left',
+ 10: 'Elbow_Right',
+ 11: 'Wrist_Left',
+ 12: 'Wrist_Right',
+ 13: 'Torso_Mid_Back',
+ 14: 'Hip_Left',
+ 15: 'Hip_Right',
+ 16: 'Knee_Left',
+ 17: 'Knee_Right',
+ 18: 'Ankle_Left ',
+ 19: 'Ankle_Right',
+ 20: 'Tail_Top_Back',
+ 21: 'Tail_Mid_Back',
+ 22: 'Tail_End_Back
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/ak.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/animalpose_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/animalpose_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..451319e417aa8f4c361159a596f71143f3ceb493
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/animalpose_dataset.py
@@ -0,0 +1,80 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class AnimalPoseDataset(BaseCocoStyleDataset):
+ """Animal-Pose dataset for animal pose estimation.
+
+ "Cross-domain Adaptation For Animal Pose Estimation" ICCV'2019
+ More details can be found in the `paper
+ `__ .
+
+ Animal-Pose keypoints::
+
+ 0: 'L_Eye',
+ 1: 'R_Eye',
+ 2: 'L_EarBase',
+ 3: 'R_EarBase',
+ 4: 'Nose',
+ 5: 'Throat',
+ 6: 'TailBase',
+ 7: 'Withers',
+ 8: 'L_F_Elbow',
+ 9: 'R_F_Elbow',
+ 10: 'L_B_Elbow',
+ 11: 'R_B_Elbow',
+ 12: 'L_F_Knee',
+ 13: 'R_F_Knee',
+ 14: 'L_B_Knee',
+ 15: 'R_B_Knee',
+ 16: 'L_F_Paw',
+ 17: 'R_F_Paw',
+ 18: 'L_B_Paw',
+ 19: 'R_B_Paw'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/animalpose.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/ap10k_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/ap10k_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..bc926269d95ecb572aa8afc282439719c5714bd9
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/ap10k_dataset.py
@@ -0,0 +1,78 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class AP10KDataset(BaseCocoStyleDataset):
+ """AP-10K dataset for animal pose estimation.
+
+ "AP-10K: A Benchmark for Animal Pose Estimation in the Wild"
+ Neurips Dataset Track'2021.
+ More details can be found in the `paper
+ `__ .
+
+ AP-10K keypoints::
+
+ 0: 'L_Eye',
+ 1: 'R_Eye',
+ 2: 'Nose',
+ 3: 'Neck',
+ 4: 'root of tail',
+ 5: 'L_Shoulder',
+ 6: 'L_Elbow',
+ 7: 'L_F_Paw',
+ 8: 'R_Shoulder',
+ 9: 'R_Elbow',
+ 10: 'R_F_Paw,
+ 11: 'L_Hip',
+ 12: 'L_Knee',
+ 13: 'L_B_Paw',
+ 14: 'R_Hip',
+ 15: 'R_Knee',
+ 16: 'R_B_Paw'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/ap10k.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/atrw_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/atrw_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..c09e79b0e3ce5a808c0d4f60c00528386ade1fe7
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/atrw_dataset.py
@@ -0,0 +1,76 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class ATRWDataset(BaseCocoStyleDataset):
+ """ATRW dataset for animal pose estimation.
+
+ "ATRW: A Benchmark for Amur Tiger Re-identification in the Wild"
+ ACM MM'2020.
+ More details can be found in the `paper
+ `__ .
+
+ ATRW keypoints::
+
+ 0: "left_ear",
+ 1: "right_ear",
+ 2: "nose",
+ 3: "right_shoulder",
+ 4: "right_front_paw",
+ 5: "left_shoulder",
+ 6: "left_front_paw",
+ 7: "right_hip",
+ 8: "right_knee",
+ 9: "right_back_paw",
+ 10: "left_hip",
+ 11: "left_knee",
+ 12: "left_back_paw",
+ 13: "tail",
+ 14: "center"
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/atrw.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/fly_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/fly_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..9c7770dc4c45f4beeead8da5827f6a18d769cf2a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/fly_dataset.py
@@ -0,0 +1,93 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class FlyDataset(BaseCocoStyleDataset):
+ """FlyDataset for animal pose estimation.
+
+ "Fast animal pose estimation using deep neural networks"
+ Nature methods'2019. More details can be found in the `paper
+ `__ .
+
+ Vinegar Fly keypoints::
+
+ 0: "head",
+ 1: "eyeL",
+ 2: "eyeR",
+ 3: "neck",
+ 4: "thorax",
+ 5: "abdomen",
+ 6: "forelegR1",
+ 7: "forelegR2",
+ 8: "forelegR3",
+ 9: "forelegR4",
+ 10: "midlegR1",
+ 11: "midlegR2",
+ 12: "midlegR3",
+ 13: "midlegR4",
+ 14: "hindlegR1",
+ 15: "hindlegR2",
+ 16: "hindlegR3",
+ 17: "hindlegR4",
+ 18: "forelegL1",
+ 19: "forelegL2",
+ 20: "forelegL3",
+ 21: "forelegL4",
+ 22: "midlegL1",
+ 23: "midlegL2",
+ 24: "midlegL3",
+ 25: "midlegL4",
+ 26: "hindlegL1",
+ 27: "hindlegL2",
+ 28: "hindlegL3",
+ 29: "hindlegL4",
+ 30: "wingL",
+ 31: "wingR"
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/fly.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/horse10_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/horse10_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..e8d9521190db9dbc4ca8cd1f758171e1d127d6bc
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/horse10_dataset.py
@@ -0,0 +1,82 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class Horse10Dataset(BaseCocoStyleDataset):
+ """Horse10Dataset for animal pose estimation.
+
+ "Pretraining boosts out-of-domain robustness for pose estimation"
+ WACV'2021. More details can be found in the `paper
+ `__ .
+
+ Horse-10 keypoints::
+
+ 0: 'Nose',
+ 1: 'Eye',
+ 2: 'Nearknee',
+ 3: 'Nearfrontfetlock',
+ 4: 'Nearfrontfoot',
+ 5: 'Offknee',
+ 6: 'Offfrontfetlock',
+ 7: 'Offfrontfoot',
+ 8: 'Shoulder',
+ 9: 'Midshoulder',
+ 10: 'Elbow',
+ 11: 'Girth',
+ 12: 'Wither',
+ 13: 'Nearhindhock',
+ 14: 'Nearhindfetlock',
+ 15: 'Nearhindfoot',
+ 16: 'Hip',
+ 17: 'Stifle',
+ 18: 'Offhindhock',
+ 19: 'Offhindfetlock',
+ 20: 'Offhindfoot',
+ 21: 'Ischium'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/horse10.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/locust_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/locust_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..5adc3e62fe0813f27f1ca64a60434b32ea109d1c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/locust_dataset.py
@@ -0,0 +1,145 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+from typing import Optional
+
+import numpy as np
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class LocustDataset(BaseCocoStyleDataset):
+ """LocustDataset for animal pose estimation.
+
+ "DeepPoseKit, a software toolkit for fast and robust animal
+ pose estimation using deep learning" Elife'2019.
+ More details can be found in the `paper
+ `__ .
+
+ Desert Locust keypoints::
+
+ 0: "head",
+ 1: "neck",
+ 2: "thorax",
+ 3: "abdomen1",
+ 4: "abdomen2",
+ 5: "anttipL",
+ 6: "antbaseL",
+ 7: "eyeL",
+ 8: "forelegL1",
+ 9: "forelegL2",
+ 10: "forelegL3",
+ 11: "forelegL4",
+ 12: "midlegL1",
+ 13: "midlegL2",
+ 14: "midlegL3",
+ 15: "midlegL4",
+ 16: "hindlegL1",
+ 17: "hindlegL2",
+ 18: "hindlegL3",
+ 19: "hindlegL4",
+ 20: "anttipR",
+ 21: "antbaseR",
+ 22: "eyeR",
+ 23: "forelegR1",
+ 24: "forelegR2",
+ 25: "forelegR3",
+ 26: "forelegR4",
+ 27: "midlegR1",
+ 28: "midlegR2",
+ 29: "midlegR3",
+ 30: "midlegR4",
+ 31: "hindlegR1",
+ 32: "hindlegR2",
+ 33: "hindlegR3",
+ 34: "hindlegR4"
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/locust.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw Locust annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ img_path = osp.join(self.data_prefix['img'], img['file_name'])
+
+ # get bbox in shape [1, 4], formatted as xywh
+ # use the entire image which is 160x160
+ bbox = np.array([0, 0, 160, 160], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img_path,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': ann['num_keypoints'],
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann['iscrowd'],
+ 'id': ann['id'],
+ }
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/macaque_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/macaque_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..409aba8f9aaf6a0c5ac07178072ecc61081b9d82
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/macaque_dataset.py
@@ -0,0 +1,79 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class MacaqueDataset(BaseCocoStyleDataset):
+ """MacaquePose dataset for animal pose estimation.
+
+ "MacaquePose: A novel 'in the wild' macaque monkey pose dataset
+ for markerless motion capture" bioRxiv'2020.
+ More details can be found in the `paper
+ `__ .
+
+ Macaque keypoints::
+
+ 0: 'nose',
+ 1: 'left_eye',
+ 2: 'right_eye',
+ 3: 'left_ear',
+ 4: 'right_ear',
+ 5: 'left_shoulder',
+ 6: 'right_shoulder',
+ 7: 'left_elbow',
+ 8: 'right_elbow',
+ 9: 'left_wrist',
+ 10: 'right_wrist',
+ 11: 'left_hip',
+ 12: 'right_hip',
+ 13: 'left_knee',
+ 14: 'right_knee',
+ 15: 'left_ankle',
+ 16: 'right_ankle'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/macaque.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/zebra_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/zebra_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..bcfba5749ea93bffb3afcfff2c77e164b6d42fda
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/animal/zebra_dataset.py
@@ -0,0 +1,121 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+from typing import Optional
+
+import numpy as np
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class ZebraDataset(BaseCocoStyleDataset):
+ """ZebraDataset for animal pose estimation.
+
+ "DeepPoseKit, a software toolkit for fast and robust animal
+ pose estimation using deep learning" Elife'2019.
+ More details can be found in the `paper
+ `__ .
+
+ Zebra keypoints::
+
+ 0: "snout",
+ 1: "head",
+ 2: "neck",
+ 3: "forelegL1",
+ 4: "forelegR1",
+ 5: "hindlegL1",
+ 6: "hindlegR1",
+ 7: "tailbase",
+ 8: "tailtip"
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/zebra.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw Zebra annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ img_path = osp.join(self.data_prefix['img'], img['file_name'])
+
+ # get bbox in shape [1, 4], formatted as xywh
+ # use the entire image which is 160x160
+ bbox = np.array([0, 0, 160, 160], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ num_keypoints = ann['num_keypoints']
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img_path,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann['iscrowd'],
+ 'id': ann['id'],
+ }
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..6d5e9870c32820aa36aa27f02484263422bfb13a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/__init__.py
@@ -0,0 +1,10 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .base_coco_style_dataset import BaseCocoStyleDataset
+from .base_mocap_dataset import BaseMocapDataset
+
+__all__ = ['BaseCocoStyleDataset', 'BaseMocapDataset']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..696378eae575459f864a8d04b0bb793cfb5c7871
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/__pycache__/base_coco_style_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/__pycache__/base_coco_style_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2334921282f853bb676f28e3dc83a7d3fb250f60
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/__pycache__/base_coco_style_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/__pycache__/base_mocap_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/__pycache__/base_mocap_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..25ecf1dbde01d3747172deca4ce7191b43ae4374
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/__pycache__/base_mocap_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/base_coco_style_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/base_coco_style_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..e65538a05a59a50c0acb86230ee6c5e71b9e2567
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/base_coco_style_dataset.py
@@ -0,0 +1,509 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+import os.path as osp
+from copy import deepcopy
+from itertools import filterfalse, groupby
+from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
+
+import numpy as np
+from mmengine.dataset import BaseDataset, force_full_init
+from mmengine.fileio import exists, get_local_path, load
+from mmengine.utils import is_list_of
+from xtcocotools.coco import COCO
+
+from mmpose.registry import DATASETS
+from mmpose.structures.bbox import bbox_xywh2xyxy
+from ..utils import parse_pose_metainfo
+
+
+@DATASETS.register_module()
+class BaseCocoStyleDataset(BaseDataset):
+ """Base class for COCO-style datasets.
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data.
+ Default: ``dict(img='')``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict()
+
+ def __init__(self,
+ ann_file: str = '',
+ bbox_file: Optional[str] = None,
+ data_mode: str = 'topdown',
+ metainfo: Optional[dict] = None,
+ data_root: Optional[str] = None,
+ data_prefix: dict = dict(img=''),
+ filter_cfg: Optional[dict] = None,
+ indices: Optional[Union[int, Sequence[int]]] = None,
+ serialize_data: bool = True,
+ pipeline: List[Union[dict, Callable]] = [],
+ test_mode: bool = False,
+ lazy_init: bool = False,
+ max_refetch: int = 1000):
+
+ if data_mode not in {'topdown', 'bottomup'}:
+ raise ValueError(
+ f'{self.__class__.__name__} got invalid data_mode: '
+ f'{data_mode}. Should be "topdown" or "bottomup".')
+ self.data_mode = data_mode
+
+ if bbox_file:
+ if self.data_mode != 'topdown':
+ raise ValueError(
+ f'{self.__class__.__name__} is set to {self.data_mode}: '
+ 'mode, while "bbox_file" is only '
+ 'supported in topdown mode.')
+
+ if not test_mode:
+ raise ValueError(
+ f'{self.__class__.__name__} has `test_mode==False` '
+ 'while "bbox_file" is only '
+ 'supported when `test_mode==True`.')
+ self.bbox_file = bbox_file
+
+ super().__init__(
+ ann_file=ann_file,
+ metainfo=metainfo,
+ data_root=data_root,
+ data_prefix=data_prefix,
+ filter_cfg=filter_cfg,
+ indices=indices,
+ serialize_data=serialize_data,
+ pipeline=pipeline,
+ test_mode=test_mode,
+ lazy_init=lazy_init,
+ max_refetch=max_refetch)
+
+ ## uncomment to debug
+ # if test_mode == False:
+ # ## ranomly sample 100 images
+ # idx = np.random.randint(0, len(self), 100)
+ # self.data_list = [self.data_list[i] for i in idx]
+
+ ##----------------------------------------
+ # self.debug = True ## uncomment if you want to debug
+ # Default to False if self.debug is not defined
+ debug = getattr(self, 'debug', False)
+
+ if debug:
+ ## if using a subset for debug
+ temp_ = self.get_subset(16)
+
+ if self.serialize_data:
+ self.data_bytes = temp_.data_bytes
+ self.data_address = temp_.data_address
+ else:
+ self.data_list = temp_.data_list
+
+ print('\033[95mUsing a subset for debug. Only {} samples\033[0m.'.format(self.__len__()))
+
+ ##----------------------------------------
+ print('\033[96mLoaded {} samples for {}, Test mode: {}\033[0m'.format(self.__len__(), self.metainfo['dataset_name'], self.test_mode))
+
+ return
+
+ @classmethod
+ def _load_metainfo(cls, metainfo: dict = None) -> dict:
+ """Collect meta information from the dictionary of meta.
+
+ Args:
+ metainfo (dict): Raw data of pose meta information.
+
+ Returns:
+ dict: Parsed meta information.
+ """
+
+ if metainfo is None:
+ metainfo = deepcopy(cls.METAINFO)
+
+ if not isinstance(metainfo, dict):
+ raise TypeError(
+ f'metainfo should be a dict, but got {type(metainfo)}')
+
+ # parse pose metainfo if it has been assigned
+ if metainfo:
+ metainfo = parse_pose_metainfo(metainfo)
+ return metainfo
+
+ @force_full_init
+ def prepare_data(self, idx) -> Any:
+ """Get data processed by ``self.pipeline``.
+
+ :class:`BaseCocoStyleDataset` overrides this method from
+ :class:`mmengine.dataset.BaseDataset` to add the metainfo into
+ the ``data_info`` before it is passed to the pipeline.
+
+ Args:
+ idx (int): The index of ``data_info``.
+
+ Returns:
+ Any: Depends on ``self.pipeline``.
+ """
+ data_info = self.get_data_info(idx)
+ transformed_data_info = self.pipeline(data_info)
+
+ if transformed_data_info is None:
+ return None
+
+ ## pipeline is set to empty when using concatenation of datasets.
+ if self.test_mode == False and 'data_samples' in transformed_data_info and 'gt_instance_labels' in transformed_data_info['data_samples'] and \
+ 'keypoints_visible' in transformed_data_info['data_samples'].gt_instance_labels:
+ num_transformed_keypoints = transformed_data_info['data_samples'].gt_instance_labels['keypoints_visible'].sum().item() ## after cropping
+
+ ## minimum visible keypoints for coco_wholebody is 8
+ if self.metainfo['dataset_name'] == 'coco_wholebody':
+ if num_transformed_keypoints < 8:
+ return None
+
+ ## absolute minimum visible keypoints is 3
+ if num_transformed_keypoints < 3:
+ return None
+
+ return transformed_data_info
+
+ def get_data_info(self, idx: int) -> dict:
+ """Get data info by index.
+
+ Args:
+ idx (int): Index of data info.
+
+ Returns:
+ dict: Data info.
+ """
+ data_info = super().get_data_info(idx)
+
+ # Add metainfo items that are required in the pipeline and the model
+ metainfo_keys = [
+ 'upper_body_ids', 'lower_body_ids', 'flip_pairs',
+ 'dataset_keypoint_weights', 'flip_indices', 'skeleton_links'
+ ]
+
+ for key in metainfo_keys:
+ assert key not in data_info, (
+ f'"{key}" is a reserved key for `metainfo`, but already '
+ 'exists in the `data_info`.')
+
+ data_info[key] = deepcopy(self._metainfo[key])
+
+ return data_info
+
+ def load_data_list(self) -> List[dict]:
+ """Load data list from COCO annotation file or person detection result
+ file."""
+
+ if self.bbox_file:
+ data_list = self._load_detection_results()
+ else:
+ instance_list, image_list = self._load_annotations()
+
+ if self.data_mode == 'topdown':
+ data_list = self._get_topdown_data_infos(instance_list)
+ else:
+ data_list = self._get_bottomup_data_infos(
+ instance_list, image_list)
+
+ return data_list
+
+ def _load_annotations(self) -> Tuple[List[dict], List[dict]]:
+ """Load data from annotations in COCO format."""
+
+ assert exists(self.ann_file), 'Annotation file does not exist'
+
+ with get_local_path(self.ann_file) as local_path:
+ self.coco = COCO(local_path)
+ # set the metainfo about categories, which is a list of dict
+ # and each dict contains the 'id', 'name', etc. about this category
+ self._metainfo['CLASSES'] = self.coco.loadCats(self.coco.getCatIds())
+
+ instance_list = []
+ image_list = []
+
+ for img_id in self.coco.getImgIds():
+ img = self.coco.loadImgs(img_id)[0]
+ img.update({
+ 'img_id':
+ img_id,
+ 'img_path':
+ osp.join(self.data_prefix['img'], img['file_name']),
+ })
+ image_list.append(img)
+
+ ann_ids = self.coco.getAnnIds(imgIds=img_id)
+ for ann in self.coco.loadAnns(ann_ids):
+
+ instance_info = self.parse_data_info(
+ dict(raw_ann_info=ann, raw_img_info=img))
+
+ # skip invalid instance annotation.
+ if not instance_info:
+ continue
+
+ instance_list.append(instance_info)
+ return instance_list, image_list
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict | None: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ # filter invalid instance
+ if 'bbox' not in ann or 'keypoints' not in ann:
+ return None
+
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ if 'num_keypoints' in ann:
+ num_keypoints = ann['num_keypoints']
+ else:
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img['img_path'],
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann.get('iscrowd', 0),
+ 'segmentation': ann.get('segmentation', None),
+ 'id': ann['id'],
+ 'category_id': ann['category_id'],
+ # store the raw annotation of the instance
+ # it is useful for evaluation without providing ann_file
+ 'raw_ann_info': copy.deepcopy(ann),
+ }
+
+ if 'crowdIndex' in img:
+ data_info['crowd_index'] = img['crowdIndex']
+
+ return data_info
+
+ @staticmethod
+ def _is_valid_instance(data_info: Dict) -> bool:
+ """Check a data info is an instance with valid bbox and keypoint
+ annotations."""
+ # crowd annotation
+ if 'iscrowd' in data_info and data_info['iscrowd']:
+ return False
+ # invalid keypoints
+ if 'num_keypoints' in data_info and data_info['num_keypoints'] == 0:
+ return False
+ # invalid bbox
+ if 'bbox' in data_info:
+ bbox = data_info['bbox'][0]
+ w, h = bbox[2:4] - bbox[:2]
+ if w <= 0 or h <= 0:
+ return False
+ # invalid keypoints
+ if 'keypoints' in data_info:
+ if np.max(data_info['keypoints']) <= 0:
+ return False
+ return True
+
+ def _get_topdown_data_infos(self, instance_list: List[Dict]) -> List[Dict]:
+ """Organize the data list in top-down mode."""
+ # sanitize data samples
+ data_list_tp = list(filter(self._is_valid_instance, instance_list))
+
+ return data_list_tp
+
+ def _get_bottomup_data_infos(self, instance_list: List[Dict],
+ image_list: List[Dict]) -> List[Dict]:
+ """Organize the data list in bottom-up mode."""
+
+ # bottom-up data list
+ data_list_bu = []
+
+ used_img_ids = set()
+
+ # group instances by img_id
+ for img_id, data_infos in groupby(instance_list,
+ lambda x: x['img_id']):
+ used_img_ids.add(img_id)
+ data_infos = list(data_infos)
+
+ # image data
+ img_path = data_infos[0]['img_path']
+ data_info_bu = {
+ 'img_id': img_id,
+ 'img_path': img_path,
+ }
+
+ for key in data_infos[0].keys():
+ if key not in data_info_bu:
+ seq = [d[key] for d in data_infos]
+ if isinstance(seq[0], np.ndarray):
+ seq = np.concatenate(seq, axis=0)
+ data_info_bu[key] = seq
+
+ # The segmentation annotation of invalid objects will be used
+ # to generate valid region mask in the pipeline.
+ invalid_segs = []
+ for data_info_invalid in filterfalse(self._is_valid_instance,
+ data_infos):
+ if 'segmentation' in data_info_invalid:
+ invalid_segs.append(data_info_invalid['segmentation'])
+ data_info_bu['invalid_segs'] = invalid_segs
+
+ data_list_bu.append(data_info_bu)
+
+ # add images without instance for evaluation
+ if self.test_mode:
+ for img_info in image_list:
+ if img_info['img_id'] not in used_img_ids:
+ data_info_bu = {
+ 'img_id': img_info['img_id'],
+ 'img_path': img_info['img_path'],
+ 'id': list(),
+ 'raw_ann_info': None,
+ }
+ data_list_bu.append(data_info_bu)
+
+ return data_list_bu
+
+ def _load_detection_results(self) -> List[dict]:
+ """Load data from detection results with dummy keypoint annotations."""
+
+ assert exists(self.ann_file), 'Annotation file does not exist'
+ assert exists(self.bbox_file), 'Bbox file does not exist'
+ # load detection results
+ det_results = load(self.bbox_file)
+ assert is_list_of(det_results, dict)
+
+ # load coco annotations to build image id-to-name index
+ with get_local_path(self.ann_file) as local_path:
+ self.coco = COCO(local_path)
+ # set the metainfo about categories, which is a list of dict
+ # and each dict contains the 'id', 'name', etc. about this category
+ self._metainfo['CLASSES'] = self.coco.loadCats(self.coco.getCatIds())
+
+ num_keypoints = self.metainfo['num_keypoints']
+ data_list = []
+ id_ = 0
+ for det in det_results:
+ # remove non-human instances
+ if det['category_id'] != 1:
+ continue
+
+ img = self.coco.loadImgs(det['image_id'])[0]
+
+ img_path = osp.join(self.data_prefix['img'], img['file_name'])
+ bbox_xywh = np.array(
+ det['bbox'][:4], dtype=np.float32).reshape(1, 4)
+ bbox = bbox_xywh2xyxy(bbox_xywh)
+ bbox_score = np.array(det['score'], dtype=np.float32).reshape(1)
+
+ # use dummy keypoint location and visibility
+ keypoints = np.zeros((1, num_keypoints, 2), dtype=np.float32)
+ keypoints_visible = np.ones((1, num_keypoints), dtype=np.float32)
+
+ data_list.append({
+ 'img_id': det['image_id'],
+ 'img_path': img_path,
+ 'img_shape': (img['height'], img['width']),
+ 'bbox': bbox,
+ 'bbox_score': bbox_score,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'id': id_,
+ })
+
+ id_ += 1
+
+ return data_list
+
+ def filter_data(self) -> List[dict]:
+ """Filter annotations according to filter_cfg. Defaults return full
+ ``data_list``.
+
+ If 'bbox_score_thr` in filter_cfg, the annotation with bbox_score below
+ the threshold `bbox_score_thr` will be filtered out.
+ """
+
+ data_list = self.data_list
+
+ if self.filter_cfg is None:
+ return data_list
+
+ # filter out annotations with a bbox_score below the threshold
+ if 'bbox_score_thr' in self.filter_cfg:
+
+ if self.data_mode != 'topdown':
+ raise ValueError(
+ f'{self.__class__.__name__} is set to {self.data_mode} '
+ 'mode, while "bbox_score_thr" is only supported in '
+ 'topdown mode.')
+
+ thr = self.filter_cfg['bbox_score_thr']
+ data_list = list(
+ filterfalse(lambda ann: ann['bbox_score'] < thr, data_list))
+
+ return data_list
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/base_mocap_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/base_mocap_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..af9a9c028965e3cceaa9ae90d0a343d024a864fe
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/base/base_mocap_dataset.py
@@ -0,0 +1,408 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+from copy import deepcopy
+from itertools import filterfalse, groupby
+from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
+
+import numpy as np
+from mmengine.dataset import BaseDataset, force_full_init
+from mmengine.fileio import exists, get_local_path, load
+from mmengine.utils import is_abs
+from PIL import Image
+
+from mmpose.registry import DATASETS
+from ..utils import parse_pose_metainfo
+
+
+@DATASETS.register_module()
+class BaseMocapDataset(BaseDataset):
+ """Base class for 3d body datasets.
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ seq_len (int): Number of frames in a sequence. Default: 1.
+ causal (bool): If set to ``True``, the rightmost input frame will be
+ the target frame. Otherwise, the middle input frame will be the
+ target frame. Default: ``True``.
+ subset_frac (float): The fraction to reduce dataset size. If set to 1,
+ the dataset size is not reduced. Default: 1.
+ camera_param_file (str): Cameras' parameters file. Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data.
+ Default: ``dict(img='')``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict()
+
+ def __init__(self,
+ ann_file: str = '',
+ seq_len: int = 1,
+ causal: bool = True,
+ subset_frac: float = 1.0,
+ camera_param_file: Optional[str] = None,
+ data_mode: str = 'topdown',
+ metainfo: Optional[dict] = None,
+ data_root: Optional[str] = None,
+ data_prefix: dict = dict(img=''),
+ filter_cfg: Optional[dict] = None,
+ indices: Optional[Union[int, Sequence[int]]] = None,
+ serialize_data: bool = True,
+ pipeline: List[Union[dict, Callable]] = [],
+ test_mode: bool = False,
+ lazy_init: bool = False,
+ max_refetch: int = 1000):
+
+ if data_mode not in {'topdown', 'bottomup'}:
+ raise ValueError(
+ f'{self.__class__.__name__} got invalid data_mode: '
+ f'{data_mode}. Should be "topdown" or "bottomup".')
+ self.data_mode = data_mode
+
+ _ann_file = ann_file
+ if not is_abs(_ann_file):
+ _ann_file = osp.join(data_root, _ann_file)
+ assert exists(_ann_file), 'Annotation file does not exist.'
+ with get_local_path(_ann_file) as local_path:
+ self.ann_data = np.load(local_path)
+
+ self.camera_param_file = camera_param_file
+ if self.camera_param_file:
+ if not is_abs(self.camera_param_file):
+ self.camera_param_file = osp.join(data_root,
+ self.camera_param_file)
+ assert exists(self.camera_param_file)
+ self.camera_param = load(self.camera_param_file)
+
+ self.seq_len = seq_len
+ self.causal = causal
+
+ assert 0 < subset_frac <= 1, (
+ f'Unsupported `subset_frac` {subset_frac}. Supported range '
+ 'is (0, 1].')
+ self.subset_frac = subset_frac
+
+ self.sequence_indices = self.get_sequence_indices()
+
+ super().__init__(
+ ann_file=ann_file,
+ metainfo=metainfo,
+ data_root=data_root,
+ data_prefix=data_prefix,
+ filter_cfg=filter_cfg,
+ indices=indices,
+ serialize_data=serialize_data,
+ pipeline=pipeline,
+ test_mode=test_mode,
+ lazy_init=lazy_init,
+ max_refetch=max_refetch)
+
+ @classmethod
+ def _load_metainfo(cls, metainfo: dict = None) -> dict:
+ """Collect meta information from the dictionary of meta.
+
+ Args:
+ metainfo (dict): Raw data of pose meta information.
+
+ Returns:
+ dict: Parsed meta information.
+ """
+
+ if metainfo is None:
+ metainfo = deepcopy(cls.METAINFO)
+
+ if not isinstance(metainfo, dict):
+ raise TypeError(
+ f'metainfo should be a dict, but got {type(metainfo)}')
+
+ # parse pose metainfo if it has been assigned
+ if metainfo:
+ metainfo = parse_pose_metainfo(metainfo)
+ return metainfo
+
+ @force_full_init
+ def prepare_data(self, idx) -> Any:
+ """Get data processed by ``self.pipeline``.
+
+ :class:`BaseCocoStyleDataset` overrides this method from
+ :class:`mmengine.dataset.BaseDataset` to add the metainfo into
+ the ``data_info`` before it is passed to the pipeline.
+
+ Args:
+ idx (int): The index of ``data_info``.
+
+ Returns:
+ Any: Depends on ``self.pipeline``.
+ """
+ data_info = self.get_data_info(idx)
+
+ return self.pipeline(data_info)
+
+ def get_data_info(self, idx: int) -> dict:
+ """Get data info by index.
+
+ Args:
+ idx (int): Index of data info.
+
+ Returns:
+ dict: Data info.
+ """
+ data_info = super().get_data_info(idx)
+
+ # Add metainfo items that are required in the pipeline and the model
+ metainfo_keys = [
+ 'upper_body_ids', 'lower_body_ids', 'flip_pairs',
+ 'dataset_keypoint_weights', 'flip_indices', 'skeleton_links'
+ ]
+
+ for key in metainfo_keys:
+ assert key not in data_info, (
+ f'"{key}" is a reserved key for `metainfo`, but already '
+ 'exists in the `data_info`.')
+
+ data_info[key] = deepcopy(self._metainfo[key])
+
+ return data_info
+
+ def load_data_list(self) -> List[dict]:
+ """Load data list from COCO annotation file or person detection result
+ file."""
+
+ instance_list, image_list = self._load_annotations()
+
+ if self.data_mode == 'topdown':
+ data_list = self._get_topdown_data_infos(instance_list)
+ else:
+ data_list = self._get_bottomup_data_infos(instance_list,
+ image_list)
+
+ return data_list
+
+ def get_img_info(self, img_idx, img_name):
+ try:
+ with get_local_path(osp.join(self.data_prefix['img'],
+ img_name)) as local_path:
+ im = Image.open(local_path)
+ w, h = im.size
+ im.close()
+ except: # noqa: E722
+ return None
+
+ img = {
+ 'file_name': img_name,
+ 'height': h,
+ 'width': w,
+ 'id': img_idx,
+ 'img_id': img_idx,
+ 'img_path': osp.join(self.data_prefix['img'], img_name),
+ }
+ return img
+
+ def get_sequence_indices(self) -> List[List[int]]:
+ """Build sequence indices.
+
+ The default method creates sample indices that each sample is a single
+ frame (i.e. seq_len=1). Override this method in the subclass to define
+ how frames are sampled to form data samples.
+
+ Outputs:
+ sample_indices: the frame indices of each sample.
+ For a sample, all frames will be treated as an input sequence,
+ and the ground-truth pose of the last frame will be the target.
+ """
+ sequence_indices = []
+ if self.seq_len == 1:
+ num_imgs = len(self.ann_data['imgname'])
+ sequence_indices = [[idx] for idx in range(num_imgs)]
+ else:
+ raise NotImplementedError('Multi-frame data sample unsupported!')
+ return sequence_indices
+
+ def _load_annotations(self) -> Tuple[List[dict], List[dict]]:
+ """Load data from annotations in COCO format."""
+ num_keypoints = self.metainfo['num_keypoints']
+
+ img_names = self.ann_data['imgname']
+ num_imgs = len(img_names)
+
+ if 'S' in self.ann_data.keys():
+ kpts_3d = self.ann_data['S']
+ else:
+ kpts_3d = np.zeros((num_imgs, num_keypoints, 4), dtype=np.float32)
+
+ if 'part' in self.ann_data.keys():
+ kpts_2d = self.ann_data['part']
+ else:
+ kpts_2d = np.zeros((num_imgs, num_keypoints, 3), dtype=np.float32)
+
+ if 'center' in self.ann_data.keys():
+ centers = self.ann_data['center']
+ else:
+ centers = np.zeros((num_imgs, 2), dtype=np.float32)
+
+ if 'scale' in self.ann_data.keys():
+ scales = self.ann_data['scale'].astype(np.float32)
+ else:
+ scales = np.zeros(num_imgs, dtype=np.float32)
+
+ instance_list = []
+ image_list = []
+
+ for idx, frame_ids in enumerate(self.sequence_indices):
+ assert len(frame_ids) == self.seq_len
+
+ _img_names = img_names[frame_ids]
+
+ _keypoints = kpts_2d[frame_ids].astype(np.float32)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = _keypoints[..., 2]
+
+ _keypoints_3d = kpts_3d[frame_ids].astype(np.float32)
+ keypoints_3d = _keypoints_3d[..., :3]
+ keypoints_3d_visible = _keypoints_3d[..., 3]
+
+ target_idx = -1 if self.causal else int(self.seq_len) // 2
+
+ instance_info = {
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'keypoints_3d': keypoints_3d,
+ 'keypoints_3d_visible': keypoints_3d_visible,
+ 'scale': scales[idx],
+ 'center': centers[idx].astype(np.float32).reshape(1, -1),
+ 'id': idx,
+ 'category_id': 1,
+ 'iscrowd': 0,
+ 'img_paths': list(_img_names),
+ 'img_ids': frame_ids,
+ 'lifting_target': keypoints_3d[target_idx],
+ 'lifting_target_visible': keypoints_3d_visible[target_idx],
+ 'target_img_path': _img_names[target_idx],
+ }
+
+ if self.camera_param_file:
+ _cam_param = self.get_camera_param(_img_names[0])
+ instance_info['camera_param'] = _cam_param
+
+ instance_list.append(instance_info)
+
+ for idx, imgname in enumerate(img_names):
+ img_info = self.get_img_info(idx, imgname)
+ image_list.append(img_info)
+
+ return instance_list, image_list
+
+ def get_camera_param(self, imgname):
+ """Get camera parameters of a frame by its image name.
+
+ Override this method to specify how to get camera parameters.
+ """
+ raise NotImplementedError
+
+ @staticmethod
+ def _is_valid_instance(data_info: Dict) -> bool:
+ """Check a data info is an instance with valid bbox and keypoint
+ annotations."""
+ # crowd annotation
+ if 'iscrowd' in data_info and data_info['iscrowd']:
+ return False
+ # invalid keypoints
+ if 'num_keypoints' in data_info and data_info['num_keypoints'] == 0:
+ return False
+ # invalid keypoints
+ if 'keypoints' in data_info:
+ if np.max(data_info['keypoints']) <= 0:
+ return False
+ return True
+
+ def _get_topdown_data_infos(self, instance_list: List[Dict]) -> List[Dict]:
+ """Organize the data list in top-down mode."""
+ # sanitize data samples
+ data_list_tp = list(filter(self._is_valid_instance, instance_list))
+
+ return data_list_tp
+
+ def _get_bottomup_data_infos(self, instance_list: List[Dict],
+ image_list: List[Dict]) -> List[Dict]:
+ """Organize the data list in bottom-up mode."""
+
+ # bottom-up data list
+ data_list_bu = []
+
+ used_img_ids = set()
+
+ # group instances by img_id
+ for img_ids, data_infos in groupby(instance_list,
+ lambda x: x['img_ids']):
+ for img_id in img_ids:
+ used_img_ids.add(img_id)
+ data_infos = list(data_infos)
+
+ # image data
+ img_paths = data_infos[0]['img_paths']
+ data_info_bu = {
+ 'img_ids': img_ids,
+ 'img_paths': img_paths,
+ }
+
+ for key in data_infos[0].keys():
+ if key not in data_info_bu:
+ seq = [d[key] for d in data_infos]
+ if isinstance(seq[0], np.ndarray):
+ seq = np.concatenate(seq, axis=0)
+ data_info_bu[key] = seq
+
+ # The segmentation annotation of invalid objects will be used
+ # to generate valid region mask in the pipeline.
+ invalid_segs = []
+ for data_info_invalid in filterfalse(self._is_valid_instance,
+ data_infos):
+ if 'segmentation' in data_info_invalid:
+ invalid_segs.append(data_info_invalid['segmentation'])
+ data_info_bu['invalid_segs'] = invalid_segs
+
+ data_list_bu.append(data_info_bu)
+
+ # add images without instance for evaluation
+ if self.test_mode:
+ for img_info in image_list:
+ if img_info['img_id'] not in used_img_ids:
+ data_info_bu = {
+ 'img_ids': [img_info['img_id']],
+ 'img_path': [img_info['img_path']],
+ 'id': list(),
+ }
+ data_list_bu.append(data_info_bu)
+
+ return data_list_bu
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b3f28f5f9067663cb15a2037594c1475ebc6e1f
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__init__.py
@@ -0,0 +1,36 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .aic_dataset import AicDataset
+from .coco_dataset import CocoDataset
+from .crowdpose_dataset import CrowdPoseDataset
+from .humanart_dataset import HumanArtDataset
+from .jhmdb_dataset import JhmdbDataset
+from .mhp_dataset import MhpDataset
+from .mpii_dataset import MpiiDataset
+from .mpii_trb_dataset import MpiiTrbDataset
+from .ochuman_dataset import OCHumanDataset
+from .posetrack18_dataset import PoseTrack18Dataset
+from .posetrack18_video_dataset import PoseTrack18VideoDataset
+from .aic2coco_dataset import Aic2CocoDataset
+from .mpii2coco_dataset import Mpii2CocoDataset
+from .crowdpose2coco_dataset import Crowdpose2CocoDataset
+from .goliath_dataset import GoliathDataset
+from .goliath_eval_dataset import GoliathEvalDataset
+from .goliath3d_eval_dataset import Goliath3dEvalDataset
+from .coco2goliath_dataset import Coco2GoliathDataset
+from .crowdpose2goliath_dataset import Crowdpose2GoliathDataset
+from .aic2goliath_dataset import Aic2GoliathDataset
+from .mpii2goliath_dataset import Mpii2GoliathDataset
+
+__all__ = [
+ 'CocoDataset', 'MpiiDataset', 'MpiiTrbDataset', 'AicDataset',
+ 'CrowdPoseDataset', 'OCHumanDataset', 'MhpDataset', 'PoseTrack18Dataset',
+ 'JhmdbDataset', 'PoseTrack18VideoDataset', 'HumanArtDataset', 'Aic2CocoDataset',
+ 'Mpii2CocoDataset', 'Crowdpose2CocoDataset', 'GoliathDataset', 'GoliathEvalDataset',
+ 'Coco2GoliathDataset', 'Crowdpose2GoliathDataset', 'Mpii2GoliathDataset', 'Aic2GoliathDataset',
+ 'Goliath3dEvalDataset'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fb75789e5f30c530262e0fb9103af8fd0957bb24
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/aic2coco_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/aic2coco_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bc4f48ef1f9f95a4c8575c915f247bff3a14cc78
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/aic2coco_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/aic2goliath_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/aic2goliath_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..60b60250b9dff7a49c87ede4bb3c53a7039644ee
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/aic2goliath_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/aic_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/aic_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..57b5d8ac9d009ad37f36c61d2652a0fe0ba602df
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/aic_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/coco2goliath_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/coco2goliath_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e26981d1fa1603784d3d60f03d7c66f16ab8a16d
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/coco2goliath_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/coco_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/coco_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..999c3b01dd3edc6cc2a83d0dc2ce1c63393ded56
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/coco_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/crowdpose2coco_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/crowdpose2coco_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3881ca071bf0d7d0e673949abba12ca7947418b2
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/crowdpose2coco_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/crowdpose2goliath_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/crowdpose2goliath_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f5e8f8a183466466cbeef7c23dee95ecba3782e2
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/crowdpose2goliath_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/crowdpose_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/crowdpose_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cbb8ceb32a2b7f4400119514a8b69118ac0961ec
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/crowdpose_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/goliath3d_eval_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/goliath3d_eval_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..600c653ee0951a692c8850648d9585066ab53349
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/goliath3d_eval_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/goliath_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/goliath_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c2d0020bfbb3ae66d72ea8fd43a7e84e08b739a8
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/goliath_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/goliath_eval_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/goliath_eval_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..43d0512b29d569f21419278c53d4897beceeb45e
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/goliath_eval_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/humanart_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/humanart_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bcfb1b12afc63407b69a94c07e0af8b53f82378a
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/humanart_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/jhmdb_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/jhmdb_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e2b432acc9cbc6e18f4555934b190b076822c7e9
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/jhmdb_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/mhp_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/mhp_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..21fb321777ecce83ee0f5a883008a9afbc0937e0
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/mhp_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/mpii2coco_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/mpii2coco_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..16da559edc5e0fe9dd66659cf8bb02a2609baa82
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/mpii2coco_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/mpii2goliath_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/mpii2goliath_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..34d945e80e9b6573b7ba6622e843b9566a86765f
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/mpii2goliath_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/mpii_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/mpii_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7c93d66613f79a0bf466a94cf6b3bbd424df73d0
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/mpii_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/mpii_trb_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/mpii_trb_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2f85dd002e9d1d5d62352e79ea88dc75b865fd34
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/mpii_trb_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/ochuman_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/ochuman_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5904db0014cd33531f134ac8674c3422153a3e1c
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/ochuman_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/posetrack18_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/posetrack18_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6daa22b840b30ea1eb4de7b8c9abb48d6a581bb5
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/posetrack18_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/posetrack18_video_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/posetrack18_video_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f01ca7b8cc5800cb8d914302e376ff272c57227b
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/__pycache__/posetrack18_video_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/aic2coco_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/aic2coco_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..282fa6e898397773953942eb2a503dc95c0450a5
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/aic2coco_dataset.py
@@ -0,0 +1,168 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
+import numpy as np
+import copy
+
+AIC_KEYPOINT_ORDER = ['right_shoulder', 'right_elbow', 'right_wrist', 'left_shoulder', 'left_elbow', 'left_wrist',
+ 'right_hip', 'right_knee', 'right_ankle', 'left_hip', 'left_knee', 'left_ankle',
+ 'head', 'neck']
+
+COCO_KEYPOINT_ORDER = ['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']
+
+AIC_TO_COCO_INDICES = {joint_index: None for joint_index in range(len(AIC_KEYPOINT_ORDER))}
+for aic_joint_index in range(len(AIC_KEYPOINT_ORDER)):
+ if AIC_KEYPOINT_ORDER[aic_joint_index] in COCO_KEYPOINT_ORDER:
+ AIC_TO_COCO_INDICES[aic_joint_index] = COCO_KEYPOINT_ORDER.index(AIC_KEYPOINT_ORDER[aic_joint_index])
+
+@DATASETS.register_module()
+class Aic2CocoDataset(BaseCocoStyleDataset):
+ """AIC dataset for pose estimation.
+
+ "AI Challenger : A Large-scale Dataset for Going Deeper
+ in Image Understanding", arXiv'2017.
+ More details can be found in the `paper
+ `__
+
+ AIC keypoints::
+
+ 0: "right_shoulder",
+ 1: "right_elbow",
+ 2: "right_wrist",
+ 3: "left_shoulder",
+ 4: "left_elbow",
+ 5: "left_wrist",
+ 6: "right_hip",
+ 7: "right_knee",
+ 8: "right_ankle",
+ 9: "left_hip",
+ 10: "left_knee",
+ 11: "left_ankle",
+ 12: "head_top",
+ 13: "neck"
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/aic2coco.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict | None: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ # filter invalid instance
+ if 'bbox' not in ann or 'keypoints' not in ann:
+ return None
+
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ raw_keypoints = keypoints.copy()
+ raw_keypoints_visible = keypoints_visible.copy()
+
+ keypoints = np.zeros((1, len(COCO_KEYPOINT_ORDER), 2), dtype=np.float32)
+ keypoints_visible = np.zeros((1, len(COCO_KEYPOINT_ORDER)), dtype=np.float32)
+
+ for aic_joint_index in range(len(AIC_KEYPOINT_ORDER)):
+ coco_joint_index = AIC_TO_COCO_INDICES[aic_joint_index]
+
+ if coco_joint_index is not None:
+ keypoints[0, coco_joint_index, :2] = raw_keypoints[0, aic_joint_index, :2]
+ keypoints_visible[0, coco_joint_index] = raw_keypoints_visible[0, aic_joint_index]
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img['img_path'],
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann.get('iscrowd', 0),
+ 'segmentation': ann.get('segmentation', None),
+ 'id': ann['id'],
+ 'category_id': ann['category_id'],
+ # store the raw annotation of the instance
+ # it is useful for evaluation without providing ann_file
+ 'raw_ann_info': copy.deepcopy(ann),
+ }
+
+ if 'crowdIndex' in img:
+ data_info['crowd_index'] = img['crowdIndex']
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/aic2goliath_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/aic2goliath_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..4ae57d61a2252d8ee7b49f1c518313a4da8f0f3a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/aic2goliath_dataset.py
@@ -0,0 +1,175 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
+import numpy as np
+import copy
+import os
+import sys
+
+##-----------------------------------------------------------------------------------------------------------
+try:
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../..')) \
+ if os.path.join(os.path.dirname(__file__), '../../../..') not in sys.path else None
+
+ from configs._base_.datasets.aic import dataset_info as source_dataset_info
+ from configs._base_.datasets.goliath import dataset_info as target_dataset_info
+
+ SOURCE_KEYPOINT_ORDER = [v['name'] for k, v in sorted(source_dataset_info['keypoint_info'].items())]
+ TARGET_KEYPOINT_ORDER = [v['name'] for k, v in sorted(target_dataset_info['keypoint_info'].items())]
+
+ SOURCE_TO_TARGET_INDICES = {joint_index: None for joint_index in range(len(SOURCE_KEYPOINT_ORDER))}
+ for joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ if SOURCE_KEYPOINT_ORDER[joint_index] in TARGET_KEYPOINT_ORDER:
+ SOURCE_TO_TARGET_INDICES[joint_index] = TARGET_KEYPOINT_ORDER.index(SOURCE_KEYPOINT_ORDER[joint_index])
+except Exception as e:
+ pass
+
+##-----------------------------------------------------------------------------------------------------------
+
+@DATASETS.register_module()
+class Aic2GoliathDataset(BaseCocoStyleDataset):
+ """AIC dataset for pose estimation.
+
+ "AI Challenger : A Large-scale Dataset for Going Deeper
+ in Image Understanding", arXiv'2017.
+ More details can be found in the `paper
+ `__
+
+ AIC keypoints::
+
+ 0: "right_shoulder",
+ 1: "right_elbow",
+ 2: "right_wrist",
+ 3: "left_shoulder",
+ 4: "left_elbow",
+ 5: "left_wrist",
+ 6: "right_hip",
+ 7: "right_knee",
+ 8: "right_ankle",
+ 9: "left_hip",
+ 10: "left_knee",
+ 11: "left_ankle",
+ 12: "head_top",
+ 13: "neck"
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/aic2goliath.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict | None: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ # filter invalid instance
+ if 'bbox' not in ann or 'keypoints' not in ann:
+ return None
+
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ raw_keypoints = keypoints.copy()
+ raw_keypoints_visible = keypoints_visible.copy()
+
+ keypoints = np.zeros((1, len(TARGET_KEYPOINT_ORDER), 2), dtype=np.float32)
+ keypoints_visible = np.zeros((1, len(TARGET_KEYPOINT_ORDER)), dtype=np.float32)
+
+ for source_joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ target_joint_index = SOURCE_TO_TARGET_INDICES[source_joint_index]
+
+ if target_joint_index is not None:
+ keypoints[0, target_joint_index, :2] = raw_keypoints[0, source_joint_index, :2]
+ keypoints_visible[0, target_joint_index] = raw_keypoints_visible[0, source_joint_index]
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img['img_path'],
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann.get('iscrowd', 0),
+ 'segmentation': ann.get('segmentation', None),
+ 'id': ann['id'],
+ 'category_id': ann['category_id'],
+ # store the raw annotation of the instance
+ # it is useful for evaluation without providing ann_file
+ 'raw_ann_info': copy.deepcopy(ann),
+ }
+
+ if 'crowdIndex' in img:
+ data_info['crowd_index'] = img['crowdIndex']
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/aic_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/aic_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..ce1af55937832ae0ee801b83c2258c8b4d76e125
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/aic_dataset.py
@@ -0,0 +1,75 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class AicDataset(BaseCocoStyleDataset):
+ """AIC dataset for pose estimation.
+
+ "AI Challenger : A Large-scale Dataset for Going Deeper
+ in Image Understanding", arXiv'2017.
+ More details can be found in the `paper
+ `__
+
+ AIC keypoints::
+
+ 0: "right_shoulder",
+ 1: "right_elbow",
+ 2: "right_wrist",
+ 3: "left_shoulder",
+ 4: "left_elbow",
+ 5: "left_wrist",
+ 6: "right_hip",
+ 7: "right_knee",
+ 8: "right_ankle",
+ 9: "left_hip",
+ 10: "left_knee",
+ 11: "left_ankle",
+ 12: "head_top",
+ 13: "neck"
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/aic.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/coco2goliath_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/coco2goliath_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..e4b208cc12e890aacb50154ce37c479dbc1d740f
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/coco2goliath_dataset.py
@@ -0,0 +1,115 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
+import numpy as np
+import copy
+import os
+import sys
+
+##-----------------------------------------------------------------------------------------------------------
+try:
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../..')) \
+ if os.path.join(os.path.dirname(__file__), '../../../..') not in sys.path else None
+
+ from configs._base_.datasets.coco import dataset_info as source_dataset_info
+ from configs._base_.datasets.goliath import dataset_info as target_dataset_info
+
+ SOURCE_KEYPOINT_ORDER = [v['name'] for k, v in sorted(source_dataset_info['keypoint_info'].items())]
+ TARGET_KEYPOINT_ORDER = [v['name'] for k, v in sorted(target_dataset_info['keypoint_info'].items())]
+
+ SOURCE_TO_TARGET_INDICES = {joint_index: None for joint_index in range(len(SOURCE_KEYPOINT_ORDER))}
+ for joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ if SOURCE_KEYPOINT_ORDER[joint_index] in TARGET_KEYPOINT_ORDER:
+ SOURCE_TO_TARGET_INDICES[joint_index] = TARGET_KEYPOINT_ORDER.index(SOURCE_KEYPOINT_ORDER[joint_index])
+except Exception as e:
+ print('Warning: Failed to import source and target dataset info. Inference only mode active.')
+
+##-----------------------------------------------------------------------------------------------------------
+@DATASETS.register_module()
+class Coco2GoliathDataset(BaseCocoStyleDataset):
+ """
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/coco2goliath.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict | None: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ # filter invalid instance
+ if 'bbox' not in ann or 'keypoints' not in ann:
+ return None
+
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ raw_keypoints = keypoints.copy()
+ raw_keypoints_visible = keypoints_visible.copy()
+
+ keypoints = np.zeros((1, len(TARGET_KEYPOINT_ORDER), 2), dtype=np.float32)
+ keypoints_visible = np.zeros((1, len(TARGET_KEYPOINT_ORDER)), dtype=np.float32)
+
+ for source_joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ target_joint_index = SOURCE_TO_TARGET_INDICES[source_joint_index]
+
+ if target_joint_index is not None:
+ keypoints[0, target_joint_index, :2] = raw_keypoints[0, source_joint_index, :2]
+ keypoints_visible[0, target_joint_index] = raw_keypoints_visible[0, source_joint_index]
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img['img_path'],
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann.get('iscrowd', 0),
+ 'segmentation': ann.get('segmentation', None),
+ 'id': ann['id'],
+ 'category_id': ann['category_id'],
+ # store the raw annotation of the instance
+ # it is useful for evaluation without providing ann_file
+ 'raw_ann_info': copy.deepcopy(ann),
+ }
+
+ if 'crowdIndex' in img:
+ data_info['crowd_index'] = img['crowdIndex']
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/coco_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/coco_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..5b286b2e3f37ea4738aff98e37aa927aa6377695
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/coco_dataset.py
@@ -0,0 +1,79 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class CocoDataset(BaseCocoStyleDataset):
+ """COCO dataset for pose estimation.
+
+ "Microsoft COCO: Common Objects in Context", ECCV'2014.
+ More details can be found in the `paper
+ `__ .
+
+ COCO keypoints::
+
+ 0: 'nose',
+ 1: 'left_eye',
+ 2: 'right_eye',
+ 3: 'left_ear',
+ 4: 'right_ear',
+ 5: 'left_shoulder',
+ 6: 'right_shoulder',
+ 7: 'left_elbow',
+ 8: 'right_elbow',
+ 9: 'left_wrist',
+ 10: 'right_wrist',
+ 11: 'left_hip',
+ 12: 'right_hip',
+ 13: 'left_knee',
+ 14: 'right_knee',
+ 15: 'left_ankle',
+ 16: 'right_ankle'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/coco.py')
+
+
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/crowdpose2coco_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/crowdpose2coco_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..6513854a80cb14f8f1e59a582eadace2afb034bf
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/crowdpose2coco_dataset.py
@@ -0,0 +1,113 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
+import numpy as np
+import copy
+
+CROWDPOSE_KEYPOINT_ORDER = ['left_shoulder', 'right_shoulder', 'left_elbow', 'right_elbow',
+ 'left_wrist', 'right_wrist', 'left_hip', 'right_hip',
+ 'left_knee', 'right_knee', 'left_ankle', 'right_ankle',
+ 'head', 'neck']
+
+COCO_KEYPOINT_ORDER = ['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']
+
+
+CROWDPOSE_TO_COCO_INDICES = {joint_index: None for joint_index in range(len(CROWDPOSE_KEYPOINT_ORDER))}
+
+for crowdpose_joint_index in range(len(CROWDPOSE_KEYPOINT_ORDER)):
+ if CROWDPOSE_KEYPOINT_ORDER[crowdpose_joint_index] in COCO_KEYPOINT_ORDER:
+ CROWDPOSE_TO_COCO_INDICES[crowdpose_joint_index] = COCO_KEYPOINT_ORDER.index(CROWDPOSE_KEYPOINT_ORDER[crowdpose_joint_index])
+
+
+@DATASETS.register_module()
+class Crowdpose2CocoDataset(BaseCocoStyleDataset):
+ """
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/crowdpose2coco.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict | None: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ # filter invalid instance
+ if 'bbox' not in ann or 'keypoints' not in ann:
+ return None
+
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ raw_keypoints = keypoints.copy()
+ raw_keypoints_visible = keypoints_visible.copy()
+
+ keypoints = np.zeros((1, len(COCO_KEYPOINT_ORDER), 2), dtype=np.float32)
+ keypoints_visible = np.zeros((1, len(COCO_KEYPOINT_ORDER)), dtype=np.float32)
+
+ for crowdpose_joint_index in range(len(CROWDPOSE_KEYPOINT_ORDER)):
+ coco_joint_index = CROWDPOSE_TO_COCO_INDICES[crowdpose_joint_index]
+
+ if coco_joint_index is not None:
+ keypoints[0, coco_joint_index, :2] = raw_keypoints[0, crowdpose_joint_index, :2]
+ keypoints_visible[0, coco_joint_index] = raw_keypoints_visible[0, crowdpose_joint_index]
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img['img_path'],
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann.get('iscrowd', 0),
+ 'segmentation': ann.get('segmentation', None),
+ 'id': ann['id'],
+ 'category_id': ann['category_id'],
+ # store the raw annotation of the instance
+ # it is useful for evaluation without providing ann_file
+ 'raw_ann_info': copy.deepcopy(ann),
+ }
+
+ if 'crowdIndex' in img:
+ data_info['crowd_index'] = img['crowdIndex']
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/crowdpose2goliath_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/crowdpose2goliath_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..1a072de88f910ba156d7fd61138c1f901f064cd3
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/crowdpose2goliath_dataset.py
@@ -0,0 +1,115 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
+import numpy as np
+import copy
+import os
+import sys
+
+##-----------------------------------------------------------------------------------------------------------
+try:
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../..')) \
+ if os.path.join(os.path.dirname(__file__), '../../../..') not in sys.path else None
+
+ from configs._base_.datasets.crowdpose import dataset_info as source_dataset_info
+ from configs._base_.datasets.goliath import dataset_info as target_dataset_info
+
+ SOURCE_KEYPOINT_ORDER = [v['name'] for k, v in sorted(source_dataset_info['keypoint_info'].items())]
+ TARGET_KEYPOINT_ORDER = [v['name'] for k, v in sorted(target_dataset_info['keypoint_info'].items())]
+
+ SOURCE_TO_TARGET_INDICES = {joint_index: None for joint_index in range(len(SOURCE_KEYPOINT_ORDER))}
+ for joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ if SOURCE_KEYPOINT_ORDER[joint_index] in TARGET_KEYPOINT_ORDER:
+ SOURCE_TO_TARGET_INDICES[joint_index] = TARGET_KEYPOINT_ORDER.index(SOURCE_KEYPOINT_ORDER[joint_index])
+except Exception as e:
+ pass
+
+##-----------------------------------------------------------------------------------------------------------
+@DATASETS.register_module()
+class Crowdpose2GoliathDataset(BaseCocoStyleDataset):
+ """
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/crowdpose2goliath.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict | None: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ # filter invalid instance
+ if 'bbox' not in ann or 'keypoints' not in ann:
+ return None
+
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ raw_keypoints = keypoints.copy()
+ raw_keypoints_visible = keypoints_visible.copy()
+
+ keypoints = np.zeros((1, len(TARGET_KEYPOINT_ORDER), 2), dtype=np.float32)
+ keypoints_visible = np.zeros((1, len(TARGET_KEYPOINT_ORDER)), dtype=np.float32)
+
+ for source_joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ target_joint_index = SOURCE_TO_TARGET_INDICES[source_joint_index]
+
+ if target_joint_index is not None:
+ keypoints[0, target_joint_index, :2] = raw_keypoints[0, source_joint_index, :2]
+ keypoints_visible[0, target_joint_index] = raw_keypoints_visible[0, source_joint_index]
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img['img_path'],
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann.get('iscrowd', 0),
+ 'segmentation': ann.get('segmentation', None),
+ 'id': ann['id'],
+ 'category_id': ann['category_id'],
+ # store the raw annotation of the instance
+ # it is useful for evaluation without providing ann_file
+ 'raw_ann_info': copy.deepcopy(ann),
+ }
+
+ if 'crowdIndex' in img:
+ data_info['crowd_index'] = img['crowdIndex']
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/crowdpose_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/crowdpose_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..da1699633cbdae8266e65bac93065c3896fb6f65
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/crowdpose_dataset.py
@@ -0,0 +1,75 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class CrowdPoseDataset(BaseCocoStyleDataset):
+ """CrowdPose dataset for pose estimation.
+
+ "CrowdPose: Efficient Crowded Scenes Pose Estimation and
+ A New Benchmark", CVPR'2019.
+ More details can be found in the `paper
+ `__.
+
+ CrowdPose keypoints::
+
+ 0: 'left_shoulder',
+ 1: 'right_shoulder',
+ 2: 'left_elbow',
+ 3: 'right_elbow',
+ 4: 'left_wrist',
+ 5: 'right_wrist',
+ 6: 'left_hip',
+ 7: 'right_hip',
+ 8: 'left_knee',
+ 9: 'right_knee',
+ 10: 'left_ankle',
+ 11: 'right_ankle',
+ 12: 'top_head',
+ 13: 'neck'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/crowdpose.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/goliath3d_eval_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/goliath3d_eval_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..0bb83fa39df8b17e6d90e510199ee025e498ee8a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/goliath3d_eval_dataset.py
@@ -0,0 +1,107 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+import torch
+import torch.utils.data
+import torch.multiprocessing as mp
+import numpy as np
+import os
+import cv2
+import pickle
+from PIL import ImageDraw
+from tqdm import tqdm
+import io
+import json
+import copy
+from PIL import Image
+from concurrent.futures import ThreadPoolExecutor
+import random
+from matplotlib import pyplot as plt
+
+import copy
+import os.path as osp
+from copy import deepcopy
+from itertools import filterfalse, groupby
+from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
+
+from mmengine.dataset import BaseDataset, force_full_init
+from mmengine.fileio import exists, get_local_path, load
+from mmengine.utils import is_list_of
+from xtcocotools.coco import COCO
+
+from mmpose.registry import DATASETS
+from mmpose.structures.bbox import bbox_xywh2xyxy
+from ..utils import parse_pose_metainfo
+
+from contextlib import redirect_stderr
+with open(os.devnull, 'w') as f, redirect_stderr(f):
+ try:
+ from care.data.io import typed
+ except Exception:
+ # If the import fails, you can handle it here without printing any errors.
+ pass
+
+@DATASETS.register_module()
+class Goliath3dEvalDataset(BaseCocoStyleDataset):
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/goliath3d.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ img_path = osp.join(self.data_prefix['img'], img['file_name'])
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(ann['goliath_wholebody_kpts']).reshape(1, -1, 3) ## 1 z 308 x 3
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2] > 0)
+
+ num_keypoints = ann['num_keypoints']
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img_path,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann['iscrowd'],
+ 'segmentation': None,
+ 'id': ann['id'],
+ 'category_id': ann['category_id'],
+ # store the raw annotation of the instance
+ # it is useful for evaluation without providing ann_file
+ 'raw_ann_info': copy.deepcopy(ann),
+ }
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/goliath_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/goliath_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..18bbbd8aa839cc1a7df0dea8d41961cab0890dba
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/goliath_dataset.py
@@ -0,0 +1,252 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import warnings
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+import torch
+import torch.utils.data
+import torch.multiprocessing as mp
+import numpy as np
+import os
+import cv2
+import pickle
+from PIL import ImageDraw
+from tqdm import tqdm
+import io
+import json
+import copy
+from PIL import Image
+from concurrent.futures import ThreadPoolExecutor
+import random
+from matplotlib import pyplot as plt
+
+import copy
+import os.path as osp
+from copy import deepcopy
+from itertools import filterfalse, groupby
+from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
+
+from mmengine.dataset import BaseDataset, force_full_init
+from mmengine.fileio import exists, get_local_path, load
+from mmengine.utils import is_list_of
+from xtcocotools.coco import COCO
+
+from mmpose.registry import DATASETS
+from mmpose.structures.bbox import bbox_xywh2xyxy
+from ..utils import parse_pose_metainfo
+
+from contextlib import redirect_stderr
+
+with open(os.devnull, 'w') as f, redirect_stderr(f):
+ try:
+ from care.data.io import typed
+ except Exception:
+ # If the import fails, you can handle it here without printing any errors.
+ pass
+
+# - image (binary): Image file binary in jpg or png format.
+# - keypoint (numpy.array): Keypoint coordinates array with shape (3, num_points). Rows represent (x, y, annot_flag) where:
+# * annot_flag == 0: not annotated
+# * annot_flag == 1, x < 0, y < 0: point not visible in the image
+# * otherwise: point may be visible at (x, y)
+# - segmentation (binary): Segmentation file binary in png format. Pixel value represents class label.
+# 0 is always background, 255 is the ignore label.
+# - dataset_name (str): Name of the dataset this sample belongs to.
+# - dataset_version (str): Date when dataset was created. Only the latest version will be ingested.
+# - session_id (str): Capture session ID of this sample.
+# - camera_id (str): Camera ID for this sample.
+# - frame_number (int): Frame number of this sample in the capture.
+# - label_definition_name (str): Definition of the annotation for this sample. Refer to `keypoint_definition` or `segmentation_definition` for more details.
+# - box_default (str): Image bounding box size. Should be [0, 0, W, H] for all samples.
+
+@DATASETS.register_module()
+class GoliathDataset(BaseCocoStyleDataset):
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/goliath.py')
+
+ def __init__(self,
+ ann_file: str = '',
+ bbox_file: Optional[str] = None,
+ data_mode: str = 'topdown',
+ metainfo: Optional[dict] = None,
+ data_root: Optional[str] = None,
+ data_prefix: dict = dict(img=''),
+ filter_cfg: Optional[dict] = None,
+ indices: Optional[Union[int, Sequence[int]]] = None,
+ serialize_data: bool = True,
+ pipeline: List[Union[dict, Callable]] = [],
+ test_mode: bool = False,
+ lazy_init: bool = False,
+ max_refetch: int = 1000):
+
+ super().__init__(
+ ann_file=ann_file,
+ bbox_file=bbox_file,
+ data_mode=data_mode,
+ metainfo=metainfo,
+ data_root=data_root,
+ data_prefix=data_prefix,
+ filter_cfg=filter_cfg,
+ indices=indices,
+ serialize_data=serialize_data,
+ pipeline=pipeline,
+ test_mode=test_mode,
+ lazy_init=lazy_init,
+ max_refetch=max_refetch)
+
+ self.remove_teeth = self.metainfo['remove_teeth']
+
+ if self.remove_teeth:
+ self.teeth_ids = self.metainfo['teeth_keypoint_ids']
+
+ return
+
+ def load_data_list(self) -> List[dict]:
+ """Load data list from 344 body points."""
+
+ self._register_airstore_handler()
+
+ with open(self.ann_file, "rb") as f:
+ raw = f.read()
+ raw_data = json.loads(raw) # samples=5,267,269
+
+ data_list = []
+ for sample in raw_data:
+ dp = { "airstore_id": sample["sample_id"],
+ "session_id": str(sample["session_id"]),
+ "camera_id": str(sample["camera_id"]),
+ "frame_id": str(sample["frame_number"]),
+ }
+ if sample.get("box-default") is not None:
+ dp["box"] = sample["box-default"]
+ data_list.append(dp)
+
+ print('\033[92msorting by session, camera and frame numbers\033[0m')
+
+ # Sort the data_list by session_id, then by camera_id, and finally by frame_number
+ data_list = sorted(data_list, key=lambda y: (y['session_id'], y['camera_id'], y['frame_id']))
+
+ print('\033[92mDone! Loaded total samples: {}\033[0m'.format(len(data_list)))
+
+ return data_list
+
+ def _register_airstore_handler(self) -> None:
+ from care.strict.data.io.file_system.airstore_client import register_airstore_in_fsspec
+ register_airstore_in_fsspec()
+ self.path_template = "airstoreds://rlr_detection_services_ml_datasets_no_user_data"
+ self.airstore = True
+
+ def _read_from_airstore(self, asset: str, sid: str) -> io.BytesIO:
+ with typed.open(self.path_template + f"/{asset}?sampleId={sid}").open() as f:
+ data = io.BytesIO(f.read())
+ return data
+
+ def get_data_info(self, idx):
+ if self.serialize_data:
+ start_addr = 0 if idx == 0 else self.data_address[idx - 1].item()
+ end_addr = self.data_address[idx].item()
+ bytes = memoryview(
+ self.data_bytes[start_addr:end_addr]) # type: ignore
+ data_info = pickle.loads(bytes) # type: ignore
+ else:
+ data_info = copy.deepcopy(self.data_list[idx])
+
+ try:
+ img = Image.open(self._read_from_airstore("image", data_info['airstore_id'])) ## pillow image
+ keypoints_np = np.load(self._read_from_airstore("keypoint", data_info['airstore_id'])) # shape 3 x 344
+ except Exception as e:
+ print(f"Error loading data: {e}")
+ return None
+
+ img = np.array(img) ## RGB image
+ img = img[:, :, ::-1] # Convert RGB to BGR, the model preprocessor will convert this to rgb again
+
+ img_w, img_h = img.shape[1], img.shape[0]
+
+ # process keypoints
+ keypoints = keypoints_np[:2].T.reshape(1, -1, 2) # shape 1 x 344 x 2
+ keypoints_visible = np.where(keypoints_np[2].T > 0, 1, 0).reshape(1, -1) # shape 1 x 344
+
+ # Identify keypoints that are out of bounds for x (width) and y (height)
+ out_of_bounds_w = np.logical_or(keypoints[0, :, 0] <= 0, keypoints[0, :, 0] >= img_w)
+ out_of_bounds_h = np.logical_or(keypoints[0, :, 1] <= 0, keypoints[0, :, 1] >= img_h)
+
+ # Update keypoints_visible based on the out-of-bounds keypoints
+ keypoints_visible[0, out_of_bounds_w | out_of_bounds_h] = 0
+
+ ## remove teeth keypoints
+ if self.remove_teeth:
+ # Use numpy's boolean indexing to remove keypoints
+ mask = np.ones(keypoints.shape[1], dtype=bool)
+ mask[self.teeth_ids] = False
+ keypoints = keypoints[:, mask, :]
+ keypoints_visible = keypoints_visible[:, mask]
+
+ # Default bounding box to the full image size
+ bbox = np.array([0, 0, img_w, img_h], dtype=np.float32).reshape(1, 4)
+
+ if np.any(keypoints_visible): # If any keypoints are visible
+ visible_keypoints = keypoints[0][keypoints_visible[0] == 1] # Filter out the invisible keypoints
+
+ # Get the bounding box encompassing the keypoints
+ x_min, y_min = np.clip(np.min(visible_keypoints, axis=0), [0, 0], [img_w, img_h])
+ x_max, y_max = np.clip(np.max(visible_keypoints, axis=0), [0, 0], [img_w, img_h])
+
+ bbox = np.array([x_min, y_min, x_max, y_max], dtype=np.float32).reshape(1, 4)
+
+ num_keypoints = np.count_nonzero(keypoints_visible)
+
+ ## atleast 8 vis keypoints
+ if num_keypoints < self.metainfo['min_visible_keypoints']:
+ random_idx = np.random.randint(0, len(self.data_list))
+ return self.get_data_info(random_idx)
+
+ ## ignore greyscale images for training
+ B, G, R = cv2.split(img)
+ if np.array_equal(B, G) and np.array_equal(B, R):
+ random_idx = np.random.randint(0, len(self.data_list))
+ return self.get_data_info(random_idx)
+
+ data_info = {
+ 'img': img,
+ 'img_id': '',
+ 'img_path': '',
+ 'session_id': data_info['session_id'],
+ 'camera_id': data_info['camera_id'],
+ 'frame_id': data_info['frame_id'],
+ 'airstore_id': data_info['airstore_id'],
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': 0,
+ 'segmentation': None,
+ 'id': idx,
+ 'category_id': 1,
+ }
+
+ # Some codebase needs `sample_idx` of data information. Here we convert
+ # the idx to a positive number and save it in data information.
+ if idx >= 0:
+ data_info['sample_idx'] = idx
+ else:
+ data_info['sample_idx'] = len(self) + idx
+
+ # Add metainfo items that are required in the pipeline and the model
+ metainfo_keys = [
+ 'upper_body_ids', 'lower_body_ids', 'flip_pairs',
+ 'dataset_keypoint_weights', 'flip_indices', 'skeleton_links'
+ ]
+
+ for key in metainfo_keys:
+ assert key not in data_info, (
+ f'"{key}" is a reserved key for `metainfo`, but already '
+ 'exists in the `data_info`.')
+
+ data_info[key] = deepcopy(self._metainfo[key])
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/goliath_eval_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/goliath_eval_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..cbb533820344652238906abf11557578bd7eb4ad
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/goliath_eval_dataset.py
@@ -0,0 +1,146 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+import torch
+import torch.utils.data
+import torch.multiprocessing as mp
+import numpy as np
+import os
+import cv2
+import pickle
+from PIL import ImageDraw
+from tqdm import tqdm
+import io
+import json
+import copy
+from PIL import Image
+from concurrent.futures import ThreadPoolExecutor
+import random
+from matplotlib import pyplot as plt
+
+import copy
+import os.path as osp
+from copy import deepcopy
+from itertools import filterfalse, groupby
+from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
+
+from mmengine.dataset import BaseDataset, force_full_init
+from mmengine.fileio import exists, get_local_path, load
+from mmengine.utils import is_list_of
+from xtcocotools.coco import COCO
+
+from mmpose.registry import DATASETS
+from mmpose.structures.bbox import bbox_xywh2xyxy
+from ..utils import parse_pose_metainfo
+
+from contextlib import redirect_stderr
+with open(os.devnull, 'w') as f, redirect_stderr(f):
+ try:
+ from care.data.io import typed
+ except Exception:
+ # If the import fails, you can handle it here without printing any errors.
+ pass
+
+@DATASETS.register_module()
+class GoliathEvalDataset(BaseCocoStyleDataset):
+ """
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/goliath.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ img_path = osp.join(self.data_prefix['img'], img['file_name'])
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(ann['goliath_wholebody_kpts']).reshape(1, -1, 3) ## 1 z 308 x 3
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2] > 0)
+
+ num_keypoints = ann['num_keypoints']
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img_path,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann['iscrowd'],
+ 'segmentation': None,
+ 'id': ann['id'],
+ 'category_id': ann['category_id'],
+ # store the raw annotation of the instance
+ # it is useful for evaluation without providing ann_file
+ 'raw_ann_info': copy.deepcopy(ann),
+ }
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/humanart_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/humanart_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..c62342e143df5e3b9d4063b203ac1a638ae790fa
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/humanart_dataset.py
@@ -0,0 +1,78 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class HumanArtDataset(BaseCocoStyleDataset):
+ """Human-Art dataset for pose estimation.
+
+ "Human-Art: A Versatile Human-Centric Dataset
+ Bridging Natural and Artificial Scenes", CVPR'2023.
+ More details can be found in the `paper
+ `__ .
+
+ Human-Art keypoints::
+
+ 0: 'nose',
+ 1: 'left_eye',
+ 2: 'right_eye',
+ 3: 'left_ear',
+ 4: 'right_ear',
+ 5: 'left_shoulder',
+ 6: 'right_shoulder',
+ 7: 'left_elbow',
+ 8: 'right_elbow',
+ 9: 'left_wrist',
+ 10: 'right_wrist',
+ 11: 'left_hip',
+ 12: 'right_hip',
+ 13: 'left_knee',
+ 14: 'right_knee',
+ 15: 'left_ankle',
+ 16: 'right_ankle'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/humanart.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/jhmdb_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/jhmdb_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..d97f08666c3445636298906893fb6e6faa8b5e5c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/jhmdb_dataset.py
@@ -0,0 +1,140 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+from typing import Optional
+
+import numpy as np
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class JhmdbDataset(BaseCocoStyleDataset):
+ """JhmdbDataset dataset for pose estimation.
+
+ "Towards understanding action recognition", ICCV'2013.
+ More details can be found in the `paper
+ `__
+
+ sub-JHMDB keypoints::
+
+ 0: "neck",
+ 1: "belly",
+ 2: "head",
+ 3: "right_shoulder",
+ 4: "left_shoulder",
+ 5: "right_hip",
+ 6: "left_hip",
+ 7: "right_elbow",
+ 8: "left_elbow",
+ 9: "right_knee",
+ 10: "left_knee",
+ 11: "right_wrist",
+ 12: "left_wrist",
+ 13: "right_ankle",
+ 14: "left_ankle"
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/jhmdb.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ img_path = osp.join(self.data_prefix['img'], img['file_name'])
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ # JHMDB uses matlab format, index is 1-based,
+ # we should first convert to 0-based index
+ x -= 1
+ y -= 1
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ # JHMDB uses matlab format, index is 1-based,
+ # we should first convert to 0-based index
+ keypoints = _keypoints[..., :2] - 1
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img_path,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann.get('iscrowd', 0),
+ 'segmentation': ann.get('segmentation', None),
+ 'id': ann['id'],
+ }
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/mhp_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/mhp_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..f419d09fc0d9738f5f21da95413e6724c25cc579
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/mhp_dataset.py
@@ -0,0 +1,77 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class MhpDataset(BaseCocoStyleDataset):
+ """MHPv2.0 dataset for pose estimation.
+
+ "Understanding Humans in Crowded Scenes: Deep Nested Adversarial
+ Learning and A New Benchmark for Multi-Human Parsing", ACM MM'2018.
+ More details can be found in the `paper
+ `__
+
+ MHP keypoints::
+
+ 0: "right ankle",
+ 1: "right knee",
+ 2: "right hip",
+ 3: "left hip",
+ 4: "left knee",
+ 5: "left ankle",
+ 6: "pelvis",
+ 7: "thorax",
+ 8: "upper neck",
+ 9: "head top",
+ 10: "right wrist",
+ 11: "right elbow",
+ 12: "right shoulder",
+ 13: "left shoulder",
+ 14: "left elbow",
+ 15: "left wrist",
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/mhp.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/mpii2coco_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/mpii2coco_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..891b45c219a6ec6e42ca87c8b24ca1a19553aceb
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/mpii2coco_dataset.py
@@ -0,0 +1,118 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import json
+import os.path as osp
+from typing import Callable, List, Optional, Sequence, Tuple, Union
+
+import copy
+import numpy as np
+from mmengine.fileio import exists, get_local_path
+from scipy.io import loadmat
+
+from mmpose.registry import DATASETS
+from mmpose.structures.bbox import bbox_cs2xyxy
+from ..base import BaseCocoStyleDataset
+
+
+MPII_KEYPOINT_ORDER = ['right_ankle', 'right_knee', 'right_hip', 'left_hip',
+ 'left_knee', 'left_ankle', 'pelvis', 'thorax',
+ 'upper_neck', 'head_top', 'right_wrist', 'right_elbow',
+ 'right_shoulder', 'left_shoulder', 'left_elbow',
+ 'left_wrist']
+
+COCO_KEYPOINT_ORDER = ['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']
+
+MPII_TO_COCO_INDICES = {joint_index: None for joint_index in range(len(MPII_KEYPOINT_ORDER))}
+for mpii_joint_index in range(len(MPII_KEYPOINT_ORDER)):
+ if MPII_KEYPOINT_ORDER[mpii_joint_index] in COCO_KEYPOINT_ORDER:
+ MPII_TO_COCO_INDICES[mpii_joint_index] = COCO_KEYPOINT_ORDER.index(MPII_KEYPOINT_ORDER[mpii_joint_index])
+
+@DATASETS.register_module()
+class Mpii2CocoDataset(BaseCocoStyleDataset):
+ """
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/mpii2coco.py')
+
+ def _load_annotations(self) -> Tuple[List[dict], List[dict]]:
+ """Load data from annotations in MPII format."""
+
+ assert exists(self.ann_file), 'Annotation file does not exist'
+ with get_local_path(self.ann_file) as local_path:
+ with open(local_path) as anno_file:
+ self.anns = json.load(anno_file)
+
+ instance_list = []
+ image_list = []
+ used_img_ids = set()
+ ann_id = 0
+
+ # mpii bbox scales are normalized with factor 200.
+ pixel_std = 200.
+
+ for idx, ann in enumerate(self.anns):
+ center = np.array(ann['center'], dtype=np.float32)
+ scale = np.array([ann['scale'], ann['scale']],
+ dtype=np.float32) * pixel_std
+
+ # Adjust center/scale slightly to avoid cropping limbs
+ if center[0] != -1:
+ center[1] = center[1] + 15. / pixel_std * scale[1]
+
+ # MPII uses matlab format, index is 1-based,
+ # we should first convert to 0-based index
+ center = center - 1
+
+ # unify shape with coco datasets
+ center = center.reshape(1, -1)
+ scale = scale.reshape(1, -1)
+ bbox = bbox_cs2xyxy(center, scale)
+
+ # load keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ keypoints = np.array(ann['joints']).reshape(1, -1, 2)
+ keypoints_visible = np.array(ann['joints_vis']).reshape(1, -1)
+
+ raw_keypoints = keypoints.copy()
+ raw_keypoints_visible = keypoints_visible.copy()
+
+ keypoints = np.zeros((1, len(COCO_KEYPOINT_ORDER), 2), dtype=np.float32)
+ keypoints_visible = np.zeros((1, len(COCO_KEYPOINT_ORDER)), dtype=np.float32)
+
+ for mpii_joint_index in range(len(MPII_KEYPOINT_ORDER)):
+ coco_joint_index = MPII_TO_COCO_INDICES[mpii_joint_index]
+
+ if coco_joint_index is not None:
+ keypoints[0, coco_joint_index, :2] = raw_keypoints[0, mpii_joint_index, :2]
+ keypoints_visible[0, coco_joint_index] = raw_keypoints_visible[0, mpii_joint_index]
+
+ instance_info = {
+ 'id': ann_id,
+ 'img_id': int(ann['image'].split('.')[0]),
+ 'img_path': osp.join(self.data_prefix['img'], ann['image']),
+ 'bbox_center': center,
+ 'bbox_scale': scale,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ }
+
+ if instance_info['img_id'] not in used_img_ids:
+ used_img_ids.add(instance_info['img_id'])
+ image_list.append({
+ 'img_id': instance_info['img_id'],
+ 'img_path': instance_info['img_path'],
+ })
+
+ instance_list.append(instance_info)
+ ann_id = ann_id + 1
+
+ return instance_list, image_list
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/mpii2goliath_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/mpii2goliath_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..61eda3f7d259a68ec022d137ca0cdc6235787a75
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/mpii2goliath_dataset.py
@@ -0,0 +1,124 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import json
+import os.path as osp
+from typing import Callable, List, Optional, Sequence, Tuple, Union
+
+import copy
+import numpy as np
+from mmengine.fileio import exists, get_local_path
+from scipy.io import loadmat
+
+from mmpose.registry import DATASETS
+from mmpose.structures.bbox import bbox_cs2xyxy
+from ..base import BaseCocoStyleDataset
+import os
+import sys
+
+##-----------------------------------------------------------------------------------------------------------
+try:
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../..')) \
+ if os.path.join(os.path.dirname(__file__), '../../../..') not in sys.path else None
+
+ from configs._base_.datasets.mpii import dataset_info as source_dataset_info
+ from configs._base_.datasets.goliath import dataset_info as target_dataset_info
+
+ SOURCE_KEYPOINT_ORDER = [v['name'] for k, v in sorted(source_dataset_info['keypoint_info'].items())]
+ TARGET_KEYPOINT_ORDER = [v['name'] for k, v in sorted(target_dataset_info['keypoint_info'].items())]
+
+ SOURCE_TO_TARGET_INDICES = {joint_index: None for joint_index in range(len(SOURCE_KEYPOINT_ORDER))}
+ for joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ if SOURCE_KEYPOINT_ORDER[joint_index] in TARGET_KEYPOINT_ORDER:
+ SOURCE_TO_TARGET_INDICES[joint_index] = TARGET_KEYPOINT_ORDER.index(SOURCE_KEYPOINT_ORDER[joint_index])
+except Exception as e:
+ pass
+
+##-----------------------------------------------------------------------------------------------------------
+@DATASETS.register_module()
+class Mpii2GoliathDataset(BaseCocoStyleDataset):
+ """
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/mpii2goliath.py')
+
+ def _load_annotations(self) -> Tuple[List[dict], List[dict]]:
+ """Load data from annotations in MPII format."""
+
+ assert exists(self.ann_file), 'Annotation file does not exist'
+ with get_local_path(self.ann_file) as local_path:
+ with open(local_path) as anno_file:
+ self.anns = json.load(anno_file)
+
+ instance_list = []
+ image_list = []
+ used_img_ids = set()
+ ann_id = 0
+
+ # mpii bbox scales are normalized with factor 200.
+ pixel_std = 200.
+
+ for idx, ann in enumerate(self.anns):
+ center = np.array(ann['center'], dtype=np.float32)
+ scale = np.array([ann['scale'], ann['scale']],
+ dtype=np.float32) * pixel_std
+
+ # Adjust center/scale slightly to avoid cropping limbs
+ if center[0] != -1:
+ center[1] = center[1] + 15. / pixel_std * scale[1]
+
+ # MPII uses matlab format, index is 1-based,
+ # we should first convert to 0-based index
+ center = center - 1
+
+ # unify shape with coco datasets
+ center = center.reshape(1, -1)
+ scale = scale.reshape(1, -1)
+ bbox = bbox_cs2xyxy(center, scale)
+
+ # load keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ keypoints = np.array(ann['joints']).reshape(1, -1, 2)
+ keypoints_visible = np.array(ann['joints_vis']).reshape(1, -1)
+
+ raw_keypoints = keypoints.copy()
+ raw_keypoints_visible = keypoints_visible.copy()
+
+ keypoints = np.zeros((1, len(TARGET_KEYPOINT_ORDER), 2), dtype=np.float32)
+ keypoints_visible = np.zeros((1, len(TARGET_KEYPOINT_ORDER)), dtype=np.float32)
+
+ for source_joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ target_joint_index = SOURCE_TO_TARGET_INDICES[source_joint_index]
+
+ if target_joint_index is not None:
+ keypoints[0, target_joint_index, :2] = raw_keypoints[0, source_joint_index, :2]
+ keypoints_visible[0, target_joint_index] = raw_keypoints_visible[0, source_joint_index]
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ instance_info = {
+ 'id': ann_id,
+ 'img_id': int(ann['image'].split('.')[0]),
+ 'img_path': osp.join(self.data_prefix['img'], ann['image']),
+ 'bbox_center': center,
+ 'bbox_scale': scale,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ }
+
+ if instance_info['img_id'] not in used_img_ids:
+ used_img_ids.add(instance_info['img_id'])
+ image_list.append({
+ 'img_id': instance_info['img_id'],
+ 'img_path': instance_info['img_path'],
+ })
+
+ instance_list.append(instance_info)
+ ann_id = ann_id + 1
+
+ return instance_list, image_list
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/mpii_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/mpii_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..64a437ad3511013fa9d9c2da87d48483c7ccf0c5
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/mpii_dataset.py
@@ -0,0 +1,217 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import json
+import os.path as osp
+from typing import Callable, List, Optional, Sequence, Tuple, Union
+
+import numpy as np
+from mmengine.fileio import exists, get_local_path
+from scipy.io import loadmat
+
+from mmpose.registry import DATASETS
+from mmpose.structures.bbox import bbox_cs2xyxy
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class MpiiDataset(BaseCocoStyleDataset):
+ """MPII Dataset for pose estimation.
+
+ "2D Human Pose Estimation: New Benchmark and State of the Art Analysis"
+ ,CVPR'2014. More details can be found in the `paper
+ `__ .
+
+ MPII keypoints::
+
+ 0: 'right_ankle'
+ 1: 'right_knee',
+ 2: 'right_hip',
+ 3: 'left_hip',
+ 4: 'left_knee',
+ 5: 'left_ankle',
+ 6: 'pelvis',
+ 7: 'thorax',
+ 8: 'upper_neck',
+ 9: 'head_top',
+ 10: 'right_wrist',
+ 11: 'right_elbow',
+ 12: 'right_shoulder',
+ 13: 'left_shoulder',
+ 14: 'left_elbow',
+ 15: 'left_wrist'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ headbox_file (str, optional): The path of ``mpii_gt_val.mat`` which
+ provides the headboxes information used for ``PCKh``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/mpii.py')
+
+ def __init__(self,
+ ann_file: str = '',
+ bbox_file: Optional[str] = None,
+ headbox_file: Optional[str] = None,
+ data_mode: str = 'topdown',
+ metainfo: Optional[dict] = None,
+ data_root: Optional[str] = None,
+ data_prefix: dict = dict(img=''),
+ filter_cfg: Optional[dict] = None,
+ indices: Optional[Union[int, Sequence[int]]] = None,
+ serialize_data: bool = True,
+ pipeline: List[Union[dict, Callable]] = [],
+ test_mode: bool = False,
+ lazy_init: bool = False,
+ max_refetch: int = 1000):
+
+ if headbox_file:
+ if data_mode != 'topdown':
+ raise ValueError(
+ f'{self.__class__.__name__} is set to {data_mode}: '
+ 'mode, while "headbox_file" is only '
+ 'supported in topdown mode.')
+
+ if not test_mode:
+ raise ValueError(
+ f'{self.__class__.__name__} has `test_mode==False` '
+ 'while "headbox_file" is only '
+ 'supported when `test_mode==True`.')
+
+ headbox_file_type = headbox_file[-3:]
+ allow_headbox_file_type = ['mat']
+ if headbox_file_type not in allow_headbox_file_type:
+ raise KeyError(
+ f'The head boxes file type {headbox_file_type} is not '
+ f'supported. Should be `mat` but got {headbox_file_type}.')
+ self.headbox_file = headbox_file
+
+ super().__init__(
+ ann_file=ann_file,
+ bbox_file=bbox_file,
+ data_mode=data_mode,
+ metainfo=metainfo,
+ data_root=data_root,
+ data_prefix=data_prefix,
+ filter_cfg=filter_cfg,
+ indices=indices,
+ serialize_data=serialize_data,
+ pipeline=pipeline,
+ test_mode=test_mode,
+ lazy_init=lazy_init,
+ max_refetch=max_refetch)
+
+ def _load_annotations(self) -> Tuple[List[dict], List[dict]]:
+ """Load data from annotations in MPII format."""
+
+ assert exists(self.ann_file), 'Annotation file does not exist'
+ with get_local_path(self.ann_file) as local_path:
+ with open(local_path) as anno_file:
+ self.anns = json.load(anno_file)
+
+ if self.headbox_file:
+ assert exists(self.headbox_file), 'Headbox file does not exist'
+ with get_local_path(self.headbox_file) as local_path:
+ self.headbox_dict = loadmat(local_path)
+ headboxes_src = np.transpose(self.headbox_dict['headboxes_src'],
+ [2, 0, 1])
+ SC_BIAS = 0.6
+
+ instance_list = []
+ image_list = []
+ used_img_ids = set()
+ ann_id = 0
+
+ # mpii bbox scales are normalized with factor 200.
+ pixel_std = 200.
+
+ for idx, ann in enumerate(self.anns):
+ center = np.array(ann['center'], dtype=np.float32)
+ scale = np.array([ann['scale'], ann['scale']],
+ dtype=np.float32) * pixel_std
+
+ # Adjust center/scale slightly to avoid cropping limbs
+ if center[0] != -1:
+ center[1] = center[1] + 15. / pixel_std * scale[1]
+
+ # MPII uses matlab format, index is 1-based,
+ # we should first convert to 0-based index
+ center = center - 1
+
+ # unify shape with coco datasets
+ center = center.reshape(1, -1)
+ scale = scale.reshape(1, -1)
+ bbox = bbox_cs2xyxy(center, scale)
+
+ # load keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ keypoints = np.array(ann['joints']).reshape(1, -1, 2)
+ keypoints_visible = np.array(ann['joints_vis']).reshape(1, -1)
+
+ instance_info = {
+ 'id': ann_id,
+ 'img_id': int(ann['image'].split('.')[0]),
+ 'img_path': osp.join(self.data_prefix['img'], ann['image']),
+ 'bbox_center': center,
+ 'bbox_scale': scale,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ }
+
+ if self.headbox_file:
+ # calculate the diagonal length of head box as norm_factor
+ headbox = headboxes_src[idx]
+ head_size = np.linalg.norm(headbox[1] - headbox[0], axis=0)
+ head_size *= SC_BIAS
+ instance_info['head_size'] = head_size.reshape(1, -1)
+
+ if instance_info['img_id'] not in used_img_ids:
+ used_img_ids.add(instance_info['img_id'])
+ image_list.append({
+ 'img_id': instance_info['img_id'],
+ 'img_path': instance_info['img_path'],
+ })
+
+ instance_list.append(instance_info)
+ ann_id = ann_id + 1
+
+ return instance_list, image_list
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/mpii_trb_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/mpii_trb_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..e684eaa152004661d839639e7d716c9c25983434
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/mpii_trb_dataset.py
@@ -0,0 +1,174 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import json
+import os.path as osp
+from typing import List, Tuple
+
+import numpy as np
+from mmengine.fileio import exists, get_local_path
+
+from mmpose.registry import DATASETS
+from mmpose.structures.bbox import bbox_cs2xyxy
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class MpiiTrbDataset(BaseCocoStyleDataset):
+ """MPII-TRB Dataset dataset for pose estimation.
+
+ "TRB: A Novel Triplet Representation for Understanding 2D Human Body",
+ ICCV'2019. More details can be found in the `paper
+ `__ .
+
+ MPII-TRB keypoints::
+
+ 0: 'left_shoulder'
+ 1: 'right_shoulder'
+ 2: 'left_elbow'
+ 3: 'right_elbow'
+ 4: 'left_wrist'
+ 5: 'right_wrist'
+ 6: 'left_hip'
+ 7: 'right_hip'
+ 8: 'left_knee'
+ 9: 'right_knee'
+ 10: 'left_ankle'
+ 11: 'right_ankle'
+ 12: 'head'
+ 13: 'neck'
+
+ 14: 'right_neck'
+ 15: 'left_neck'
+ 16: 'medial_right_shoulder'
+ 17: 'lateral_right_shoulder'
+ 18: 'medial_right_bow'
+ 19: 'lateral_right_bow'
+ 20: 'medial_right_wrist'
+ 21: 'lateral_right_wrist'
+ 22: 'medial_left_shoulder'
+ 23: 'lateral_left_shoulder'
+ 24: 'medial_left_bow'
+ 25: 'lateral_left_bow'
+ 26: 'medial_left_wrist'
+ 27: 'lateral_left_wrist'
+ 28: 'medial_right_hip'
+ 29: 'lateral_right_hip'
+ 30: 'medial_right_knee'
+ 31: 'lateral_right_knee'
+ 32: 'medial_right_ankle'
+ 33: 'lateral_right_ankle'
+ 34: 'medial_left_hip'
+ 35: 'lateral_left_hip'
+ 36: 'medial_left_knee'
+ 37: 'lateral_left_knee'
+ 38: 'medial_left_ankle'
+ 39: 'lateral_left_ankle'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/mpii_trb.py')
+
+ def _load_annotations(self) -> Tuple[List[dict], List[dict]]:
+ """Load data from annotations in MPII-TRB format."""
+
+ assert exists(self.ann_file), 'Annotation file does not exist'
+ with get_local_path(self.ann_file) as local_path:
+ with open(local_path) as anno_file:
+ self.data = json.load(anno_file)
+
+ imgid2info = {img['id']: img for img in self.data['images']}
+
+ instance_list = []
+ image_list = []
+ used_img_ids = set()
+
+ # mpii-trb bbox scales are normalized with factor 200.
+ pixel_std = 200.
+
+ for ann in self.data['annotations']:
+ img_id = ann['image_id']
+
+ # center, scale in shape [1, 2] and bbox in [1, 4]
+ center = np.array([ann['center']], dtype=np.float32)
+ scale = np.array([[ann['scale'], ann['scale']]],
+ dtype=np.float32) * pixel_std
+ bbox = bbox_cs2xyxy(center, scale)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ img_path = osp.join(self.data_prefix['img'],
+ imgid2info[img_id]['file_name'])
+
+ instance_info = {
+ 'id': ann['id'],
+ 'img_id': img_id,
+ 'img_path': img_path,
+ 'bbox_center': center,
+ 'bbox_scale': scale,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': ann['num_joints'],
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann['iscrowd'],
+ }
+
+ # val set
+ if 'headbox' in ann:
+ instance_info['headbox'] = np.array(
+ ann['headbox'], dtype=np.float32)
+
+ instance_list.append(instance_info)
+ if instance_info['img_id'] not in used_img_ids:
+ used_img_ids.add(instance_info['img_id'])
+ image_list.append({
+ 'img_id': instance_info['img_id'],
+ 'img_path': instance_info['img_path'],
+ })
+
+ instance_list = sorted(instance_list, key=lambda x: x['id'])
+ return instance_list, image_list
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/ochuman_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/ochuman_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..5403982a8e6e52a7f3cb2476183829461d8e7bc9
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/ochuman_dataset.py
@@ -0,0 +1,83 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class OCHumanDataset(BaseCocoStyleDataset):
+ """OChuman dataset for pose estimation.
+
+ "Pose2Seg: Detection Free Human Instance Segmentation", CVPR'2019.
+ More details can be found in the `paper
+ `__ .
+
+ "Occluded Human (OCHuman)" dataset contains 8110 heavily occluded
+ human instances within 4731 images. OCHuman dataset is designed for
+ validation and testing. To evaluate on OCHuman, the model should be
+ trained on COCO training set, and then test the robustness of the
+ model to occlusion using OCHuman.
+
+ OCHuman keypoints (same as COCO)::
+
+ 0: 'nose',
+ 1: 'left_eye',
+ 2: 'right_eye',
+ 3: 'left_ear',
+ 4: 'right_ear',
+ 5: 'left_shoulder',
+ 6: 'right_shoulder',
+ 7: 'left_elbow',
+ 8: 'right_elbow',
+ 9: 'left_wrist',
+ 10: 'right_wrist',
+ 11: 'left_hip',
+ 12: 'right_hip',
+ 13: 'left_knee',
+ 14: 'right_knee',
+ 15: 'left_ankle',
+ 16: 'right_ankle'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/ochuman.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/posetrack18_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/posetrack18_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..5d0d6789530f3c17fde685e20a647d1ee9c7430d
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/posetrack18_dataset.py
@@ -0,0 +1,77 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class PoseTrack18Dataset(BaseCocoStyleDataset):
+ """PoseTrack18 dataset for pose estimation.
+
+ "Posetrack: A benchmark for human pose estimation and tracking", CVPR'2018.
+ More details can be found in the `paper
+ `__ .
+
+ PoseTrack2018 keypoints::
+
+ 0: 'nose',
+ 1: 'head_bottom',
+ 2: 'head_top',
+ 3: 'left_ear',
+ 4: 'right_ear',
+ 5: 'left_shoulder',
+ 6: 'right_shoulder',
+ 7: 'left_elbow',
+ 8: 'right_elbow',
+ 9: 'left_wrist',
+ 10: 'right_wrist',
+ 11: 'left_hip',
+ 12: 'right_hip',
+ 13: 'left_knee',
+ 14: 'right_knee',
+ 15: 'left_ankle',
+ 16: 'right_ankle'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/posetrack18.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/posetrack18_video_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/posetrack18_video_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..730def3c1c81386d0dfecf08144b2f53302e2478
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body/posetrack18_video_dataset.py
@@ -0,0 +1,394 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+from typing import Callable, List, Optional, Sequence, Union
+
+import numpy as np
+from mmengine.fileio import exists, get_local_path, load
+from mmengine.utils import is_list_of
+from xtcocotools.coco import COCO
+
+from mmpose.registry import DATASETS
+from mmpose.structures.bbox import bbox_xywh2xyxy
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class PoseTrack18VideoDataset(BaseCocoStyleDataset):
+ """PoseTrack18 dataset for video pose estimation.
+
+ "Posetrack: A benchmark for human pose estimation and tracking", CVPR'2018.
+ More details can be found in the `paper
+ `__ .
+
+ PoseTrack2018 keypoints::
+
+ 0: 'nose',
+ 1: 'head_bottom',
+ 2: 'head_top',
+ 3: 'left_ear',
+ 4: 'right_ear',
+ 5: 'left_shoulder',
+ 6: 'right_shoulder',
+ 7: 'left_elbow',
+ 8: 'right_elbow',
+ 9: 'left_wrist',
+ 10: 'right_wrist',
+ 11: 'left_hip',
+ 12: 'right_hip',
+ 13: 'left_knee',
+ 14: 'right_knee',
+ 15: 'left_ankle',
+ 16: 'right_ankle'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ frame_weights (List[Union[int, float]] ): The weight of each frame
+ for aggregation. The first weight is for the center frame, then on
+ ascending order of frame indices. Note that the length of
+ ``frame_weights`` should be consistent with the number of sampled
+ frames. Default: [0.0, 1.0]
+ frame_sampler_mode (str): Specifies the mode of frame sampler:
+ ``'fixed'`` or ``'random'``. In ``'fixed'`` mode, each frame
+ index relative to the center frame is fixed, specified by
+ ``frame_indices``, while in ``'random'`` mode, each frame index
+ relative to the center frame is sampled from ``frame_range``
+ with certain randomness. Default: ``'random'``.
+ frame_range (int | List[int], optional): The sampling range of
+ supporting frames in the same video for center frame.
+ Only valid when ``frame_sampler_mode`` is ``'random'``.
+ Default: ``None``.
+ num_sampled_frame(int, optional): The number of sampled frames, except
+ the center frame. Only valid when ``frame_sampler_mode`` is
+ ``'random'``. Default: 1.
+ frame_indices (Sequence[int], optional): The sampled frame indices,
+ including the center frame indicated by 0. Only valid when
+ ``frame_sampler_mode`` is ``'fixed'``. Default: ``None``.
+ ph_fill_len (int): The length of the placeholder to fill in the
+ image filenames. Default: 6
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img='')``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/posetrack18.py')
+
+ def __init__(self,
+ ann_file: str = '',
+ bbox_file: Optional[str] = None,
+ data_mode: str = 'topdown',
+ frame_weights: List[Union[int, float]] = [0.0, 1.0],
+ frame_sampler_mode: str = 'random',
+ frame_range: Optional[Union[int, List[int]]] = None,
+ num_sampled_frame: Optional[int] = None,
+ frame_indices: Optional[Sequence[int]] = None,
+ ph_fill_len: int = 6,
+ metainfo: Optional[dict] = None,
+ data_root: Optional[str] = None,
+ data_prefix: dict = dict(img=''),
+ filter_cfg: Optional[dict] = None,
+ indices: Optional[Union[int, Sequence[int]]] = None,
+ serialize_data: bool = True,
+ pipeline: List[Union[dict, Callable]] = [],
+ test_mode: bool = False,
+ lazy_init: bool = False,
+ max_refetch: int = 1000):
+ assert sum(frame_weights) == 1, 'Invalid `frame_weights`: should sum'\
+ f' to 1.0, but got {frame_weights}.'
+ for weight in frame_weights:
+ assert weight >= 0, 'frame_weight can not be a negative value.'
+ self.frame_weights = np.array(frame_weights)
+
+ if frame_sampler_mode not in {'fixed', 'random'}:
+ raise ValueError(
+ f'{self.__class__.__name__} got invalid frame_sampler_mode: '
+ f'{frame_sampler_mode}. Should be `"fixed"` or `"random"`.')
+ self.frame_sampler_mode = frame_sampler_mode
+
+ if frame_sampler_mode == 'random':
+ assert frame_range is not None, \
+ '`frame_sampler_mode` is set as `random`, ' \
+ 'please specify the `frame_range`.'
+
+ if isinstance(frame_range, int):
+ assert frame_range >= 0, \
+ 'frame_range can not be a negative value.'
+ self.frame_range = [-frame_range, frame_range]
+
+ elif isinstance(frame_range, Sequence):
+ assert len(frame_range) == 2, 'The length must be 2.'
+ assert frame_range[0] <= 0 and frame_range[
+ 1] >= 0 and frame_range[1] > frame_range[
+ 0], 'Invalid `frame_range`'
+ for i in frame_range:
+ assert isinstance(i, int), 'Each element must be int.'
+ self.frame_range = frame_range
+ else:
+ raise TypeError(
+ f'The type of `frame_range` must be int or Sequence, '
+ f'but got {type(frame_range)}.')
+
+ assert num_sampled_frame is not None, \
+ '`frame_sampler_mode` is set as `random`, please specify ' \
+ '`num_sampled_frame`, e.g. the number of sampled frames.'
+
+ assert len(frame_weights) == num_sampled_frame + 1, \
+ f'the length of frame_weights({len(frame_weights)}) '\
+ f'does not match the number of sampled adjacent '\
+ f'frames({num_sampled_frame})'
+ self.frame_indices = None
+ self.num_sampled_frame = num_sampled_frame
+
+ if frame_sampler_mode == 'fixed':
+ assert frame_indices is not None, \
+ '`frame_sampler_mode` is set as `fixed`, ' \
+ 'please specify the `frame_indices`.'
+ assert len(frame_weights) == len(frame_indices), \
+ f'the length of frame_weights({len(frame_weights)}) does not '\
+ f'match the length of frame_indices({len(frame_indices)}).'
+ frame_indices.sort()
+ self.frame_indices = frame_indices
+ self.frame_range = None
+ self.num_sampled_frame = None
+
+ self.ph_fill_len = ph_fill_len
+
+ super().__init__(
+ ann_file=ann_file,
+ bbox_file=bbox_file,
+ data_mode=data_mode,
+ metainfo=metainfo,
+ data_root=data_root,
+ data_prefix=data_prefix,
+ filter_cfg=filter_cfg,
+ indices=indices,
+ serialize_data=serialize_data,
+ pipeline=pipeline,
+ test_mode=test_mode,
+ lazy_init=lazy_init,
+ max_refetch=max_refetch)
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ # filter invalid instance
+ if 'bbox' not in ann or 'keypoints' not in ann or max(
+ ann['keypoints']) == 0:
+ return None
+
+ img_w, img_h = img['width'], img['height']
+ # get the bbox of the center frame
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # get the keypoints of the center frame
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ # deal with multiple image paths
+ img_paths: list = []
+ # get the image path of the center frame
+ center_img_path = osp.join(self.data_prefix['img'], img['file_name'])
+ # append the center image path first
+ img_paths.append(center_img_path)
+
+ # select the frame indices
+ if self.frame_sampler_mode == 'fixed':
+ indices = self.frame_indices
+ else: # self.frame_sampler_mode == 'random':
+ low, high = self.frame_range
+ indices = np.random.randint(low, high + 1, self.num_sampled_frame)
+
+ nframes = int(img['nframes'])
+ file_name = img['file_name']
+ ref_idx = int(osp.splitext(osp.basename(file_name))[0])
+
+ for idx in indices:
+ if self.test_mode and idx == 0:
+ continue
+ # the supporting frame index
+ support_idx = ref_idx + idx
+ # clip the frame index to make sure that it does not exceed
+ # the boundings of frame indices
+ support_idx = np.clip(support_idx, 0, nframes - 1)
+ sup_img_path = osp.join(
+ osp.dirname(center_img_path),
+ str(support_idx).zfill(self.ph_fill_len) + '.jpg')
+
+ img_paths.append(sup_img_path)
+
+ data_info = {
+ 'img_id': int(img['frame_id']),
+ 'img_path': img_paths,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': ann['num_keypoints'],
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'frame_weights': self.frame_weights,
+ 'id': ann['id'],
+ }
+
+ return data_info
+
+ def _load_detection_results(self) -> List[dict]:
+ """Load data from detection results with dummy keypoint annotations."""
+ assert exists(self.ann_file), 'Annotation file does not exist'
+ assert exists(self.bbox_file), 'Bbox file does not exist'
+
+ # load detection results
+ det_results = load(self.bbox_file)
+ assert is_list_of(det_results, dict)
+
+ # load coco annotations to build image id-to-name index
+ with get_local_path(self.ann_file) as local_path:
+ self.coco = COCO(local_path)
+
+ # mapping image name to id
+ name2id = {}
+ # mapping image id to name
+ id2name = {}
+ for img_id, image in self.coco.imgs.items():
+ file_name = image['file_name']
+ id2name[img_id] = file_name
+ name2id[file_name] = img_id
+
+ num_keypoints = self.metainfo['num_keypoints']
+ data_list = []
+ id_ = 0
+ for det in det_results:
+ # remove non-human instances
+ if det['category_id'] != 1:
+ continue
+
+ # get the predicted bbox and bbox_score
+ bbox_xywh = np.array(
+ det['bbox'][:4], dtype=np.float32).reshape(1, 4)
+ bbox = bbox_xywh2xyxy(bbox_xywh)
+ bbox_score = np.array(det['score'], dtype=np.float32).reshape(1)
+
+ # use dummy keypoint location and visibility
+ keypoints = np.zeros((1, num_keypoints, 2), dtype=np.float32)
+ keypoints_visible = np.ones((1, num_keypoints), dtype=np.float32)
+
+ # deal with different bbox file formats
+ if 'nframes' in det:
+ nframes = int(det['nframes'])
+ else:
+ if 'image_name' in det:
+ img_id = name2id[det['image_name']]
+ else:
+ img_id = det['image_id']
+ img_ann = self.coco.loadImgs(img_id)[0]
+ nframes = int(img_ann['nframes'])
+
+ # deal with multiple image paths
+ img_paths: list = []
+ if 'image_name' in det:
+ image_name = det['image_name']
+ else:
+ image_name = id2name[det['image_id']]
+ # get the image path of the center frame
+ center_img_path = osp.join(self.data_prefix['img'], image_name)
+ # append the center image path first
+ img_paths.append(center_img_path)
+
+ # "images/val/012834_mpii_test/000000.jpg" -->> "000000.jpg"
+ center_image_name = image_name.split('/')[-1]
+ ref_idx = int(center_image_name.replace('.jpg', ''))
+
+ # select the frame indices
+ if self.frame_sampler_mode == 'fixed':
+ indices = self.frame_indices
+ else: # self.frame_sampler_mode == 'random':
+ low, high = self.frame_range
+ indices = np.random.randint(low, high + 1,
+ self.num_sampled_frame)
+
+ for idx in indices:
+ if self.test_mode and idx == 0:
+ continue
+ # the supporting frame index
+ support_idx = ref_idx + idx
+ # clip the frame index to make sure that it does not exceed
+ # the boundings of frame indices
+ support_idx = np.clip(support_idx, 0, nframes - 1)
+ sup_img_path = center_img_path.replace(
+ center_image_name,
+ str(support_idx).zfill(self.ph_fill_len) + '.jpg')
+
+ img_paths.append(sup_img_path)
+
+ data_list.append({
+ 'img_id': det['image_id'],
+ 'img_path': img_paths,
+ 'frame_weights': self.frame_weights,
+ 'bbox': bbox,
+ 'bbox_score': bbox_score,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'id': id_,
+ })
+
+ id_ += 1
+
+ return data_list
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..0b3df0760c3c652fb75b4800e903a304c33390b3
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__init__.py
@@ -0,0 +1,14 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .h36m_dataset import Human36mDataset
+from .goliath3d_dataset import Goliath3dDataset
+from .aic2goliath3d_dataset import Aic2Goliath3dDataset
+from .coco_wholebody2goliath3d_dataset import CocoWholeBody2Goliath3dDataset
+from .crowdpose2goliath3d_dataset import Crowdpose2Goliath3dDataset
+from .mpii2goliath3d_dataset import Mpii2Goliath3dDataset
+
+__all__ = ['Human36mDataset', 'Goliath3dDataset', 'Aic2Goliath3dDataset', 'CocoWholeBody2Goliath3dDataset', 'Crowdpose2Goliath3dDataset', 'Mpii2Goliath3dDataset']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f1cf0803154e5f67c59bfb02de5e8391e6e1f82f
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/aic2goliath3d_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/aic2goliath3d_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4af7b1b2dccf1c4f70c2148ce0ced64c81711092
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/aic2goliath3d_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/coco_wholebody2goliath3d_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/coco_wholebody2goliath3d_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e556fbcf9aaf6fdfe5c549eafb20eb2a8c738a1b
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/coco_wholebody2goliath3d_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/crowdpose2goliath3d_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/crowdpose2goliath3d_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..27c9d01c0278be4a7bad4be5bb9652fa38f09f58
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/crowdpose2goliath3d_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/goliath3d_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/goliath3d_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..251abb0735ce376a969a793b8487319b46a3f5b5
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/goliath3d_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/h36m_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/h36m_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..82ae2864db787f94234e4568eac217424538967f
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/h36m_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/mpii2goliath3d_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/mpii2goliath3d_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..78f79170bb504d9dadf849564f2b5095172ed15a
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/__pycache__/mpii2goliath3d_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/aic2goliath3d_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/aic2goliath3d_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..953b860d9aa4a6ec7124f948afecf806728dac5e
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/aic2goliath3d_dataset.py
@@ -0,0 +1,113 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
+import numpy as np
+import copy
+import os
+import sys
+
+##-----------------------------------------------------------------------------------------------------------
+try:
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../..')) \
+ if os.path.join(os.path.dirname(__file__), '../../../..') not in sys.path else None
+
+ from configs._base_.datasets.aic import dataset_info as source_dataset_info
+ from configs._base_.datasets.goliath3d import dataset_info as target_dataset_info
+
+ SOURCE_KEYPOINT_ORDER = [v['name'] for k, v in sorted(source_dataset_info['keypoint_info'].items())]
+ TARGET_KEYPOINT_ORDER = [v['name'] for k, v in sorted(target_dataset_info['keypoint_info'].items())]
+
+ SOURCE_TO_TARGET_INDICES = {joint_index: None for joint_index in range(len(SOURCE_KEYPOINT_ORDER))}
+ for joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ if SOURCE_KEYPOINT_ORDER[joint_index] in TARGET_KEYPOINT_ORDER:
+ SOURCE_TO_TARGET_INDICES[joint_index] = TARGET_KEYPOINT_ORDER.index(SOURCE_KEYPOINT_ORDER[joint_index])
+except Exception as e:
+ pass
+
+##-----------------------------------------------------------------------------------------------------------
+
+@DATASETS.register_module()
+class Aic2Goliath3dDataset(BaseCocoStyleDataset):
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/aic2goliath3d.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict | None: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ # filter invalid instance
+ if 'bbox' not in ann or 'keypoints' not in ann:
+ return None
+
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ raw_keypoints = keypoints.copy()
+ raw_keypoints_visible = keypoints_visible.copy()
+
+ keypoints = np.zeros((1, len(TARGET_KEYPOINT_ORDER), 2), dtype=np.float32)
+ keypoints_visible = np.zeros((1, len(TARGET_KEYPOINT_ORDER)), dtype=np.float32)
+
+ for source_joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ target_joint_index = SOURCE_TO_TARGET_INDICES[source_joint_index]
+
+ if target_joint_index is not None:
+ keypoints[0, target_joint_index, :2] = raw_keypoints[0, source_joint_index, :2]
+ keypoints_visible[0, target_joint_index] = raw_keypoints_visible[0, source_joint_index]
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img['img_path'],
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann.get('iscrowd', 0),
+ 'segmentation': ann.get('segmentation', None),
+ 'id': ann['id'],
+ 'category_id': ann['category_id'],
+ # store the raw annotation of the instance
+ # it is useful for evaluation without providing ann_file
+ 'raw_ann_info': copy.deepcopy(ann),
+ }
+
+ if 'crowdIndex' in img:
+ data_info['crowd_index'] = img['crowdIndex']
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/coco_wholebody2goliath3d_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/coco_wholebody2goliath3d_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..0ee049624c8464ab58c2029f70155893645e8126
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/coco_wholebody2goliath3d_dataset.py
@@ -0,0 +1,106 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+import os.path as osp
+from typing import Optional
+
+import numpy as np
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+##-----------------------------------------------------------------------------------------------------------
+try:
+ from configs._base_.datasets.coco_wholebody import dataset_info as source_dataset_info
+ from configs._base_.datasets.goliath3d import dataset_info as target_dataset_info
+
+ SOURCE_KEYPOINT_ORDER = [v['name'] for k, v in sorted(source_dataset_info['keypoint_info'].items())]
+ TARGET_KEYPOINT_ORDER = [v['name'] for k, v in sorted(target_dataset_info['keypoint_info'].items())]
+
+ SOURCE_TO_TARGET_INDICES = {joint_index: None for joint_index in range(len(SOURCE_KEYPOINT_ORDER))}
+ for joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ if SOURCE_KEYPOINT_ORDER[joint_index] in TARGET_KEYPOINT_ORDER:
+ SOURCE_TO_TARGET_INDICES[joint_index] = TARGET_KEYPOINT_ORDER.index(SOURCE_KEYPOINT_ORDER[joint_index])
+except Exception as e:
+ pass
+
+##-----------------------------------------------------------------------------------------------------------
+@DATASETS.register_module()
+class CocoWholeBody2Goliath3dDataset(BaseCocoStyleDataset):
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/coco_wholebody2goliath3d.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ img_path = osp.join(self.data_prefix['img'], img['file_name'])
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ # COCO-Wholebody: consisting of body, foot, face and hand keypoints
+ _keypoints = np.array(ann['keypoints'] + ann['foot_kpts'] +
+ ann['face_kpts'] + ann['lefthand_kpts'] +
+ ann['righthand_kpts']).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2] > 0)
+
+ raw_keypoints = keypoints.copy()
+ raw_keypoints_visible = keypoints_visible.copy()
+
+ keypoints = np.zeros((1, len(TARGET_KEYPOINT_ORDER), 2), dtype=np.float32)
+ keypoints_visible = np.zeros((1, len(TARGET_KEYPOINT_ORDER)), dtype=np.float32)
+
+ for source_joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ target_joint_index = SOURCE_TO_TARGET_INDICES[source_joint_index]
+
+ if target_joint_index is not None:
+ keypoints[0, target_joint_index, :2] = raw_keypoints[0, source_joint_index, :2]
+ keypoints_visible[0, target_joint_index] = raw_keypoints_visible[0, source_joint_index]
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img_path,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann['iscrowd'],
+ 'segmentation': ann['segmentation'],
+ 'id': ann['id'],
+ 'category_id': ann['category_id'],
+ # store the raw annotation of the instance
+ # it is useful for evaluation without providing ann_file
+ 'raw_ann_info': copy.deepcopy(ann),
+ }
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/crowdpose2goliath3d_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/crowdpose2goliath3d_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..a47ace926806de0a62dd1df837aa898a1acc0f7b
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/crowdpose2goliath3d_dataset.py
@@ -0,0 +1,115 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
+import numpy as np
+import copy
+import os
+import sys
+
+##-----------------------------------------------------------------------------------------------------------
+try:
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../..')) \
+ if os.path.join(os.path.dirname(__file__), '../../../..') not in sys.path else None
+
+ from configs._base_.datasets.crowdpose import dataset_info as source_dataset_info
+ from configs._base_.datasets.goliath3d import dataset_info as target_dataset_info
+
+ SOURCE_KEYPOINT_ORDER = [v['name'] for k, v in sorted(source_dataset_info['keypoint_info'].items())]
+ TARGET_KEYPOINT_ORDER = [v['name'] for k, v in sorted(target_dataset_info['keypoint_info'].items())]
+
+ SOURCE_TO_TARGET_INDICES = {joint_index: None for joint_index in range(len(SOURCE_KEYPOINT_ORDER))}
+ for joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ if SOURCE_KEYPOINT_ORDER[joint_index] in TARGET_KEYPOINT_ORDER:
+ SOURCE_TO_TARGET_INDICES[joint_index] = TARGET_KEYPOINT_ORDER.index(SOURCE_KEYPOINT_ORDER[joint_index])
+except Exception as e:
+ pass
+
+##-----------------------------------------------------------------------------------------------------------
+@DATASETS.register_module()
+class Crowdpose2Goliath3dDataset(BaseCocoStyleDataset):
+ """
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/crowdpose2goliath3d.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict | None: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ # filter invalid instance
+ if 'bbox' not in ann or 'keypoints' not in ann:
+ return None
+
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ raw_keypoints = keypoints.copy()
+ raw_keypoints_visible = keypoints_visible.copy()
+
+ keypoints = np.zeros((1, len(TARGET_KEYPOINT_ORDER), 2), dtype=np.float32)
+ keypoints_visible = np.zeros((1, len(TARGET_KEYPOINT_ORDER)), dtype=np.float32)
+
+ for source_joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ target_joint_index = SOURCE_TO_TARGET_INDICES[source_joint_index]
+
+ if target_joint_index is not None:
+ keypoints[0, target_joint_index, :2] = raw_keypoints[0, source_joint_index, :2]
+ keypoints_visible[0, target_joint_index] = raw_keypoints_visible[0, source_joint_index]
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img['img_path'],
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann.get('iscrowd', 0),
+ 'segmentation': ann.get('segmentation', None),
+ 'id': ann['id'],
+ 'category_id': ann['category_id'],
+ # store the raw annotation of the instance
+ # it is useful for evaluation without providing ann_file
+ 'raw_ann_info': copy.deepcopy(ann),
+ }
+
+ if 'crowdIndex' in img:
+ data_info['crowd_index'] = img['crowdIndex']
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/goliath3d_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/goliath3d_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..d372d16487dd157f0d1647d8e4b1cfcb237bb67d
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/goliath3d_dataset.py
@@ -0,0 +1,319 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import warnings
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+import torch
+import torch.utils.data
+import torch.multiprocessing as mp
+import numpy as np
+import os
+import cv2
+import pickle
+from PIL import ImageDraw
+from tqdm import tqdm
+import io
+import json
+import copy
+import pandas as pd
+from PIL import Image
+from concurrent.futures import ThreadPoolExecutor
+import random
+from matplotlib import pyplot as plt
+
+import copy
+import os.path as osp
+from copy import deepcopy
+from itertools import filterfalse, groupby
+from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
+
+from mmengine.dataset import BaseDataset, force_full_init
+from mmengine.fileio import exists, get_local_path, load
+from mmengine.utils import is_list_of
+from xtcocotools.coco import COCO
+
+from mmpose.registry import DATASETS
+from mmpose.structures.bbox import bbox_xywh2xyxy
+from ..utils import parse_pose_metainfo
+
+from contextlib import redirect_stderr
+
+with open(os.devnull, 'w') as f, redirect_stderr(f):
+ try:
+ from care.data.io import typed
+ from care.strict.data.io.typed.file.calib import load_krt
+ except Exception:
+ # If the import fails, you can handle it here without printing any errors.
+ pass
+
+@DATASETS.register_module()
+class Goliath3dDataset(BaseCocoStyleDataset):
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/goliath3d.py')
+
+ def __init__(self,
+ ann_file: str = '',
+ bbox_file: Optional[str] = None,
+ data_mode: str = 'topdown',
+ metainfo: Optional[dict] = None,
+ data_root: Optional[str] = None,
+ data_root_3d: Optional[str] = None,
+ data_prefix: dict = dict(img=''),
+ filter_cfg: Optional[dict] = None,
+ indices: Optional[Union[int, Sequence[int]]] = None,
+ serialize_data: bool = True,
+ pipeline: List[Union[dict, Callable]] = [],
+ test_mode: bool = False,
+ lazy_init: bool = False,
+ max_refetch: int = 1000):
+
+ self.pose3d_data_root = os.path.join(data_root_3d, '3D')
+ self.camera_data_root = os.path.join(data_root_3d, 'KRTs')
+
+ super().__init__(
+ ann_file=ann_file,
+ bbox_file=bbox_file,
+ data_mode=data_mode,
+ metainfo=metainfo,
+ data_root=data_root,
+ data_prefix=data_prefix,
+ filter_cfg=filter_cfg,
+ indices=indices,
+ serialize_data=serialize_data,
+ pipeline=pipeline,
+ test_mode=test_mode,
+ lazy_init=lazy_init,
+ max_refetch=max_refetch)
+
+ self.original_idxs = np.array(self.metainfo['idx_to_original_idx_mapping'].values()) ## indices into the original 344 keypoints
+ self.max_num_keypoints = 344
+
+ return
+
+ def load_data_list(self) -> List[dict]:
+ """Load data list from 344 body points."""
+
+ self._register_airstore_handler()
+
+ with open(self.ann_file, "rb") as f:
+ raw = f.read()
+ raw_data = json.loads(raw) # samples=5,267,269
+
+ data_list = []
+ for sample in raw_data:
+ dp = { "airstore_id": sample["sample_id"],
+ "session_id": str(sample["session_id"]),
+ "camera_id": str(sample["camera_id"]),
+ "frame_id": str(sample["frame_number"]),
+ }
+ if sample.get("box-default") is not None:
+ dp["box"] = sample["box-default"]
+ data_list.append(dp)
+
+ print('\033[92msorting by session, camera and frame numbers\033[0m')
+
+ # Sort the data_list by session_id, then by camera_id, and finally by frame_number
+ data_list = sorted(data_list, key=lambda y: (y['session_id'], y['camera_id'], y['frame_id']))
+
+ print('\033[92mDone! Loaded total samples: {}\033[0m'.format(len(data_list)))
+
+ return data_list
+
+ def _register_airstore_handler(self) -> None:
+ from care.strict.data.io.file_system.airstore_client import register_airstore_in_fsspec
+ register_airstore_in_fsspec()
+ self.path_template = "airstoreds://rlr_detection_services_ml_datasets_no_user_data"
+ self.airstore = True
+
+ def _read_from_airstore(self, asset: str, sid: str) -> io.BytesIO:
+ with typed.open(self.path_template + f"/{asset}?sampleId={sid}").open() as f:
+ data = io.BytesIO(f.read())
+ return data
+
+ def get_data_info(self, idx):
+ if self.serialize_data:
+ start_addr = 0 if idx == 0 else self.data_address[idx - 1].item()
+ end_addr = self.data_address[idx].item()
+ bytes = memoryview(
+ self.data_bytes[start_addr:end_addr]) # type: ignore
+ data_info = pickle.loads(bytes) # type: ignore
+ else:
+ data_info = copy.deepcopy(self.data_list[idx])
+
+ ##---------read 3d pose---------------
+ pose3d_file_path = os.path.join(self.pose3d_data_root, '{}_{}.txt'.format(data_info['session_id'], data_info['frame_id']))
+ session_camera_file = os.path.join(self.camera_data_root, '{}.krt'.format(data_info['session_id']))
+
+ if not exists(pose3d_file_path) or not exists(session_camera_file):
+ return None
+
+ pose3d = np.zeros((self.max_num_keypoints, 4), dtype=np.float32)
+ df = pd.read_csv(pose3d_file_path, delimiter=' ', header=None, names=['point_id', 'x', 'y', 'z', 'sum_conf', 'num_inlier'])
+ df = df[(df['point_id'] >= 0) & (df['point_id'] < self.max_num_keypoints)]
+ pose3d[df['point_id'].values.astype(int), :3] = df[['x', 'y', 'z']].values
+ pose3d[df['point_id'].values.astype(int), 3] = 1 # Set visibility to 1. N x 4
+
+ try:
+ session_krt = load_krt(session_camera_file)
+ camera_krt = session_krt[data_info['camera_id']]
+ extrinsics = camera_krt['extrin'] ## 3 x 4
+ K = camera_krt['intrin'] ## 3 x 3
+ except:
+ return None
+
+ extrinsics_4x4 = np.concatenate((extrinsics, np.array([[0, 0, 0, 1]])), axis=0) # 4 x 4, extrinsics
+ pose3d_homogeneous = np.hstack((pose3d[:, :3], np.ones((pose3d.shape[0], 1), dtype=np.float32)))
+ pose3d_cam_homogeneous = pose3d_homogeneous @ extrinsics_4x4.T # N x 4
+ pose3d_cam = np.hstack((pose3d_cam_homogeneous[:, :3], pose3d[:, 3:4])) # N x 4
+ pose3d_cam[pose3d[:, 3] == 0, :] = 0
+
+ ## project 3d pose to image plane
+ pose2d_homogeneous = pose3d_cam[:, :3] @ K.T
+ valid_rows = pose2d_homogeneous[:, 2] != 0
+ pose2d = np.zeros((pose3d_cam.shape[0], 4), dtype=np.float32)
+ pose2d[valid_rows, :2] = pose2d_homogeneous[valid_rows, :2] / pose2d_homogeneous[valid_rows, 2:3]
+ pose2d[valid_rows, 2] = pose3d_cam[valid_rows, 2] ## depth
+ pose2d[valid_rows, 3] = 1 ## 344 x 4: x, y, z, visibility
+ pose2d = pose2d.reshape(1, -1, 4) # 1 x N x 4
+
+ keypoints_depth = pose2d[:, :, 2:3] / 1000.0 # 1 x N x 1, millimetre to metre
+
+ ##------------read image-------------------
+ try:
+ img = Image.open(self._read_from_airstore("image", data_info['airstore_id'])) ## pillow image
+ except:
+ return None
+
+ img = np.array(img) ## RGB image
+ img = img[:, :, ::-1] # Convert RGB to BGR, the model preprocessor will convert this to rgb again
+
+ img_w, img_h = img.shape[1], img.shape[0]
+
+ # process keypoints
+ try:
+ keypoints_np = np.load(self._read_from_airstore("keypoint", data_info['airstore_id'])) # shape 3 x 344
+ except:
+ return None
+
+ keypoints = keypoints_np[:2].T.reshape(1, -1, 2) # shape 1 x 344 x 2
+ keypoints_visible = np.where(keypoints_np[2].T > 0, 1, 0).reshape(1, -1) # shape 1 x 344
+
+ # Identify keypoints that are out of bounds for x (width) and y (height)
+ out_of_bounds_w = np.logical_or(keypoints[0, :, 0] <= 0, keypoints[0, :, 0] >= img_w)
+ out_of_bounds_h = np.logical_or(keypoints[0, :, 1] <= 0, keypoints[0, :, 1] >= img_h)
+
+ # Update keypoints_visible based on the out-of-bounds keypoints
+ keypoints_visible[0, out_of_bounds_w | out_of_bounds_h] = 0
+
+ ## remove keypoints from the original set to reduced set
+ if self.original_idxs is not None:
+ keypoints = keypoints[:, self.original_idxs, :] # 1 x N x 2
+ keypoints_visible = keypoints_visible[:, self.original_idxs] # 1 x N
+ pose2d = pose2d[:, self.original_idxs, :] # 1 x N x 4
+ keypoints_depth = keypoints_depth[:, self.original_idxs, :] # 1 x N
+ pose3d_cam = pose3d_cam[self.original_idxs, :] # N x 4
+
+ # ## draw the pose2d on the image
+ # import ipdb; ipdb.set_trace()
+ # img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # convert bgr to rgb image
+ # img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) # convert rgb to bgr image
+
+ # img2 = img.copy()
+
+ # for i in range(pose2d.shape[1]):
+ # if keypoints_visible[0, i] == 1:
+ # print('kps_id:{}, u:{}, v:{}, X:{}, Y:{}, Z:{}'.format(i, pose2d[0][i][0], pose2d[0][i][1], pose3d_cam[i][0], pose3d_cam[i][1], pose3d_cam[i][2]))
+ # cv2.circle(img, (int(pose2d[0][i][0]), int(pose2d[0][i][1])), 8, color=(0, 255, 0), thickness=-1)
+ # cv2.imwrite('temp.jpg', img)
+
+ # Z = keypoints_depth[0, :, 0] ## 308
+ # fx, fy = K[0, 0], K[1, 1]
+ # cx, cy = K[0, 2], K[1, 2]
+
+ # X = (keypoints[0, :, 0] - cx) * Z / fx
+ # Y = (keypoints[0, :, 1] - cy) * Z / fy
+
+ # # Stack X, Y, Z to create pose3d
+ # pose3d_new = np.stack([X, Y, Z], axis=-1) # N x 3
+ # pose2d_new = pose3d_new @ K.T ## project 3d keypoints to 2D
+ # pose2d_new = pose2d_new[:, :2] / (pose2d_new[:, 2:] + 1e-8)
+
+ # print()
+ # for i in range(pose2d_new.shape[0]):
+ # if keypoints_visible[0, i] == 1:
+ # print('kps_id:{}, u:{}, v:{}, X:{}, Y:{}, Z:{}'.format(i, pose2d_new[i][0], pose2d_new[i][1], pose3d_new[i, 0], pose3d_new[i, 1], pose3d_new[i, 2]))
+ # cv2.circle(img2, (int(pose2d_new[i][0]), int(pose2d_new[i][1])), 8, color=(0, 255, 0), thickness=-1)
+
+ # cv2.imwrite('temp_new.jpg', img2)
+ # import ipdb; ipdb.set_trace()
+
+ # Default bounding box to the full image size
+ bbox = np.array([0, 0, img_w, img_h], dtype=np.float32).reshape(1, 4)
+
+ if np.any(keypoints_visible): # If any keypoints are visible
+ visible_keypoints = keypoints[0][keypoints_visible[0] == 1] # Filter out the invisible keypoints
+
+ # Get the bounding box encompassing the keypoints
+ x_min, y_min = np.clip(np.min(visible_keypoints, axis=0), [0, 0], [img_w, img_h])
+ x_max, y_max = np.clip(np.max(visible_keypoints, axis=0), [0, 0], [img_w, img_h])
+
+ bbox = np.array([x_min, y_min, x_max, y_max], dtype=np.float32).reshape(1, 4)
+
+ num_keypoints = np.count_nonzero(keypoints_visible)
+
+ ## atleast 8 vis keypoints
+ if num_keypoints < self.metainfo['min_visible_keypoints']:
+ random_idx = np.random.randint(0, len(self.data_list))
+ return self.get_data_info(random_idx)
+
+ ## ignore greyscale images for training
+ B, G, R = cv2.split(img)
+ if np.array_equal(B, G) and np.array_equal(B, R):
+ random_idx = np.random.randint(0, len(self.data_list))
+ return self.get_data_info(random_idx)
+
+ data_info = {
+ 'img': img,
+ 'img_id': '',
+ 'img_path': '',
+ 'session_id': data_info['session_id'],
+ 'camera_id': data_info['camera_id'],
+ 'frame_id': data_info['frame_id'],
+ 'airstore_id': data_info['airstore_id'],
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'keypoints_depth': keypoints_depth,
+ 'K': K, # 3 x 3
+ 'iscrowd': 0,
+ 'segmentation': None,
+ 'id': idx,
+ 'category_id': 1,
+ }
+
+ # Some codebase needs `sample_idx` of data information. Here we convert
+ # the idx to a positive number and save it in data information.
+ if idx >= 0:
+ data_info['sample_idx'] = idx
+ else:
+ data_info['sample_idx'] = len(self) + idx
+
+ # Add metainfo items that are required in the pipeline and the model
+ metainfo_keys = [
+ 'upper_body_ids', 'lower_body_ids', 'flip_pairs',
+ 'dataset_keypoint_weights', 'flip_indices', 'skeleton_links'
+ ]
+
+ for key in metainfo_keys:
+ assert key not in data_info, (
+ f'"{key}" is a reserved key for `metainfo`, but already '
+ 'exists in the `data_info`.')
+
+ data_info[key] = deepcopy(self._metainfo[key])
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/h36m_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/h36m_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..a67fa9d326f89946b3efa4c0bf0c75452bdf8573
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/h36m_dataset.py
@@ -0,0 +1,264 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+from collections import defaultdict
+from typing import Callable, List, Optional, Sequence, Tuple, Union
+
+import numpy as np
+from mmengine.fileio import exists, get_local_path
+from mmengine.utils import is_abs
+
+from mmpose.datasets.datasets import BaseMocapDataset
+from mmpose.registry import DATASETS
+
+
+@DATASETS.register_module()
+class Human36mDataset(BaseMocapDataset):
+ """Human3.6M dataset for 3D human pose estimation.
+
+ "Human3.6M: Large Scale Datasets and Predictive Methods for 3D Human
+ Sensing in Natural Environments", TPAMI`2014.
+ More details can be found in the `paper
+ `__.
+
+ Human3.6M keypoint indexes::
+
+ 0: 'root (pelvis)',
+ 1: 'right_hip',
+ 2: 'right_knee',
+ 3: 'right_foot',
+ 4: 'left_hip',
+ 5: 'left_knee',
+ 6: 'left_foot',
+ 7: 'spine',
+ 8: 'thorax',
+ 9: 'neck_base',
+ 10: 'head',
+ 11: 'left_shoulder',
+ 12: 'left_elbow',
+ 13: 'left_wrist',
+ 14: 'right_shoulder',
+ 15: 'right_elbow',
+ 16: 'right_wrist'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ seq_len (int): Number of frames in a sequence. Default: 1.
+ seq_step (int): The interval for extracting frames from the video.
+ Default: 1.
+ pad_video_seq (bool): Whether to pad the video so that poses will be
+ predicted for every frame in the video. Default: ``False``.
+ causal (bool): If set to ``True``, the rightmost input frame will be
+ the target frame. Otherwise, the middle input frame will be the
+ target frame. Default: ``True``.
+ subset_frac (float): The fraction to reduce dataset size. If set to 1,
+ the dataset size is not reduced. Default: 1.
+ keypoint_2d_src (str): Specifies 2D keypoint information options, which
+ should be one of the following options:
+
+ - ``'gt'``: load from the annotation file
+ - ``'detection'``: load from a detection
+ result file of 2D keypoint
+ - 'pipeline': the information will be generated by the pipeline
+
+ Default: ``'gt'``.
+ keypoint_2d_det_file (str, optional): The 2D keypoint detection file.
+ If set, 2d keypoint loaded from this file will be used instead of
+ ground-truth keypoints. This setting is only when
+ ``keypoint_2d_src`` is ``'detection'``. Default: ``None``.
+ camera_param_file (str): Cameras' parameters file. Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data.
+ Default: ``dict(img='')``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/h36m.py')
+ SUPPORTED_keypoint_2d_src = {'gt', 'detection', 'pipeline'}
+
+ def __init__(self,
+ ann_file: str = '',
+ seq_len: int = 1,
+ seq_step: int = 1,
+ pad_video_seq: bool = False,
+ causal: bool = True,
+ subset_frac: float = 1.0,
+ keypoint_2d_src: str = 'gt',
+ keypoint_2d_det_file: Optional[str] = None,
+ camera_param_file: Optional[str] = None,
+ data_mode: str = 'topdown',
+ metainfo: Optional[dict] = None,
+ data_root: Optional[str] = None,
+ data_prefix: dict = dict(img=''),
+ filter_cfg: Optional[dict] = None,
+ indices: Optional[Union[int, Sequence[int]]] = None,
+ serialize_data: bool = True,
+ pipeline: List[Union[dict, Callable]] = [],
+ test_mode: bool = False,
+ lazy_init: bool = False,
+ max_refetch: int = 1000):
+ # check keypoint_2d_src
+ self.keypoint_2d_src = keypoint_2d_src
+ if self.keypoint_2d_src not in self.SUPPORTED_keypoint_2d_src:
+ raise ValueError(
+ f'Unsupported `keypoint_2d_src` "{self.keypoint_2d_src}". '
+ f'Supported options are {self.SUPPORTED_keypoint_2d_src}')
+
+ if keypoint_2d_det_file:
+ if not is_abs(keypoint_2d_det_file):
+ self.keypoint_2d_det_file = osp.join(data_root,
+ keypoint_2d_det_file)
+ else:
+ self.keypoint_2d_det_file = keypoint_2d_det_file
+
+ self.seq_step = seq_step
+ self.pad_video_seq = pad_video_seq
+
+ super().__init__(
+ ann_file=ann_file,
+ seq_len=seq_len,
+ causal=causal,
+ subset_frac=subset_frac,
+ camera_param_file=camera_param_file,
+ data_mode=data_mode,
+ metainfo=metainfo,
+ data_root=data_root,
+ data_prefix=data_prefix,
+ filter_cfg=filter_cfg,
+ indices=indices,
+ serialize_data=serialize_data,
+ pipeline=pipeline,
+ test_mode=test_mode,
+ lazy_init=lazy_init,
+ max_refetch=max_refetch)
+
+ def get_sequence_indices(self) -> List[List[int]]:
+ """Split original videos into sequences and build frame indices.
+
+ This method overrides the default one in the base class.
+ """
+ imgnames = self.ann_data['imgname']
+ video_frames = defaultdict(list)
+ for idx, imgname in enumerate(imgnames):
+ subj, action, camera = self._parse_h36m_imgname(imgname)
+ video_frames[(subj, action, camera)].append(idx)
+
+ # build sample indices
+ sequence_indices = []
+ _len = (self.seq_len - 1) * self.seq_step + 1
+ _step = self.seq_step
+ for _, _indices in sorted(video_frames.items()):
+ n_frame = len(_indices)
+
+ if self.pad_video_seq:
+ # Pad the sequence so that every frame in the sequence will be
+ # predicted.
+ if self.causal:
+ frames_left = self.seq_len - 1
+ frames_right = 0
+ else:
+ frames_left = (self.seq_len - 1) // 2
+ frames_right = frames_left
+ for i in range(n_frame):
+ pad_left = max(0, frames_left - i // _step)
+ pad_right = max(0,
+ frames_right - (n_frame - 1 - i) // _step)
+ start = max(i % _step, i - frames_left * _step)
+ end = min(n_frame - (n_frame - 1 - i) % _step,
+ i + frames_right * _step + 1)
+ sequence_indices.append([_indices[0]] * pad_left +
+ _indices[start:end:_step] +
+ [_indices[-1]] * pad_right)
+ else:
+ seqs_from_video = [
+ _indices[i:(i + _len):_step]
+ for i in range(0, n_frame - _len + 1)
+ ]
+ sequence_indices.extend(seqs_from_video)
+
+ # reduce dataset size if needed
+ subset_size = int(len(sequence_indices) * self.subset_frac)
+ start = np.random.randint(0, len(sequence_indices) - subset_size + 1)
+ end = start + subset_size
+
+ return sequence_indices[start:end]
+
+ def _load_annotations(self) -> Tuple[List[dict], List[dict]]:
+ instance_list, image_list = super()._load_annotations()
+
+ h36m_data = self.ann_data
+ kpts_3d = h36m_data['S']
+
+ if self.keypoint_2d_src == 'detection':
+ assert exists(self.keypoint_2d_det_file)
+ kpts_2d = self._load_keypoint_2d_detection(
+ self.keypoint_2d_det_file)
+ assert kpts_2d.shape[0] == kpts_3d.shape[0]
+ assert kpts_2d.shape[2] == 3
+
+ for idx, frame_ids in enumerate(self.sequence_indices):
+ kpt_2d = kpts_2d[frame_ids].astype(np.float32)
+ keypoints = kpt_2d[..., :2]
+ keypoints_visible = kpt_2d[..., 2]
+ instance_list[idx].update({
+ 'keypoints':
+ keypoints,
+ 'keypoints_visible':
+ keypoints_visible
+ })
+
+ return instance_list, image_list
+
+ @staticmethod
+ def _parse_h36m_imgname(imgname) -> Tuple[str, str, str]:
+ """Parse imgname to get information of subject, action and camera.
+
+ A typical h36m image filename is like:
+ S1_Directions_1.54138969_000001.jpg
+ """
+ subj, rest = osp.basename(imgname).split('_', 1)
+ action, rest = rest.split('.', 1)
+ camera, rest = rest.split('_', 1)
+ return subj, action, camera
+
+ def get_camera_param(self, imgname) -> dict:
+ """Get camera parameters of a frame by its image name."""
+ assert hasattr(self, 'camera_param')
+ subj, _, camera = self._parse_h36m_imgname(imgname)
+ return self.camera_param[(subj, camera)]
+
+ def _load_keypoint_2d_detection(self, det_file):
+ """"Load 2D joint detection results from file."""
+ with get_local_path(det_file) as local_path:
+ kpts_2d = np.load(local_path).astype(np.float32)
+
+ return kpts_2d
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/mpii2goliath3d_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/mpii2goliath3d_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..c32b1fbdc2a3e3a8080ddbbf22d71a639e705d4f
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/body3d/mpii2goliath3d_dataset.py
@@ -0,0 +1,124 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import json
+import os.path as osp
+from typing import Callable, List, Optional, Sequence, Tuple, Union
+
+import copy
+import numpy as np
+from mmengine.fileio import exists, get_local_path
+from scipy.io import loadmat
+
+from mmpose.registry import DATASETS
+from mmpose.structures.bbox import bbox_cs2xyxy
+from ..base import BaseCocoStyleDataset
+import os
+import sys
+
+##-----------------------------------------------------------------------------------------------------------
+try:
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../..')) \
+ if os.path.join(os.path.dirname(__file__), '../../../..') not in sys.path else None
+
+ from configs._base_.datasets.mpii import dataset_info as source_dataset_info
+ from configs._base_.datasets.goliath3d import dataset_info as target_dataset_info
+
+ SOURCE_KEYPOINT_ORDER = [v['name'] for k, v in sorted(source_dataset_info['keypoint_info'].items())]
+ TARGET_KEYPOINT_ORDER = [v['name'] for k, v in sorted(target_dataset_info['keypoint_info'].items())]
+
+ SOURCE_TO_TARGET_INDICES = {joint_index: None for joint_index in range(len(SOURCE_KEYPOINT_ORDER))}
+ for joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ if SOURCE_KEYPOINT_ORDER[joint_index] in TARGET_KEYPOINT_ORDER:
+ SOURCE_TO_TARGET_INDICES[joint_index] = TARGET_KEYPOINT_ORDER.index(SOURCE_KEYPOINT_ORDER[joint_index])
+except Exception as e:
+ pass
+
+##-----------------------------------------------------------------------------------------------------------
+@DATASETS.register_module()
+class Mpii2Goliath3dDataset(BaseCocoStyleDataset):
+ """
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/mpii2goliath3d.py')
+
+ def _load_annotations(self) -> Tuple[List[dict], List[dict]]:
+ """Load data from annotations in MPII format."""
+
+ assert exists(self.ann_file), 'Annotation file does not exist'
+ with get_local_path(self.ann_file) as local_path:
+ with open(local_path) as anno_file:
+ self.anns = json.load(anno_file)
+
+ instance_list = []
+ image_list = []
+ used_img_ids = set()
+ ann_id = 0
+
+ # mpii bbox scales are normalized with factor 200.
+ pixel_std = 200.
+
+ for idx, ann in enumerate(self.anns):
+ center = np.array(ann['center'], dtype=np.float32)
+ scale = np.array([ann['scale'], ann['scale']],
+ dtype=np.float32) * pixel_std
+
+ # Adjust center/scale slightly to avoid cropping limbs
+ if center[0] != -1:
+ center[1] = center[1] + 15. / pixel_std * scale[1]
+
+ # MPII uses matlab format, index is 1-based,
+ # we should first convert to 0-based index
+ center = center - 1
+
+ # unify shape with coco datasets
+ center = center.reshape(1, -1)
+ scale = scale.reshape(1, -1)
+ bbox = bbox_cs2xyxy(center, scale)
+
+ # load keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ keypoints = np.array(ann['joints']).reshape(1, -1, 2)
+ keypoints_visible = np.array(ann['joints_vis']).reshape(1, -1)
+
+ raw_keypoints = keypoints.copy()
+ raw_keypoints_visible = keypoints_visible.copy()
+
+ keypoints = np.zeros((1, len(TARGET_KEYPOINT_ORDER), 2), dtype=np.float32)
+ keypoints_visible = np.zeros((1, len(TARGET_KEYPOINT_ORDER)), dtype=np.float32)
+
+ for source_joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ target_joint_index = SOURCE_TO_TARGET_INDICES[source_joint_index]
+
+ if target_joint_index is not None:
+ keypoints[0, target_joint_index, :2] = raw_keypoints[0, source_joint_index, :2]
+ keypoints_visible[0, target_joint_index] = raw_keypoints_visible[0, source_joint_index]
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ instance_info = {
+ 'id': ann_id,
+ 'img_id': int(ann['image'].split('.')[0]),
+ 'img_path': osp.join(self.data_prefix['img'], ann['image']),
+ 'bbox_center': center,
+ 'bbox_scale': scale,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ }
+
+ if instance_info['img_id'] not in used_img_ids:
+ used_img_ids.add(instance_info['img_id'])
+ image_list.append({
+ 'img_id': instance_info['img_id'],
+ 'img_path': instance_info['img_path'],
+ })
+
+ instance_list.append(instance_info)
+ ann_id = ann_id + 1
+
+ return instance_list, image_list
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..7b1e7d1bc740227f10fa2e00c347c984e2004ba4
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__init__.py
@@ -0,0 +1,17 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .aflw_dataset import AFLWDataset
+from .coco_wholebody_face_dataset import CocoWholeBodyFaceDataset
+from .cofw_dataset import COFWDataset
+from .face_300w_dataset import Face300WDataset
+from .lapa_dataset import LapaDataset
+from .wflw_dataset import WFLWDataset
+
+__all__ = [
+ 'Face300WDataset', 'WFLWDataset', 'AFLWDataset', 'COFWDataset',
+ 'CocoWholeBodyFaceDataset', 'LapaDataset'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..42ba220d599817e6db0c84cd7c93d077d775f988
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/aflw_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/aflw_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4f2b17f067780f0e8800dfc2f1886ffb5a7ee84f
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/aflw_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/coco_wholebody_face_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/coco_wholebody_face_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6c53d6ba13a0ae815b80518bc02dcee145ab2c0e
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/coco_wholebody_face_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/cofw_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/cofw_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e38914e8445e9f90b2ecb708a792c42dcb98b264
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/cofw_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/face_300w_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/face_300w_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..26713a1e78d1ebb204cdffcda41fb2fba44ff27c
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/face_300w_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/lapa_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/lapa_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d63d78b85c162bdf151d714f797296f7b6bb0c91
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/lapa_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/wflw_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/wflw_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3c9ca3367f5e10226d86514ddd65f61bc19adca1
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/__pycache__/wflw_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/aflw_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/aflw_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..1ddbce3e3c9b9b8988a4c3679431ad12bd54ab22
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/aflw_dataset.py
@@ -0,0 +1,127 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+from typing import Optional
+
+import numpy as np
+
+from mmpose.registry import DATASETS
+from mmpose.structures.bbox import bbox_cs2xyxy
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class AFLWDataset(BaseCocoStyleDataset):
+ """AFLW dataset for face keypoint localization.
+
+ "Annotated Facial Landmarks in the Wild: A Large-scale,
+ Real-world Database for Facial Landmark Localization".
+ In Proc. First IEEE International Workshop on Benchmarking
+ Facial Image Analysis Technologies, 2011.
+
+ The landmark annotations follow the 19 points mark-up. The definition
+ can be found in `https://www.tugraz.at/institute/icg/research`
+ `/team-bischof/lrs/downloads/aflw/`
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/aflw.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw Face AFLW annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ img_path = osp.join(self.data_prefix['img'], img['file_name'])
+
+ # aflw bbox scales are normalized with factor 200.
+ pixel_std = 200.
+
+ # center, scale in shape [1, 2] and bbox in [1, 4]
+ center = np.array([ann['center']], dtype=np.float32)
+ scale = np.array([[ann['scale'], ann['scale']]],
+ dtype=np.float32) * pixel_std
+ bbox = bbox_cs2xyxy(center, scale)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ num_keypoints = ann['num_keypoints']
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img_path,
+ 'bbox': bbox,
+ 'bbox_center': center,
+ 'bbox_scale': scale,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann['iscrowd'],
+ 'id': ann['id'],
+ }
+
+ if self.test_mode:
+ # 'box_size' is used as normalization factor
+ assert 'box_size' in ann, '"box_size" is missing in annotation, '\
+ 'which is required for evaluation.'
+ data_info['box_size'] = ann['box_size']
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/coco_wholebody_face_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/coco_wholebody_face_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..963b1f048d7b8b7da60b3712d7202de141ef63fc
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/coco_wholebody_face_dataset.py
@@ -0,0 +1,120 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+from typing import Optional
+
+import numpy as np
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class CocoWholeBodyFaceDataset(BaseCocoStyleDataset):
+ """CocoWholeBodyDataset for face keypoint localization.
+
+ `Whole-Body Human Pose Estimation in the Wild', ECCV'2020.
+ More details can be found in the `paper
+ `__ .
+
+ The face landmark annotations follow the 68 points mark-up.
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(
+ from_file='configs/_base_/datasets/coco_wholebody_face.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw CocoWholeBody Face annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ # filter invalid instance
+ if not ann['face_valid'] or max(ann['face_kpts']) <= 0:
+ return None
+
+ img_path = osp.join(self.data_prefix['img'], img['file_name'])
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['face_box']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['face_kpts'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img_path,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann['iscrowd'],
+ 'id': ann['id'],
+ }
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/cofw_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/cofw_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..e2b8bf0fb837d75cea77c91795012f4cbe69be16
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/cofw_dataset.py
@@ -0,0 +1,58 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class COFWDataset(BaseCocoStyleDataset):
+ """COFW dataset for face keypoint localization.
+
+ "Robust face landmark estimation under occlusion", ICCV'2013.
+
+ The landmark annotations follow the 29 points mark-up. The definition
+ can be found in `http://www.vision.caltech.edu/xpburgos/ICCV13/`__ .
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/cofw.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/face_300w_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/face_300w_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..7202ebaee0690293a15a7eb707cd3cb7b0fe0df4
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/face_300w_dataset.py
@@ -0,0 +1,117 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+from typing import Optional
+
+import numpy as np
+
+from mmpose.registry import DATASETS
+from mmpose.structures.bbox import bbox_cs2xyxy
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class Face300WDataset(BaseCocoStyleDataset):
+ """300W dataset for face keypoint localization.
+
+ "300 faces In-the-wild challenge: Database and results",
+ Image and Vision Computing (IMAVIS) 2019.
+
+ The landmark annotations follow the 68 points mark-up. The definition
+ can be found in `https://ibug.doc.ic.ac.uk/resources/300-W/`.
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/300w.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw Face300W annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ img_path = osp.join(self.data_prefix['img'], img['file_name'])
+
+ # 300w bbox scales are normalized with factor 200.
+ pixel_std = 200.
+
+ # center, scale in shape [1, 2] and bbox in [1, 4]
+ center = np.array([ann['center']], dtype=np.float32)
+ scale = np.array([[ann['scale'], ann['scale']]],
+ dtype=np.float32) * pixel_std
+ bbox = bbox_cs2xyxy(center, scale)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ num_keypoints = ann['num_keypoints']
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img_path,
+ 'bbox': bbox,
+ 'bbox_center': center,
+ 'bbox_scale': scale,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann['iscrowd'],
+ 'id': ann['id'],
+ }
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/lapa_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/lapa_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..733a2477adb59bb45337f3fb6f0c823b416acb59
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/lapa_dataset.py
@@ -0,0 +1,59 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class LapaDataset(BaseCocoStyleDataset):
+ """LaPa dataset for face keypoint localization.
+
+ "A New Dataset and Boundary-Attention Semantic Segmentation
+ for Face Parsing", AAAI'2020.
+
+ The landmark annotations follow the 106 points mark-up. The definition
+ can be found in `https://github.com/JDAI-CV/lapa-dataset/`__ .
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/lapa.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/wflw_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/wflw_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..9ed92fc07f56887741e4ef2088c4a8b3720a22e6
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/face/wflw_dataset.py
@@ -0,0 +1,117 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+from typing import Optional
+
+import numpy as np
+
+from mmpose.registry import DATASETS
+from mmpose.structures.bbox import bbox_cs2xyxy
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class WFLWDataset(BaseCocoStyleDataset):
+ """WFLW dataset for face keypoint localization.
+
+ "Look at Boundary: A Boundary-Aware Face Alignment Algorithm",
+ CVPR'2018.
+
+ The landmark annotations follow the 98 points mark-up. The definition
+ can be found in `https://wywu.github.io/projects/LAB/WFLW.html`__ .
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/wflw.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw Face WFLW annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ img_path = osp.join(self.data_prefix['img'], img['file_name'])
+
+ # wflw bbox scales are normalized with factor 200.
+ pixel_std = 200.
+
+ # center, scale in shape [1, 2] and bbox in [1, 4]
+ center = np.array([ann['center']], dtype=np.float32)
+ scale = np.array([[ann['scale'], ann['scale']]],
+ dtype=np.float32) * pixel_std
+ bbox = bbox_cs2xyxy(center, scale)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ num_keypoints = ann['num_keypoints']
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img_path,
+ 'bbox': bbox,
+ 'bbox_center': center,
+ 'bbox_scale': scale,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann['iscrowd'],
+ 'id': ann['id'],
+ }
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..9919e00b5d0e3b9972d2334f48b2f51a86e8d67d
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/__init__.py
@@ -0,0 +1,10 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .deepfashion2_dataset import DeepFashion2Dataset
+from .deepfashion_dataset import DeepFashionDataset
+
+__all__ = ['DeepFashionDataset', 'DeepFashion2Dataset']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..10b9172290838a6b815a0e7a4442cfb675e87b72
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/__pycache__/deepfashion2_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/__pycache__/deepfashion2_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4cda13f036d53eca4601795dc77484498134f2cb
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/__pycache__/deepfashion2_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/__pycache__/deepfashion_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/__pycache__/deepfashion_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..87133ddf832dbb9701e7f28bd53a5ea00c133d9f
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/__pycache__/deepfashion_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/deepfashion2_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/deepfashion2_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..b9dcdf2f54b33148704f442de7d76c1f5c066719
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/deepfashion2_dataset.py
@@ -0,0 +1,15 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module(name='DeepFashion2Dataset')
+class DeepFashion2Dataset(BaseCocoStyleDataset):
+ """DeepFashion2 dataset for fashion landmark detection."""
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/deepfashion2.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/deepfashion_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/deepfashion_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..8ffd48bfabeac71a93fcefe9a8d966dc6e53a1fb
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/fashion/deepfashion_dataset.py
@@ -0,0 +1,142 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Callable, List, Optional, Sequence, Union
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class DeepFashionDataset(BaseCocoStyleDataset):
+ """DeepFashion dataset (full-body clothes) for fashion landmark detection.
+
+ "DeepFashion: Powering Robust Clothes Recognition
+ and Retrieval with Rich Annotations", CVPR'2016.
+ "Fashion Landmark Detection in the Wild", ECCV'2016.
+
+ The dataset contains 3 categories for full-body, upper-body and lower-body.
+
+ Fashion landmark indexes for upper-body clothes::
+
+ 0: 'left collar',
+ 1: 'right collar',
+ 2: 'left sleeve',
+ 3: 'right sleeve',
+ 4: 'left hem',
+ 5: 'right hem'
+
+ Fashion landmark indexes for lower-body clothes::
+
+ 0: 'left waistline',
+ 1: 'right waistline',
+ 2: 'left hem',
+ 3: 'right hem'
+
+ Fashion landmark indexes for full-body clothes::
+
+ 0: 'left collar',
+ 1: 'right collar',
+ 2: 'left sleeve',
+ 3: 'right sleeve',
+ 4: 'left waistline',
+ 5: 'right waistline',
+ 6: 'left hem',
+ 7: 'right hem'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ subset (str): Specifies the subset of body: ``'full'``, ``'upper'`` or
+ ``'lower'``. Default: '', which means ``'full'``.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img='')``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ def __init__(self,
+ ann_file: str = '',
+ subset: str = '',
+ bbox_file: Optional[str] = None,
+ data_mode: str = 'topdown',
+ metainfo: Optional[dict] = None,
+ data_root: Optional[str] = None,
+ data_prefix: dict = dict(img=''),
+ filter_cfg: Optional[dict] = None,
+ indices: Optional[Union[int, Sequence[int]]] = None,
+ serialize_data: bool = True,
+ pipeline: List[Union[dict, Callable]] = [],
+ test_mode: bool = False,
+ lazy_init: bool = False,
+ max_refetch: int = 1000):
+ self._check_subset_and_metainfo(subset)
+
+ super().__init__(
+ ann_file=ann_file,
+ bbox_file=bbox_file,
+ data_mode=data_mode,
+ metainfo=metainfo,
+ data_root=data_root,
+ data_prefix=data_prefix,
+ filter_cfg=filter_cfg,
+ indices=indices,
+ serialize_data=serialize_data,
+ pipeline=pipeline,
+ test_mode=test_mode,
+ lazy_init=lazy_init,
+ max_refetch=max_refetch)
+
+ @classmethod
+ def _check_subset_and_metainfo(cls, subset: str = '') -> None:
+ """Check the subset of body and set the corresponding metainfo.
+
+ Args:
+ subset(str): the subset of body: could be ``'full'``, ``'upper'``
+ or ``'lower'``. Default: '', which means ``'full'``.
+ """
+ if subset == '' or subset == 'full':
+ cls.METAINFO = dict(
+ from_file='configs/_base_/datasets/deepfashion_full.py')
+ elif subset == 'upper':
+ cls.METAINFO = dict(
+ from_file='configs/_base_/datasets/deepfashion_upper.py')
+ elif subset == 'lower':
+ cls.METAINFO = dict(
+ from_file='configs/_base_/datasets/deepfashion_lower.py')
+ else:
+ raise ValueError(
+ f'{cls.__class__.__name__} got invalid subset: '
+ f'{subset}. Should be "full", "lower" or "upper".')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..de94f57d75e310ce69cf4ac801175e67b42bcdda
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__init__.py
@@ -0,0 +1,16 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .coco_wholebody_hand_dataset import CocoWholeBodyHandDataset
+from .freihand_dataset import FreiHandDataset
+from .onehand10k_dataset import OneHand10KDataset
+from .panoptic_hand2d_dataset import PanopticHand2DDataset
+from .rhd2d_dataset import Rhd2DDataset
+
+__all__ = [
+ 'OneHand10KDataset', 'FreiHandDataset', 'PanopticHand2DDataset',
+ 'Rhd2DDataset', 'CocoWholeBodyHandDataset'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..797c9adffa0ec599441cad467e53965b232cc074
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/coco_wholebody_hand_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/coco_wholebody_hand_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..be2cd3ba5e012e2e3088480ebad3991f722f5ecd
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/coco_wholebody_hand_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/freihand_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/freihand_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..63fe15ba33a0dbdeb6872075928b4b8a3a6eda3e
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/freihand_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/onehand10k_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/onehand10k_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8e5efdd056f8861a93909ad014e954419ae01f57
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/onehand10k_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/panoptic_hand2d_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/panoptic_hand2d_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3cf4005c86f1b8c273e725d80e921a853d1c8ea3
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/panoptic_hand2d_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/rhd2d_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/rhd2d_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1c6001d5fa38c36f2a89927e704b1b2bc583ae32
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/__pycache__/rhd2d_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/coco_wholebody_hand_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/coco_wholebody_hand_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..fd2feaf43b30b45a4d397f833e8bb546c1c1a07f
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/coco_wholebody_hand_dataset.py
@@ -0,0 +1,153 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+from typing import List, Tuple
+
+import numpy as np
+from mmengine.fileio import exists, get_local_path
+from xtcocotools.coco import COCO
+
+from mmpose.registry import DATASETS
+from mmpose.structures.bbox import bbox_xywh2xyxy
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class CocoWholeBodyHandDataset(BaseCocoStyleDataset):
+ """CocoWholeBodyDataset for hand pose estimation.
+
+ "Whole-Body Human Pose Estimation in the Wild", ECCV'2020.
+ More details can be found in the `paper
+ `__ .
+
+ COCO-WholeBody Hand keypoints::
+
+ 0: 'wrist',
+ 1: 'thumb1',
+ 2: 'thumb2',
+ 3: 'thumb3',
+ 4: 'thumb4',
+ 5: 'forefinger1',
+ 6: 'forefinger2',
+ 7: 'forefinger3',
+ 8: 'forefinger4',
+ 9: 'middle_finger1',
+ 10: 'middle_finger2',
+ 11: 'middle_finger3',
+ 12: 'middle_finger4',
+ 13: 'ring_finger1',
+ 14: 'ring_finger2',
+ 15: 'ring_finger3',
+ 16: 'ring_finger4',
+ 17: 'pinky_finger1',
+ 18: 'pinky_finger2',
+ 19: 'pinky_finger3',
+ 20: 'pinky_finger4'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(
+ from_file='configs/_base_/datasets/coco_wholebody_hand.py')
+
+ def _load_annotations(self) -> Tuple[List[dict], List[dict]]:
+ """Load data from annotations in COCO format."""
+
+ assert exists(self.ann_file), 'Annotation file does not exist'
+
+ with get_local_path(self.ann_file) as local_path:
+ self.coco = COCO(local_path)
+ instance_list = []
+ image_list = []
+ id = 0
+
+ for img_id in self.coco.getImgIds():
+ img = self.coco.loadImgs(img_id)[0]
+
+ img.update({
+ 'img_id':
+ img_id,
+ 'img_path':
+ osp.join(self.data_prefix['img'], img['file_name']),
+ })
+ image_list.append(img)
+
+ ann_ids = self.coco.getAnnIds(imgIds=img_id, iscrowd=False)
+ anns = self.coco.loadAnns(ann_ids)
+ for ann in anns:
+ for type in ['left', 'right']:
+ # filter invalid hand annotations, there might be two
+ # valid instances (left and right hand) in one image
+ if ann[f'{type}hand_valid'] and max(
+ ann[f'{type}hand_kpts']) > 0:
+
+ bbox_xywh = np.array(
+ ann[f'{type}hand_box'],
+ dtype=np.float32).reshape(1, 4)
+
+ bbox = bbox_xywh2xyxy(bbox_xywh)
+
+ _keypoints = np.array(
+ ann[f'{type}hand_kpts'],
+ dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ instance_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img['img_path'],
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann['iscrowd'],
+ 'segmentation': ann['segmentation'],
+ 'id': id,
+ }
+ instance_list.append(instance_info)
+ id = id + 1
+
+ instance_list = sorted(instance_list, key=lambda x: x['id'])
+ return instance_list, image_list
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/freihand_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/freihand_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..3699c08c0cb30d064b049f7712013ab8640ec677
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/freihand_dataset.py
@@ -0,0 +1,133 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+from typing import Optional
+
+import numpy as np
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class FreiHandDataset(BaseCocoStyleDataset):
+ """FreiHand dataset for hand pose estimation.
+
+ "FreiHAND: A Dataset for Markerless Capture of Hand Pose
+ and Shape from Single RGB Images", ICCV'2019.
+ More details can be found in the `paper
+ `__ .
+
+ FreiHand keypoints::
+
+ 0: 'wrist',
+ 1: 'thumb1',
+ 2: 'thumb2',
+ 3: 'thumb3',
+ 4: 'thumb4',
+ 5: 'forefinger1',
+ 6: 'forefinger2',
+ 7: 'forefinger3',
+ 8: 'forefinger4',
+ 9: 'middle_finger1',
+ 10: 'middle_finger2',
+ 11: 'middle_finger3',
+ 12: 'middle_finger4',
+ 13: 'ring_finger1',
+ 14: 'ring_finger2',
+ 15: 'ring_finger3',
+ 16: 'ring_finger4',
+ 17: 'pinky_finger1',
+ 18: 'pinky_finger2',
+ 19: 'pinky_finger3',
+ 20: 'pinky_finger4'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/freihand2d.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ img_path = osp.join(self.data_prefix['img'], img['file_name'])
+
+ # use the entire image which is 224x224
+ bbox = np.array([0, 0, 224, 224], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img_path,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann['iscrowd'],
+ 'segmentation': ann['segmentation'],
+ 'id': ann['id'],
+ }
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/onehand10k_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/onehand10k_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..4b830617b2e33bba84e66379c05d4a2d9ddf601b
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/onehand10k_dataset.py
@@ -0,0 +1,82 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class OneHand10KDataset(BaseCocoStyleDataset):
+ """OneHand10K dataset for hand pose estimation.
+
+ "Mask-pose Cascaded CNN for 2D Hand Pose Estimation from
+ Single Color Images", TCSVT'2019.
+ More details can be found in the `paper
+ `__ .
+
+ OneHand10K keypoints::
+
+ 0: 'wrist',
+ 1: 'thumb1',
+ 2: 'thumb2',
+ 3: 'thumb3',
+ 4: 'thumb4',
+ 5: 'forefinger1',
+ 6: 'forefinger2',
+ 7: 'forefinger3',
+ 8: 'forefinger4',
+ 9: 'middle_finger1',
+ 10: 'middle_finger2',
+ 11: 'middle_finger3',
+ 12: 'middle_finger4',
+ 13: 'ring_finger1',
+ 14: 'ring_finger2',
+ 15: 'ring_finger3',
+ 16: 'ring_finger4',
+ 17: 'pinky_finger1',
+ 18: 'pinky_finger2',
+ 19: 'pinky_finger3',
+ 20: 'pinky_finger4'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/onehand10k.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/panoptic_hand2d_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/panoptic_hand2d_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..872670d0e3458bf35ab4e6846586acdaa156bc98
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/panoptic_hand2d_dataset.py
@@ -0,0 +1,142 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+from typing import Optional
+
+import numpy as np
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class PanopticHand2DDataset(BaseCocoStyleDataset):
+ """Panoptic 2D dataset for hand pose estimation.
+
+ "Hand Keypoint Detection in Single Images using Multiview
+ Bootstrapping", CVPR'2017.
+ More details can be found in the `paper
+ `__ .
+
+ Panoptic keypoints::
+
+ 0: 'wrist',
+ 1: 'thumb1',
+ 2: 'thumb2',
+ 3: 'thumb3',
+ 4: 'thumb4',
+ 5: 'forefinger1',
+ 6: 'forefinger2',
+ 7: 'forefinger3',
+ 8: 'forefinger4',
+ 9: 'middle_finger1',
+ 10: 'middle_finger2',
+ 11: 'middle_finger3',
+ 12: 'middle_finger4',
+ 13: 'ring_finger1',
+ 14: 'ring_finger2',
+ 15: 'ring_finger3',
+ 16: 'ring_finger4',
+ 17: 'pinky_finger1',
+ 18: 'pinky_finger2',
+ 19: 'pinky_finger3',
+ 20: 'pinky_finger4'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(
+ from_file='configs/_base_/datasets/panoptic_hand2d.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ img_path = osp.join(self.data_prefix['img'], img['file_name'])
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ _keypoints = np.array(
+ ann['keypoints'], dtype=np.float32).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2])
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img_path,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann['iscrowd'],
+ 'segmentation': ann['segmentation'],
+ 'head_size': ann['head_size'],
+ 'id': ann['id'],
+ }
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/rhd2d_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/rhd2d_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..7df0f860e674bf37191754f67986b1e5fbf099bc
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/hand/rhd2d_dataset.py
@@ -0,0 +1,82 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class Rhd2DDataset(BaseCocoStyleDataset):
+ """Rendered Handpose Dataset for hand pose estimation.
+
+ "Learning to Estimate 3D Hand Pose from Single RGB Images",
+ ICCV'2017.
+ More details can be found in the `paper
+ `__ .
+
+ Rhd keypoints::
+
+ 0: 'wrist',
+ 1: 'thumb4',
+ 2: 'thumb3',
+ 3: 'thumb2',
+ 4: 'thumb1',
+ 5: 'forefinger4',
+ 6: 'forefinger3',
+ 7: 'forefinger2',
+ 8: 'forefinger1',
+ 9: 'middle_finger4',
+ 10: 'middle_finger3',
+ 11: 'middle_finger2',
+ 12: 'middle_finger1',
+ 13: 'ring_finger4',
+ 14: 'ring_finger3',
+ 15: 'ring_finger2',
+ 16: 'ring_finger1',
+ 17: 'pinky_finger4',
+ 18: 'pinky_finger3',
+ 19: 'pinky_finger2',
+ 20: 'pinky_finger1'
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/rhd2d.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/utils.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..6e026c095f6da02bd9a073d6e06cf05b88c56d7b
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/utils.py
@@ -0,0 +1,229 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+import warnings
+
+import numpy as np
+from mmengine import Config
+
+
+def parse_pose_metainfo(metainfo: dict):
+ """Load meta information of pose dataset and check its integrity.
+
+ Args:
+ metainfo (dict): Raw data of pose meta information, which should
+ contain following contents:
+
+ - "dataset_name" (str): The name of the dataset
+ - "keypoint_info" (dict): The keypoint-related meta information,
+ e.g., name, upper/lower body, and symmetry
+ - "skeleton_info" (dict): The skeleton-related meta information,
+ e.g., start/end keypoint of limbs
+ - "joint_weights" (list[float]): The loss weights of keypoints
+ - "sigmas" (list[float]): The keypoint distribution parameters
+ to calculate OKS score. See `COCO keypoint evaluation
+ `__.
+
+ An example of metainfo is shown as follows.
+
+ .. code-block:: none
+ {
+ "dataset_name": "coco",
+ "keypoint_info":
+ {
+ 0:
+ {
+ "name": "nose",
+ "type": "upper",
+ "swap": "",
+ "color": [51, 153, 255],
+ },
+ 1:
+ {
+ "name": "right_eye",
+ "type": "upper",
+ "swap": "left_eye",
+ "color": [51, 153, 255],
+ },
+ ...
+ },
+ "skeleton_info":
+ {
+ 0:
+ {
+ "link": ("left_ankle", "left_knee"),
+ "color": [0, 255, 0],
+ },
+ ...
+ },
+ "joint_weights": [1., 1., ...],
+ "sigmas": [0.026, 0.025, ...],
+ }
+
+
+ A special case is that `metainfo` can have the key "from_file",
+ which should be the path of a config file. In this case, the
+ actual metainfo will be loaded by:
+
+ .. code-block:: python
+ metainfo = mmengine.Config.fromfile(metainfo['from_file'])
+
+ Returns:
+ Dict: pose meta information that contains following contents:
+
+ - "dataset_name" (str): Same as ``"dataset_name"`` in the input
+ - "num_keypoints" (int): Number of keypoints
+ - "keypoint_id2name" (dict): Mapping from keypoint id to name
+ - "keypoint_name2id" (dict): Mapping from keypoint name to id
+ - "upper_body_ids" (list): Ids of upper-body keypoint
+ - "lower_body_ids" (list): Ids of lower-body keypoint
+ - "flip_indices" (list): The Id of each keypoint's symmetric keypoint
+ - "flip_pairs" (list): The Ids of symmetric keypoint pairs
+ - "keypoint_colors" (numpy.ndarray): The keypoint color matrix of
+ shape [K, 3], where each row is the color of one keypint in bgr
+ - "num_skeleton_links" (int): The number of links
+ - "skeleton_links" (list): The links represented by Id pairs of start
+ and end points
+ - "skeleton_link_colors" (numpy.ndarray): The link color matrix
+ - "dataset_keypoint_weights" (numpy.ndarray): Same as the
+ ``"joint_weights"`` in the input
+ - "sigmas" (numpy.ndarray): Same as the ``"sigmas"`` in the input
+ """
+
+ if 'from_file' in metainfo:
+ cfg_file = metainfo['from_file']
+ if not osp.isfile(cfg_file):
+ # Search configs in 'mmpose/.mim/configs/' in case that mmpose
+ # is installed in non-editable mode.
+ import mmpose
+ mmpose_path = osp.dirname(mmpose.__file__)
+ _cfg_file = osp.join(mmpose_path, '.mim', 'configs', '_base_',
+ 'datasets', osp.basename(cfg_file))
+ if osp.isfile(_cfg_file):
+ warnings.warn(
+ f'The metainfo config file "{cfg_file}" does not exist. '
+ f'A matched config file "{_cfg_file}" will be used '
+ 'instead.')
+ cfg_file = _cfg_file
+ else:
+
+ raise FileNotFoundError(
+ f'The metainfo config file "{cfg_file}" does not exist.')
+
+ # TODO: remove the nested structure of dataset_info
+ # metainfo = Config.fromfile(metainfo['from_file'])
+ metainfo = Config.fromfile(cfg_file).dataset_info
+
+ # check data integrity
+ assert 'dataset_name' in metainfo
+ assert 'keypoint_info' in metainfo
+ assert 'skeleton_info' in metainfo
+ assert 'joint_weights' in metainfo
+ assert 'sigmas' in metainfo
+
+ # parse metainfo
+ parsed = dict(
+ dataset_name=None,
+ num_keypoints=None,
+ keypoint_id2name={},
+ keypoint_name2id={},
+ upper_body_ids=[],
+ lower_body_ids=[],
+ flip_indices=[],
+ flip_pairs=[],
+ keypoint_colors=[],
+ num_skeleton_links=None,
+ skeleton_links=[],
+ skeleton_link_colors=[],
+ dataset_keypoint_weights=None,
+ sigmas=None,
+ )
+
+ parsed['dataset_name'] = metainfo['dataset_name']
+
+ if 'remove_teeth' in metainfo:
+ parsed['remove_teeth'] = metainfo['remove_teeth']
+
+ if 'min_visible_keypoints' in metainfo:
+ parsed['min_visible_keypoints'] = metainfo['min_visible_keypoints']
+
+ if 'teeth_keypoint_ids' in metainfo:
+ parsed['teeth_keypoint_ids'] = metainfo['teeth_keypoint_ids']
+
+ if 'coco_wholebody_to_goliath_mapping' in metainfo:
+ parsed['coco_wholebody_to_goliath_mapping'] = \
+ metainfo['coco_wholebody_to_goliath_mapping']
+
+ if 'coco_wholebody_to_goliath_keypoint_info' in metainfo:
+ parsed['coco_wholebody_to_goliath_keypoint_info'] = \
+ metainfo['coco_wholebody_to_goliath_keypoint_info']
+
+ if 'idx_to_original_idx_mapping' in metainfo:
+ parsed['idx_to_original_idx_mapping'] = \
+ metainfo['idx_to_original_idx_mapping']
+
+ # parse keypoint information
+ parsed['num_keypoints'] = len(metainfo['keypoint_info'])
+
+ for kpt_id, kpt in metainfo['keypoint_info'].items():
+ kpt_name = kpt['name']
+ parsed['keypoint_id2name'][kpt_id] = kpt_name
+ parsed['keypoint_name2id'][kpt_name] = kpt_id
+ parsed['keypoint_colors'].append(kpt.get('color', [255, 128, 0]))
+
+ kpt_type = kpt.get('type', '')
+ if kpt_type == 'upper':
+ parsed['upper_body_ids'].append(kpt_id)
+ elif kpt_type == 'lower':
+ parsed['lower_body_ids'].append(kpt_id)
+
+ swap_kpt = kpt.get('swap', '')
+ if swap_kpt == kpt_name or swap_kpt == '':
+ parsed['flip_indices'].append(kpt_name)
+ else:
+ parsed['flip_indices'].append(swap_kpt)
+ pair = (swap_kpt, kpt_name)
+ if pair not in parsed['flip_pairs']:
+ parsed['flip_pairs'].append(pair)
+
+ # parse skeleton information
+ parsed['num_skeleton_links'] = len(metainfo['skeleton_info'])
+ for _, sk in metainfo['skeleton_info'].items():
+ parsed['skeleton_links'].append(sk['link'])
+ parsed['skeleton_link_colors'].append(sk.get('color', [96, 96, 255]))
+
+ # parse extra information
+ parsed['dataset_keypoint_weights'] = np.array(
+ metainfo['joint_weights'], dtype=np.float32)
+ parsed['sigmas'] = np.array(metainfo['sigmas'], dtype=np.float32)
+
+ if 'stats_info' in metainfo:
+ parsed['stats_info'] = {}
+ for name, val in metainfo['stats_info'].items():
+ parsed['stats_info'][name] = np.array(val, dtype=np.float32)
+
+ # formatting
+ def _map(src, mapping: dict):
+ if isinstance(src, (list, tuple)):
+ cls = type(src)
+ return cls(_map(s, mapping) for s in src)
+ else:
+ return mapping[src]
+
+ parsed['flip_pairs'] = _map(
+ parsed['flip_pairs'], mapping=parsed['keypoint_name2id'])
+ parsed['flip_indices'] = _map(
+ parsed['flip_indices'], mapping=parsed['keypoint_name2id'])
+ parsed['skeleton_links'] = _map(
+ parsed['skeleton_links'], mapping=parsed['keypoint_name2id'])
+
+ parsed['keypoint_colors'] = np.array(
+ parsed['keypoint_colors'], dtype=np.uint8)
+ parsed['skeleton_link_colors'] = np.array(
+ parsed['skeleton_link_colors'], dtype=np.uint8)
+
+ return parsed
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..ea130b4b4841d6f1f7815d208d891ae78e78fb76
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/__init__.py
@@ -0,0 +1,11 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .coco_wholebody_dataset import CocoWholeBodyDataset
+from .halpe_dataset import HalpeDataset
+from .coco_wholebody2goliath_dataset import CocoWholeBody2GoliathDataset
+
+__all__ = ['CocoWholeBodyDataset', 'HalpeDataset', 'CocoWholeBody2GoliathDataset']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3d71c8500f0ddee951af5667cd7473a814c99ded
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/__pycache__/coco_wholebody2goliath_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/__pycache__/coco_wholebody2goliath_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..18f411da92f1e754d45e88072b6e2059d79ca476
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/__pycache__/coco_wholebody2goliath_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/__pycache__/coco_wholebody_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/__pycache__/coco_wholebody_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..351f9fed36d42a6955d1b76bb851a53f691c1eed
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/__pycache__/coco_wholebody_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/__pycache__/halpe_dataset.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/__pycache__/halpe_dataset.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3d79d7dbfe39744e08aefd216e55eb6ed97dbc5e
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/__pycache__/halpe_dataset.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/coco_wholebody2goliath_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/coco_wholebody2goliath_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..c0c552214e1674f27c7588b9923015277a26062a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/coco_wholebody2goliath_dataset.py
@@ -0,0 +1,106 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+import os.path as osp
+from typing import Optional
+
+import numpy as np
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+##-----------------------------------------------------------------------------------------------------------
+try:
+ from configs._base_.datasets.coco_wholebody import dataset_info as source_dataset_info
+ from configs._base_.datasets.goliath import dataset_info as target_dataset_info
+
+ SOURCE_KEYPOINT_ORDER = [v['name'] for k, v in sorted(source_dataset_info['keypoint_info'].items())]
+ TARGET_KEYPOINT_ORDER = [v['name'] for k, v in sorted(target_dataset_info['keypoint_info'].items())]
+
+ SOURCE_TO_TARGET_INDICES = {joint_index: None for joint_index in range(len(SOURCE_KEYPOINT_ORDER))}
+ for joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ if SOURCE_KEYPOINT_ORDER[joint_index] in TARGET_KEYPOINT_ORDER:
+ SOURCE_TO_TARGET_INDICES[joint_index] = TARGET_KEYPOINT_ORDER.index(SOURCE_KEYPOINT_ORDER[joint_index])
+except Exception as e:
+ pass
+
+##-----------------------------------------------------------------------------------------------------------
+@DATASETS.register_module()
+class CocoWholeBody2GoliathDataset(BaseCocoStyleDataset):
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/coco_wholebody2goliath.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ img_path = osp.join(self.data_prefix['img'], img['file_name'])
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ # COCO-Wholebody: consisting of body, foot, face and hand keypoints
+ _keypoints = np.array(ann['keypoints'] + ann['foot_kpts'] +
+ ann['face_kpts'] + ann['lefthand_kpts'] +
+ ann['righthand_kpts']).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2] > 0)
+
+ raw_keypoints = keypoints.copy()
+ raw_keypoints_visible = keypoints_visible.copy()
+
+ keypoints = np.zeros((1, len(TARGET_KEYPOINT_ORDER), 2), dtype=np.float32)
+ keypoints_visible = np.zeros((1, len(TARGET_KEYPOINT_ORDER)), dtype=np.float32)
+
+ for source_joint_index in range(len(SOURCE_KEYPOINT_ORDER)):
+ target_joint_index = SOURCE_TO_TARGET_INDICES[source_joint_index]
+
+ if target_joint_index is not None:
+ keypoints[0, target_joint_index, :2] = raw_keypoints[0, source_joint_index, :2]
+ keypoints_visible[0, target_joint_index] = raw_keypoints_visible[0, source_joint_index]
+
+ num_keypoints = np.count_nonzero(keypoints.max(axis=2))
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img_path,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann['iscrowd'],
+ 'segmentation': ann['segmentation'],
+ 'id': ann['id'],
+ 'category_id': ann['category_id'],
+ # store the raw annotation of the instance
+ # it is useful for evaluation without providing ann_file
+ 'raw_ann_info': copy.deepcopy(ann),
+ }
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/coco_wholebody_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/coco_wholebody_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..7196f6de44363dc463d3e9d0b20767d26a23e5d5
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/coco_wholebody_dataset.py
@@ -0,0 +1,132 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+import os.path as osp
+from typing import Optional
+
+import numpy as np
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class CocoWholeBodyDataset(BaseCocoStyleDataset):
+ """CocoWholeBody dataset for pose estimation.
+
+ "Whole-Body Human Pose Estimation in the Wild", ECCV'2020.
+ More details can be found in the `paper
+ `__ .
+
+ COCO-WholeBody keypoints::
+
+ 0-16: 17 body keypoints,
+ 17-22: 6 foot keypoints,
+ 23-90: 68 face keypoints,
+ 91-132: 42 hand keypoints
+
+ In total, we have 133 keypoints for wholebody pose estimation.
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(
+ from_file='configs/_base_/datasets/coco_wholebody.py')
+
+ def parse_data_info(self, raw_data_info: dict) -> Optional[dict]:
+ """Parse raw COCO annotation of an instance.
+
+ Args:
+ raw_data_info (dict): Raw data information loaded from
+ ``ann_file``. It should have following contents:
+
+ - ``'raw_ann_info'``: Raw annotation of an instance
+ - ``'raw_img_info'``: Raw information of the image that
+ contains the instance
+
+ Returns:
+ dict: Parsed instance annotation
+ """
+
+ ann = raw_data_info['raw_ann_info']
+ img = raw_data_info['raw_img_info']
+
+ img_path = osp.join(self.data_prefix['img'], img['file_name'])
+ img_w, img_h = img['width'], img['height']
+
+ # get bbox in shape [1, 4], formatted as xywh
+ x, y, w, h = ann['bbox']
+ x1 = np.clip(x, 0, img_w - 1)
+ y1 = np.clip(y, 0, img_h - 1)
+ x2 = np.clip(x + w, 0, img_w - 1)
+ y2 = np.clip(y + h, 0, img_h - 1)
+
+ bbox = np.array([x1, y1, x2, y2], dtype=np.float32).reshape(1, 4)
+
+ # keypoints in shape [1, K, 2] and keypoints_visible in [1, K]
+ # COCO-Wholebody: consisting of body, foot, face and hand keypoints
+ _keypoints = np.array(ann['keypoints'] + ann['foot_kpts'] +
+ ann['face_kpts'] + ann['lefthand_kpts'] +
+ ann['righthand_kpts']).reshape(1, -1, 3)
+ keypoints = _keypoints[..., :2]
+ keypoints_visible = np.minimum(1, _keypoints[..., 2] > 0)
+
+ num_keypoints = ann['num_keypoints']
+
+ data_info = {
+ 'img_id': ann['image_id'],
+ 'img_path': img_path,
+ 'bbox': bbox,
+ 'bbox_score': np.ones(1, dtype=np.float32),
+ 'num_keypoints': num_keypoints,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'iscrowd': ann['iscrowd'],
+ 'segmentation': ann['segmentation'],
+ 'id': ann['id'],
+ 'category_id': ann['category_id'],
+ # store the raw annotation of the instance
+ # it is useful for evaluation without providing ann_file
+ 'raw_ann_info': copy.deepcopy(ann),
+ }
+
+ return data_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/halpe_dataset.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/halpe_dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..6720c1dcda3ee75fdfcaba00b6f5b1a50d416799
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/datasets/wholebody/halpe_dataset.py
@@ -0,0 +1,64 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.registry import DATASETS
+from ..base import BaseCocoStyleDataset
+
+
+@DATASETS.register_module()
+class HalpeDataset(BaseCocoStyleDataset):
+ """Halpe dataset for pose estimation.
+
+ 'https://github.com/Fang-Haoshu/Halpe-FullBody'
+
+ Halpe keypoints::
+
+ 0-19: 20 body keypoints,
+ 20-25: 6 foot keypoints,
+ 26-93: 68 face keypoints,
+ 94-135: 42 hand keypoints
+
+ In total, we have 136 keypoints for wholebody pose estimation.
+
+ Args:
+ ann_file (str): Annotation file path. Default: ''.
+ bbox_file (str, optional): Detection result file path. If
+ ``bbox_file`` is set, detected bboxes loaded from this file will
+ be used instead of ground-truth bboxes. This setting is only for
+ evaluation, i.e., ignored when ``test_mode`` is ``False``.
+ Default: ``None``.
+ data_mode (str): Specifies the mode of data samples: ``'topdown'`` or
+ ``'bottomup'``. In ``'topdown'`` mode, each data sample contains
+ one instance; while in ``'bottomup'`` mode, each data sample
+ contains all instances in a image. Default: ``'topdown'``
+ metainfo (dict, optional): Meta information for dataset, such as class
+ information. Default: ``None``.
+ data_root (str, optional): The root directory for ``data_prefix`` and
+ ``ann_file``. Default: ``None``.
+ data_prefix (dict, optional): Prefix for training data. Default:
+ ``dict(img=None, ann=None)``.
+ filter_cfg (dict, optional): Config for filter data. Default: `None`.
+ indices (int or Sequence[int], optional): Support using first few
+ data in annotation file to facilitate training/testing on a smaller
+ dataset. Default: ``None`` which means using all ``data_infos``.
+ serialize_data (bool, optional): Whether to hold memory using
+ serialized objects, when enabled, data loader workers can use
+ shared RAM from master process instead of making a copy.
+ Default: ``True``.
+ pipeline (list, optional): Processing pipeline. Default: [].
+ test_mode (bool, optional): ``test_mode=True`` means in test phase.
+ Default: ``False``.
+ lazy_init (bool, optional): Whether to load annotation during
+ instantiation. In some cases, such as visualization, only the meta
+ information of the dataset is needed, which is not necessary to
+ load annotation file. ``Basedataset`` can skip load annotations to
+ save time by set ``lazy_init=False``. Default: ``False``.
+ max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
+ None img. The maximum extra number of cycles to get a valid
+ image. Default: 1000.
+ """
+
+ METAINFO: dict = dict(from_file='configs/_base_/datasets/halpe.py')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/samplers.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/samplers.py
new file mode 100644
index 0000000000000000000000000000000000000000..1a026824cb80833dc8acde20dbee26daba54b5a3
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/samplers.py
@@ -0,0 +1,119 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import itertools
+import math
+from typing import Iterator, List, Optional, Sized, Union
+
+import torch
+from mmengine.dist import get_dist_info, sync_random_seed
+from torch.utils.data import Sampler
+
+from mmpose.datasets import CombinedDataset
+from mmpose.registry import DATA_SAMPLERS
+
+
+@DATA_SAMPLERS.register_module()
+class MultiSourceSampler(Sampler):
+ """Multi-Source Sampler. According to the sampling ratio, sample data from
+ different datasets to form batches.
+
+ Args:
+ dataset (Sized): The dataset
+ batch_size (int): Size of mini-batch
+ source_ratio (list[int | float]): The sampling ratio of different
+ source datasets in a mini-batch
+ shuffle (bool): Whether shuffle the dataset or not. Defaults to
+ ``True``
+ round_up (bool): Whether to add extra samples to make the number of
+ samples evenly divisible by the world size. Defaults to True.
+ seed (int, optional): Random seed. If ``None``, set a random seed.
+ Defaults to ``None``
+ """
+
+ def __init__(self,
+ dataset: Sized,
+ batch_size: int,
+ source_ratio: List[Union[int, float]],
+ shuffle: bool = True,
+ round_up: bool = True,
+ seed: Optional[int] = None) -> None:
+
+ assert isinstance(dataset, CombinedDataset),\
+ f'The dataset must be CombinedDataset, but get {dataset}'
+ assert isinstance(batch_size, int) and batch_size > 0, \
+ 'batch_size must be a positive integer value, ' \
+ f'but got batch_size={batch_size}'
+ assert isinstance(source_ratio, list), \
+ f'source_ratio must be a list, but got source_ratio={source_ratio}'
+ assert len(source_ratio) == len(dataset._lens), \
+ 'The length of source_ratio must be equal to ' \
+ f'the number of datasets, but got source_ratio={source_ratio}'
+
+ rank, world_size = get_dist_info()
+ self.rank = rank
+ self.world_size = world_size
+
+ self.dataset = dataset
+ self.cumulative_sizes = [0] + list(itertools.accumulate(dataset._lens))
+ self.batch_size = batch_size
+ self.source_ratio = source_ratio
+ self.num_samples = int(math.ceil(len(self.dataset) * 1.0 / world_size))
+ self.num_per_source = [
+ int(batch_size * sr / sum(source_ratio)) for sr in source_ratio
+ ]
+ self.num_per_source[0] = batch_size - sum(self.num_per_source[1:])
+
+ assert sum(self.num_per_source) == batch_size, \
+ 'The sum of num_per_source must be equal to ' \
+ f'batch_size, but get {self.num_per_source}'
+
+ self.seed = sync_random_seed() if seed is None else seed
+ self.shuffle = shuffle
+ self.round_up = round_up
+ self.source2inds = {
+ source: self._indices_of_rank(len(ds))
+ for source, ds in enumerate(dataset.datasets)
+ }
+
+ def _infinite_indices(self, sample_size: int) -> Iterator[int]:
+ """Infinitely yield a sequence of indices."""
+ g = torch.Generator()
+ g.manual_seed(self.seed)
+ while True:
+ if self.shuffle:
+ yield from torch.randperm(sample_size, generator=g).tolist()
+ else:
+ yield from torch.arange(sample_size).tolist()
+
+ def _indices_of_rank(self, sample_size: int) -> Iterator[int]:
+ """Slice the infinite indices by rank."""
+ yield from itertools.islice(
+ self._infinite_indices(sample_size), self.rank, None,
+ self.world_size)
+
+ def __iter__(self) -> Iterator[int]:
+ batch_buffer = []
+ num_iters = self.num_samples // self.batch_size
+ if self.round_up and self.num_samples > num_iters * self.batch_size:
+ num_iters += 1
+ for i in range(num_iters):
+ for source, num in enumerate(self.num_per_source):
+ batch_buffer_per_source = []
+ for idx in self.source2inds[source]:
+ idx += self.cumulative_sizes[source]
+ batch_buffer_per_source.append(idx)
+ if len(batch_buffer_per_source) == num:
+ batch_buffer += batch_buffer_per_source
+ break
+ return iter(batch_buffer)
+
+ def __len__(self) -> int:
+ return self.num_samples
+
+ def set_epoch(self, epoch: int) -> None:
+ """Compatible in `epoch-based runner."""
+ pass
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..d383795b1b0287cc7a1188d37eab0a00419a6d64
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__init__.py
@@ -0,0 +1,29 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .bottomup_transforms import (BottomupGetHeatmapMask, BottomupRandomAffine,
+ BottomupResize)
+from .common_transforms import (Albumentation, GenerateTarget,
+ GetBBoxCenterScale, PhotometricDistortion,
+ RandomBBoxTransform, RandomFlip,
+ RandomHalfBody)
+from .converting import KeypointConverter
+from .formatting import PackPoseInputs
+from .loading import LoadImage
+from .pose3d_transforms import RandomFlipAroundRoot
+from .topdown_transforms import TopdownAffine
+from .pose3d_transforms import Pose3dRandomFlip, Pose3dRandomBBoxTransform, Pose3dTopdownAffine,\
+ Pose3dGenerateTarget, PackPose3dInputs
+
+__all__ = [
+ 'GetBBoxCenterScale', 'RandomBBoxTransform', 'RandomFlip',
+ 'RandomHalfBody', 'TopdownAffine', 'Albumentation',
+ 'PhotometricDistortion', 'PackPoseInputs', 'LoadImage',
+ 'BottomupGetHeatmapMask', 'BottomupRandomAffine', 'BottomupResize',
+ 'GenerateTarget', 'KeypointConverter', 'RandomFlipAroundRoot',
+ 'Pose3dRandomFlip', 'Pose3dRandomBBoxTransform', 'Pose3dTopdownAffine',
+ 'Pose3dGenerateTarget', 'PackPose3dInputs'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..40653b91f840d14b1f0334148c7467c0a0663e23
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/bottomup_transforms.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/bottomup_transforms.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..854309336a7550a88f5b21746a512bde54141460
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/bottomup_transforms.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/common_transforms.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/common_transforms.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c12742448741c79c70d1d7f7a4ad093e863fcad1
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/common_transforms.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/converting.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/converting.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..855c00433af3fd349d131107f5eca81000975c9f
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/converting.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/formatting.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/formatting.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ecf8868faa4cc66ee5b07350f0a547005fa0d259
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/formatting.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/loading.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/loading.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f181fadf27a26a343cfe24589d659166454cb8c3
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/loading.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/pose3d_transforms.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/pose3d_transforms.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fd2afaa8f293dc7fda60454e39ecb3f201846a6b
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/pose3d_transforms.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/topdown_transforms.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/topdown_transforms.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9177d2c00d50f00168ebbec20766936c5aac3ac2
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/__pycache__/topdown_transforms.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/bottomup_transforms.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/bottomup_transforms.py
new file mode 100644
index 0000000000000000000000000000000000000000..b0106321b329e997466bf02ac3b1345303904aaf
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/bottomup_transforms.py
@@ -0,0 +1,522 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Dict, List, Optional, Tuple
+
+import cv2
+import numpy as np
+import xtcocotools.mask as cocomask
+from mmcv.image import imflip_, imresize
+from mmcv.transforms import BaseTransform
+from mmcv.transforms.utils import cache_randomness
+from scipy.stats import truncnorm
+
+from mmpose.registry import TRANSFORMS
+from mmpose.structures.bbox import get_udp_warp_matrix, get_warp_matrix
+
+
+@TRANSFORMS.register_module()
+class BottomupGetHeatmapMask(BaseTransform):
+ """Generate the mask of valid regions from the segmentation annotation.
+
+ Required Keys:
+
+ - img_shape
+ - invalid_segs (optional)
+ - warp_mat (optional)
+ - flip (optional)
+ - flip_direction (optional)
+ - heatmaps (optional)
+
+ Added Keys:
+
+ - heatmap_mask
+ """
+
+ def _segs_to_mask(self, segs: list, img_shape: Tuple[int,
+ int]) -> np.ndarray:
+ """Calculate mask from object segmentations.
+
+ Args:
+ segs (List): The object segmentation annotations in COCO format
+ img_shape (Tuple): The image shape in (h, w)
+
+ Returns:
+ np.ndarray: The binary object mask in size (h, w), where the
+ object pixels are 1 and background pixels are 0
+ """
+
+ # RLE is a simple yet efficient format for storing binary masks.
+ # details can be found at `COCO tools `__
+ rles = []
+ for seg in segs:
+ rle = cocomask.frPyObjects(seg, img_shape[0], img_shape[1])
+ if isinstance(rle, list):
+ # For non-crowded objects (e.g. human with no visible
+ # keypoints), the results is a list of rles
+ rles.extend(rle)
+ else:
+ # For crowded objects, the result is a single rle
+ rles.append(rle)
+
+ if rles:
+ mask = cocomask.decode(cocomask.merge(rles))
+ else:
+ mask = np.zeros(img_shape, dtype=np.uint8)
+
+ return mask
+
+ def transform(self, results: Dict) -> Optional[dict]:
+ """The transform function of :class:`BottomupGetHeatmapMask` to perform
+ photometric distortion on images.
+
+ See ``transform()`` method of :class:`BaseTransform` for details.
+
+
+ Args:
+ results (dict): Result dict from the data pipeline.
+
+ Returns:
+ dict: Result dict with images distorted.
+ """
+
+ invalid_segs = results.get('invalid_segs', [])
+ img_shape = results['img_shape'] # (img_h, img_w)
+ input_size = results['input_size']
+
+ # Calculate the mask of the valid region by negating the segmentation
+ # mask of invalid objects
+ mask = 1 - self._segs_to_mask(invalid_segs, img_shape)
+
+ # Apply an affine transform to the mask if the image has been
+ # transformed
+ if 'warp_mat' in results:
+ warp_mat = results['warp_mat']
+
+ mask = mask.astype(np.float32)
+ mask = cv2.warpAffine(
+ mask, warp_mat, input_size, flags=cv2.INTER_LINEAR)
+
+ # Flip the mask if the image has been flipped
+ if results.get('flip', False):
+ flip_dir = results['flip_direction']
+ if flip_dir is not None:
+ mask = imflip_(mask, flip_dir)
+
+ # Resize the mask to the same size of heatmaps
+ if 'heatmaps' in results:
+ heatmaps = results['heatmaps']
+ if isinstance(heatmaps, list):
+ # Multi-level heatmaps
+ heatmap_mask = []
+ for hm in results['heatmaps']:
+ h, w = hm.shape[1:3]
+ _mask = imresize(
+ mask, size=(w, h), interpolation='bilinear')
+ heatmap_mask.append(_mask)
+ else:
+ h, w = heatmaps.shape[1:3]
+ heatmap_mask = imresize(
+ mask, size=(w, h), interpolation='bilinear')
+ else:
+ heatmap_mask = mask
+
+ # Binarize the mask(s)
+ if isinstance(heatmap_mask, list):
+ results['heatmap_mask'] = [hm > 0.5 for hm in heatmap_mask]
+ else:
+ results['heatmap_mask'] = heatmap_mask > 0.5
+
+ return results
+
+
+@TRANSFORMS.register_module()
+class BottomupRandomAffine(BaseTransform):
+ r"""Randomly shift, resize and rotate the image.
+
+ Required Keys:
+
+ - img
+ - img_shape
+ - keypoints (optional)
+
+ Modified Keys:
+
+ - img
+ - keypoints (optional)
+
+ Added Keys:
+
+ - input_size
+ - warp_mat
+
+ Args:
+ input_size (Tuple[int, int]): The input image size of the model in
+ [w, h]
+ shift_factor (float): Randomly shift the image in range
+ :math:`[-dx, dx]` and :math:`[-dy, dy]` in X and Y directions,
+ where :math:`dx(y) = img_w(h) \cdot shift_factor` in pixels.
+ Defaults to 0.2
+ shift_prob (float): Probability of applying random shift. Defaults to
+ 1.0
+ scale_factor (Tuple[float, float]): Randomly resize the image in range
+ :math:`[scale_factor[0], scale_factor[1]]`. Defaults to
+ (0.75, 1.5)
+ scale_prob (float): Probability of applying random resizing. Defaults
+ to 1.0
+ scale_type (str): wrt ``long`` or ``short`` length of the image.
+ Defaults to ``short``
+ rotate_factor (float): Randomly rotate the bbox in
+ :math:`[-rotate_factor, rotate_factor]` in degrees. Defaults
+ to 40.0
+ use_udp (bool): Whether use unbiased data processing. See
+ `UDP (CVPR 2020)`_ for details. Defaults to ``False``
+
+ .. _`UDP (CVPR 2020)`: https://arxiv.org/abs/1911.07524
+ """
+
+ def __init__(self,
+ input_size: Tuple[int, int],
+ shift_factor: float = 0.2,
+ shift_prob: float = 1.,
+ scale_factor: Tuple[float, float] = (0.75, 1.5),
+ scale_prob: float = 1.,
+ scale_type: str = 'short',
+ rotate_factor: float = 30.,
+ rotate_prob: float = 1,
+ use_udp: bool = False) -> None:
+ super().__init__()
+
+ self.input_size = input_size
+ self.shift_factor = shift_factor
+ self.shift_prob = shift_prob
+ self.scale_factor = scale_factor
+ self.scale_prob = scale_prob
+ self.scale_type = scale_type
+ self.rotate_factor = rotate_factor
+ self.rotate_prob = rotate_prob
+ self.use_udp = use_udp
+
+ @staticmethod
+ def _truncnorm(low: float = -1.,
+ high: float = 1.,
+ size: tuple = ()) -> np.ndarray:
+ """Sample from a truncated normal distribution."""
+ return truncnorm.rvs(low, high, size=size).astype(np.float32)
+
+ def _fix_aspect_ratio(self, scale: np.ndarray, aspect_ratio: float):
+ """Extend the scale to match the given aspect ratio.
+
+ Args:
+ scale (np.ndarray): The image scale (w, h) in shape (2, )
+ aspect_ratio (float): The ratio of ``w/h``
+
+ Returns:
+ np.ndarray: The reshaped image scale in (2, )
+ """
+ w, h = scale
+ if w > h * aspect_ratio:
+ if self.scale_type == 'long':
+ _w, _h = w, w / aspect_ratio
+ elif self.scale_type == 'short':
+ _w, _h = h * aspect_ratio, h
+ else:
+ raise ValueError(f'Unknown scale type: {self.scale_type}')
+ else:
+ if self.scale_type == 'short':
+ _w, _h = w, w / aspect_ratio
+ elif self.scale_type == 'long':
+ _w, _h = h * aspect_ratio, h
+ else:
+ raise ValueError(f'Unknown scale type: {self.scale_type}')
+ return np.array([_w, _h], dtype=scale.dtype)
+
+ @cache_randomness
+ def _get_transform_params(self) -> Tuple:
+ """Get random transform parameters.
+
+ Returns:
+ tuple:
+ - offset (np.ndarray): Image offset rate in shape (2, )
+ - scale (np.ndarray): Image scaling rate factor in shape (1, )
+ - rotate (np.ndarray): Image rotation degree in shape (1, )
+ """
+ # get offset
+ if np.random.rand() < self.shift_prob:
+ offset = self._truncnorm(size=(2, )) * self.shift_factor
+ else:
+ offset = np.zeros((2, ), dtype=np.float32)
+
+ # get scale
+ if np.random.rand() < self.scale_prob:
+ scale_min, scale_max = self.scale_factor
+ scale = scale_min + (scale_max - scale_min) * (
+ self._truncnorm(size=(1, )) + 1) / 2
+ else:
+ scale = np.ones(1, dtype=np.float32)
+
+ # get rotation
+ if np.random.rand() < self.rotate_prob:
+ rotate = self._truncnorm() * self.rotate_factor
+ else:
+ rotate = 0
+
+ return offset, scale, rotate
+
+ def transform(self, results: Dict) -> Optional[dict]:
+ """The transform function of :class:`BottomupRandomAffine` to perform
+ photometric distortion on images.
+
+ See ``transform()`` method of :class:`BaseTransform` for details.
+
+
+ Args:
+ results (dict): Result dict from the data pipeline.
+
+ Returns:
+ dict: Result dict with images distorted.
+ """
+
+ img_h, img_w = results['img_shape']
+ w, h = self.input_size
+
+ offset_rate, scale_rate, rotate = self._get_transform_params()
+ offset = offset_rate * [img_w, img_h]
+ scale = scale_rate * [img_w, img_h]
+ # adjust the scale to match the target aspect ratio
+ scale = self._fix_aspect_ratio(scale, aspect_ratio=w / h)
+
+ if self.use_udp:
+ center = np.array([(img_w - 1.0) / 2, (img_h - 1.0) / 2],
+ dtype=np.float32)
+ warp_mat = get_udp_warp_matrix(
+ center=center + offset,
+ scale=scale,
+ rot=rotate,
+ output_size=(w, h))
+ else:
+ center = np.array([img_w / 2, img_h / 2], dtype=np.float32)
+ warp_mat = get_warp_matrix(
+ center=center + offset,
+ scale=scale,
+ rot=rotate,
+ output_size=(w, h))
+
+ # warp image and keypoints
+ results['img'] = cv2.warpAffine(
+ results['img'], warp_mat, (int(w), int(h)), flags=cv2.INTER_LINEAR)
+
+ if 'keypoints' in results:
+ # Only transform (x, y) coordinates
+ results['keypoints'][..., :2] = cv2.transform(
+ results['keypoints'][..., :2], warp_mat)
+
+ if 'bbox' in results:
+ bbox = np.tile(results['bbox'], 2).reshape(-1, 4, 2)
+ # corner order: left_top, left_bottom, right_top, right_bottom
+ bbox[:, 1:3, 0] = bbox[:, 0:2, 0]
+ results['bbox'] = cv2.transform(bbox, warp_mat).reshape(-1, 8)
+
+ results['input_size'] = self.input_size
+ results['warp_mat'] = warp_mat
+
+ return results
+
+
+@TRANSFORMS.register_module()
+class BottomupResize(BaseTransform):
+ """Resize the image to the input size of the model. Optionally, the image
+ can be resized to multiple sizes to build a image pyramid for multi-scale
+ inference.
+
+ Required Keys:
+
+ - img
+ - ori_shape
+
+ Modified Keys:
+
+ - img
+ - img_shape
+
+ Added Keys:
+
+ - input_size
+ - warp_mat
+ - aug_scale
+
+ Args:
+ input_size (Tuple[int, int]): The input size of the model in [w, h].
+ Note that the actually size of the resized image will be affected
+ by ``resize_mode`` and ``size_factor``, thus may not exactly equals
+ to the ``input_size``
+ aug_scales (List[float], optional): The extra input scales for
+ multi-scale testing. If given, the input image will be resized
+ to different scales to build a image pyramid. And heatmaps from
+ all scales will be aggregated to make final prediction. Defaults
+ to ``None``
+ size_factor (int): The actual input size will be ceiled to
+ a multiple of the `size_factor` value at both sides.
+ Defaults to 16
+ resize_mode (str): The method to resize the image to the input size.
+ Options are:
+
+ - ``'fit'``: The image will be resized according to the
+ relatively longer side with the aspect ratio kept. The
+ resized image will entirely fits into the range of the
+ input size
+ - ``'expand'``: The image will be resized according to the
+ relatively shorter side with the aspect ratio kept. The
+ resized image will exceed the given input size at the
+ longer side
+ use_udp (bool): Whether use unbiased data processing. See
+ `UDP (CVPR 2020)`_ for details. Defaults to ``False``
+
+ .. _`UDP (CVPR 2020)`: https://arxiv.org/abs/1911.07524
+ """
+
+ def __init__(self,
+ input_size: Tuple[int, int],
+ aug_scales: Optional[List[float]] = None,
+ size_factor: int = 32,
+ resize_mode: str = 'fit',
+ use_udp: bool = False):
+ super().__init__()
+
+ self.input_size = input_size
+ self.aug_scales = aug_scales
+ self.resize_mode = resize_mode
+ self.size_factor = size_factor
+ self.use_udp = use_udp
+
+ @staticmethod
+ def _ceil_to_multiple(size: Tuple[int, int], base: int):
+ """Ceil the given size (tuple of [w, h]) to a multiple of the base."""
+ return tuple(int(np.ceil(s / base) * base) for s in size)
+
+ def _get_input_size(self, img_size: Tuple[int, int],
+ input_size: Tuple[int, int]) -> Tuple:
+ """Calculate the actual input size (which the original image will be
+ resized to) and the padded input size (which the resized image will be
+ padded to, or which is the size of the model input).
+
+ Args:
+ img_size (Tuple[int, int]): The original image size in [w, h]
+ input_size (Tuple[int, int]): The expected input size in [w, h]
+
+ Returns:
+ tuple:
+ - actual_input_size (Tuple[int, int]): The target size to resize
+ the image
+ - padded_input_size (Tuple[int, int]): The target size to generate
+ the model input which will contain the resized image
+ """
+ img_w, img_h = img_size
+ ratio = img_w / img_h
+
+ if self.resize_mode == 'fit':
+ padded_input_size = self._ceil_to_multiple(input_size,
+ self.size_factor)
+ if padded_input_size != input_size:
+ raise ValueError(
+ 'When ``resize_mode==\'fit\', the input size (height and'
+ ' width) should be mulitples of the size_factor('
+ f'{self.size_factor}) at all scales. Got invalid input '
+ f'size {input_size}.')
+
+ pad_w, pad_h = padded_input_size
+ rsz_w = min(pad_w, pad_h * ratio)
+ rsz_h = min(pad_h, pad_w / ratio)
+ actual_input_size = (rsz_w, rsz_h)
+
+ elif self.resize_mode == 'expand':
+ _padded_input_size = self._ceil_to_multiple(
+ input_size, self.size_factor)
+ pad_w, pad_h = _padded_input_size
+ rsz_w = max(pad_w, pad_h * ratio)
+ rsz_h = max(pad_h, pad_w / ratio)
+
+ actual_input_size = (rsz_w, rsz_h)
+ padded_input_size = self._ceil_to_multiple(actual_input_size,
+ self.size_factor)
+
+ else:
+ raise ValueError(f'Invalid resize mode {self.resize_mode}')
+
+ return actual_input_size, padded_input_size
+
+ def transform(self, results: Dict) -> Optional[dict]:
+ """The transform function of :class:`BottomupResize` to perform
+ photometric distortion on images.
+
+ See ``transform()`` method of :class:`BaseTransform` for details.
+
+
+ Args:
+ results (dict): Result dict from the data pipeline.
+
+ Returns:
+ dict: Result dict with images distorted.
+ """
+
+ img = results['img']
+ img_h, img_w = results['ori_shape']
+ w, h = self.input_size
+
+ input_sizes = [(w, h)]
+ if self.aug_scales:
+ input_sizes += [(int(w * s), int(h * s)) for s in self.aug_scales]
+
+ imgs = []
+ for i, (_w, _h) in enumerate(input_sizes):
+
+ actual_input_size, padded_input_size = self._get_input_size(
+ img_size=(img_w, img_h), input_size=(_w, _h))
+
+ if self.use_udp:
+ center = np.array([(img_w - 1.0) / 2, (img_h - 1.0) / 2],
+ dtype=np.float32)
+ scale = np.array([img_w, img_h], dtype=np.float32)
+ warp_mat = get_udp_warp_matrix(
+ center=center,
+ scale=scale,
+ rot=0,
+ output_size=actual_input_size)
+ else:
+ center = np.array([img_w / 2, img_h / 2], dtype=np.float32)
+ scale = np.array([
+ img_w * padded_input_size[0] / actual_input_size[0],
+ img_h * padded_input_size[1] / actual_input_size[1]
+ ],
+ dtype=np.float32)
+ warp_mat = get_warp_matrix(
+ center=center,
+ scale=scale,
+ rot=0,
+ output_size=padded_input_size)
+
+ _img = cv2.warpAffine(
+ img, warp_mat, padded_input_size, flags=cv2.INTER_LINEAR)
+
+ imgs.append(_img)
+
+ # Store the transform information w.r.t. the main input size
+ if i == 0:
+ results['img_shape'] = padded_input_size[::-1]
+ results['input_center'] = center
+ results['input_scale'] = scale
+ results['input_size'] = padded_input_size
+
+ if self.aug_scales:
+ results['img'] = imgs
+ results['aug_scales'] = self.aug_scales
+ else:
+ results['img'] = imgs[0]
+ results['aug_scale'] = None
+
+ return results
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/common_transforms.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/common_transforms.py
new file mode 100644
index 0000000000000000000000000000000000000000..fbfb4c263111e564e02cd5eaa73f6222e0dbd24c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/common_transforms.py
@@ -0,0 +1,1060 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import warnings
+from copy import deepcopy
+from typing import Dict, List, Optional, Sequence, Tuple, Union
+
+import mmcv
+import mmengine
+import numpy as np
+from mmcv.image import imflip
+from mmcv.transforms import BaseTransform
+from mmcv.transforms.utils import avoid_cache_randomness, cache_randomness
+from mmengine import is_list_of
+from mmengine.dist import get_dist_info
+from scipy.stats import truncnorm
+
+from mmpose.codecs import * # noqa: F401, F403
+from mmpose.registry import KEYPOINT_CODECS, TRANSFORMS
+from mmpose.structures.bbox import bbox_xyxy2cs, flip_bbox
+from mmpose.structures.keypoint import flip_keypoints
+from mmpose.utils.typing import MultiConfig
+
+try:
+ import albumentations
+except ImportError:
+ albumentations = None
+
+Number = Union[int, float]
+
+@TRANSFORMS.register_module()
+class GetBBoxCenterScale(BaseTransform):
+ """Convert bboxes from [x, y, w, h] to center and scale.
+
+ The center is the coordinates of the bbox center, and the scale is the
+ bbox width and height normalized by a scale factor.
+
+ Required Keys:
+
+ - bbox
+
+ Added Keys:
+
+ - bbox_center
+ - bbox_scale
+
+ Args:
+ padding (float): The bbox padding scale that will be multilied to
+ `bbox_scale`. Defaults to 1.25
+ """
+
+ def __init__(self, padding: float = 1.25) -> None:
+ super().__init__()
+
+ self.padding = padding
+
+ def transform(self, results: Dict) -> Optional[dict]:
+ """The transform function of :class:`GetBBoxCenterScale`.
+
+ See ``transform()`` method of :class:`BaseTransform` for details.
+
+ Args:
+ results (dict): The result dict
+
+ Returns:
+ dict: The result dict.
+ """
+ if 'bbox_center' in results and 'bbox_scale' in results:
+ rank, _ = get_dist_info()
+ if rank == 0:
+ warnings.warn('Use the existing "bbox_center" and "bbox_scale"'
+ '. The padding will still be applied.')
+ results['bbox_scale'] *= self.padding
+
+ else:
+ bbox = results['bbox']
+ center, scale = bbox_xyxy2cs(bbox, padding=self.padding)
+
+ results['bbox_center'] = center
+ results['bbox_scale'] = scale
+
+ return results
+
+ def __repr__(self) -> str:
+ """print the basic information of the transform.
+
+ Returns:
+ str: Formatted string.
+ """
+ repr_str = self.__class__.__name__ + f'(padding={self.padding})'
+ return repr_str
+
+
+@TRANSFORMS.register_module()
+class RandomFlip(BaseTransform):
+ """Randomly flip the image, bbox and keypoints.
+
+ Required Keys:
+
+ - img
+ - img_shape
+ - flip_indices
+ - input_size (optional)
+ - bbox (optional)
+ - bbox_center (optional)
+ - keypoints (optional)
+ - keypoints_visible (optional)
+ - img_mask (optional)
+
+ Modified Keys:
+
+ - img
+ - bbox (optional)
+ - bbox_center (optional)
+ - keypoints (optional)
+ - keypoints_visible (optional)
+ - img_mask (optional)
+
+ Added Keys:
+
+ - flip
+ - flip_direction
+
+ Args:
+ prob (float | list[float]): The flipping probability. If a list is
+ given, the argument `direction` should be a list with the same
+ length. And each element in `prob` indicates the flipping
+ probability of the corresponding one in ``direction``. Defaults
+ to 0.5
+ direction (str | list[str]): The flipping direction. Options are
+ ``'horizontal'``, ``'vertical'`` and ``'diagonal'``. If a list is
+ is given, each data sample's flipping direction will be sampled
+ from a distribution determined by the argument ``prob``. Defaults
+ to ``'horizontal'``.
+ """
+
+ def __init__(self,
+ prob: Union[float, List[float]] = 0.5,
+ direction: Union[str, List[str]] = 'horizontal') -> None:
+ if isinstance(prob, list):
+ assert is_list_of(prob, float)
+ assert 0 <= sum(prob) <= 1
+ elif isinstance(prob, float):
+ assert 0 <= prob <= 1
+ else:
+ raise ValueError(f'probs must be float or list of float, but \
+ got `{type(prob)}`.')
+ self.prob = prob
+
+ valid_directions = ['horizontal', 'vertical', 'diagonal']
+ if isinstance(direction, str):
+ assert direction in valid_directions
+ elif isinstance(direction, list):
+ assert is_list_of(direction, str)
+ assert set(direction).issubset(set(valid_directions))
+ else:
+ raise ValueError(f'direction must be either str or list of str, \
+ but got `{type(direction)}`.')
+ self.direction = direction
+
+ if isinstance(prob, list):
+ assert len(prob) == len(self.direction)
+
+ @cache_randomness
+ def _choose_direction(self) -> str:
+ """Choose the flip direction according to `prob` and `direction`"""
+ if isinstance(self.direction,
+ List) and not isinstance(self.direction, str):
+ # None means non-flip
+ direction_list: list = list(self.direction) + [None]
+ elif isinstance(self.direction, str):
+ # None means non-flip
+ direction_list = [self.direction, None]
+
+ if isinstance(self.prob, list):
+ non_prob: float = 1 - sum(self.prob)
+ prob_list = self.prob + [non_prob]
+ elif isinstance(self.prob, float):
+ non_prob = 1. - self.prob
+ # exclude non-flip
+ single_ratio = self.prob / (len(direction_list) - 1)
+ prob_list = [single_ratio] * (len(direction_list) - 1) + [non_prob]
+
+ cur_dir = np.random.choice(direction_list, p=prob_list)
+
+ return cur_dir
+
+ def transform(self, results: dict) -> dict:
+ """The transform function of :class:`RandomFlip`.
+
+ See ``transform()`` method of :class:`BaseTransform` for details.
+
+ Args:
+ results (dict): The result dict
+
+ Returns:
+ dict: The result dict.
+ """
+
+ flip_dir = self._choose_direction()
+
+ if flip_dir is None:
+ results['flip'] = False
+ results['flip_direction'] = None
+ else:
+ results['flip'] = True
+ results['flip_direction'] = flip_dir
+
+ h, w = results.get('input_size', results['img_shape'])
+ # flip image and mask
+ if isinstance(results['img'], list):
+ results['img'] = [
+ imflip(img, direction=flip_dir) for img in results['img']
+ ]
+ else:
+ results['img'] = imflip(results['img'], direction=flip_dir)
+
+ if 'img_mask' in results:
+ results['img_mask'] = imflip(
+ results['img_mask'], direction=flip_dir)
+
+ # flip bboxes
+ if results.get('bbox', None) is not None:
+ results['bbox'] = flip_bbox(
+ results['bbox'],
+ image_size=(w, h),
+ bbox_format='xyxy',
+ direction=flip_dir)
+
+ if results.get('bbox_center', None) is not None:
+ results['bbox_center'] = flip_bbox(
+ results['bbox_center'],
+ image_size=(w, h),
+ bbox_format='center',
+ direction=flip_dir)
+
+ # flip keypoints
+ if results.get('keypoints', None) is not None:
+ keypoints, keypoints_visible = flip_keypoints(
+ results['keypoints'],
+ results.get('keypoints_visible', None),
+ image_size=(w, h),
+ flip_indices=results['flip_indices'],
+ direction=flip_dir)
+
+ results['keypoints'] = keypoints
+ results['keypoints_visible'] = keypoints_visible
+
+ return results
+
+ def __repr__(self) -> str:
+ """print the basic information of the transform.
+
+ Returns:
+ str: Formatted string.
+ """
+ repr_str = self.__class__.__name__
+ repr_str += f'(prob={self.prob}, '
+ repr_str += f'direction={self.direction})'
+ return repr_str
+
+
+@TRANSFORMS.register_module()
+class RandomHalfBody(BaseTransform):
+ """Data augmentation with half-body transform that keeps only the upper or
+ lower body at random.
+
+ Required Keys:
+
+ - keypoints
+ - keypoints_visible
+ - upper_body_ids
+ - lower_body_ids
+
+ Modified Keys:
+
+ - bbox
+ - bbox_center
+ - bbox_scale
+
+ Args:
+ min_total_keypoints (int): The minimum required number of total valid
+ keypoints of a person to apply half-body transform. Defaults to 8
+ min_half_keypoints (int): The minimum required number of valid
+ half-body keypoints of a person to apply half-body transform.
+ Defaults to 2
+ padding (float): The bbox padding scale that will be multilied to
+ `bbox_scale`. Defaults to 1.5
+ prob (float): The probability to apply half-body transform when the
+ keypoint number meets the requirement. Defaults to 0.3
+ """
+
+ def __init__(self,
+ min_total_keypoints: int = 9,
+ min_upper_keypoints: int = 2,
+ min_lower_keypoints: int = 3,
+ padding: float = 1.5,
+ prob: float = 0.3,
+ upper_prioritized_prob: float = 0.7) -> None:
+ super().__init__()
+ self.min_total_keypoints = min_total_keypoints
+ self.min_upper_keypoints = min_upper_keypoints
+ self.min_lower_keypoints = min_lower_keypoints
+ self.padding = padding
+ self.prob = prob
+ self.upper_prioritized_prob = upper_prioritized_prob
+
+ def _get_half_body_bbox(self, keypoints: np.ndarray,
+ half_body_ids: List[int]
+ ) -> Tuple[np.ndarray, np.ndarray]:
+ """Get half-body bbox center and scale of a single instance.
+
+ Args:
+ keypoints (np.ndarray): Keypoints in shape (K, D)
+ upper_body_ids (list): The list of half-body keypont indices
+
+ Returns:
+ tuple: A tuple containing half-body bbox center and scale
+ - center: Center (x, y) of the bbox
+ - scale: Scale (w, h) of the bbox
+ """
+
+ selected_keypoints = keypoints[half_body_ids]
+ center = selected_keypoints.mean(axis=0)[:2]
+
+ x1, y1 = selected_keypoints.min(axis=0)
+ x2, y2 = selected_keypoints.max(axis=0)
+ w = x2 - x1
+ h = y2 - y1
+ scale = np.array([w, h], dtype=center.dtype) * self.padding
+
+ return center, scale
+
+ @cache_randomness
+ def _random_select_half_body(self, keypoints_visible: np.ndarray,
+ upper_body_ids: List[int],
+ lower_body_ids: List[int]
+ ) -> List[Optional[List[int]]]:
+ """Randomly determine whether applying half-body transform and get the
+ half-body keyponit indices of each instances.
+
+ Args:
+ keypoints_visible (np.ndarray, optional): The visibility of
+ keypoints in shape (N, K, 1).
+ upper_body_ids (list): The list of upper body keypoint indices
+ lower_body_ids (list): The list of lower body keypoint indices
+
+ Returns:
+ list[list[int] | None]: The selected half-body keypoint indices
+ of each instance. ``None`` means not applying half-body transform.
+ """
+
+ half_body_ids = []
+
+ for visible in keypoints_visible:
+ if visible.sum() < self.min_total_keypoints:
+ indices = None
+ elif np.random.rand() > self.prob:
+ indices = None
+ else:
+ upper_valid_ids = [i for i in upper_body_ids if visible[i] > 0]
+ lower_valid_ids = [i for i in lower_body_ids if visible[i] > 0]
+
+ num_upper = len(upper_valid_ids)
+ num_lower = len(lower_valid_ids)
+
+ prefer_upper = np.random.rand() < self.upper_prioritized_prob
+ if (num_upper < self.min_upper_keypoints
+ and num_lower < self.min_lower_keypoints):
+ indices = None
+ elif num_lower < self.min_lower_keypoints:
+ indices = upper_valid_ids
+ elif num_upper < self.min_upper_keypoints:
+ indices = lower_valid_ids
+ else:
+ indices = (
+ upper_valid_ids if prefer_upper else lower_valid_ids)
+
+ half_body_ids.append(indices)
+
+ return half_body_ids
+
+ def transform(self, results: Dict) -> Optional[dict]:
+ """The transform function of :class:`HalfBodyTransform`.
+
+ See ``transform()`` method of :class:`BaseTransform` for details.
+
+ Args:
+ results (dict): The result dict
+
+ Returns:
+ dict: The result dict.
+ """
+
+ half_body_ids = self._random_select_half_body(
+ keypoints_visible=results['keypoints_visible'],
+ upper_body_ids=results['upper_body_ids'],
+ lower_body_ids=results['lower_body_ids'])
+
+ bbox_center = []
+ bbox_scale = []
+
+ for i, indices in enumerate(half_body_ids):
+ if indices is None:
+ bbox_center.append(results['bbox_center'][i])
+ bbox_scale.append(results['bbox_scale'][i])
+ else:
+ _center, _scale = self._get_half_body_bbox(
+ results['keypoints'][i], indices)
+ bbox_center.append(_center)
+ bbox_scale.append(_scale)
+
+ results['bbox_center'] = np.stack(bbox_center)
+ results['bbox_scale'] = np.stack(bbox_scale)
+ return results
+
+ def __repr__(self) -> str:
+ """print the basic information of the transform.
+
+ Returns:
+ str: Formatted string.
+ """
+ repr_str = self.__class__.__name__
+ repr_str += f'(min_total_keypoints={self.min_total_keypoints}, '
+ repr_str += f'min_upper_keypoints={self.min_upper_keypoints}, '
+ repr_str += f'min_lower_keypoints={self.min_lower_keypoints}, '
+ repr_str += f'padding={self.padding}, '
+ repr_str += f'prob={self.prob}, '
+ repr_str += f'upper_prioritized_prob={self.upper_prioritized_prob})'
+ return repr_str
+
+
+@TRANSFORMS.register_module()
+class RandomBBoxTransform(BaseTransform):
+ r"""Rnadomly shift, resize and rotate the bounding boxes.
+
+ Required Keys:
+
+ - bbox_center
+ - bbox_scale
+
+ Modified Keys:
+
+ - bbox_center
+ - bbox_scale
+
+ Added Keys:
+ - bbox_rotation
+
+ Args:
+ shift_factor (float): Randomly shift the bbox in range
+ :math:`[-dx, dx]` and :math:`[-dy, dy]` in X and Y directions,
+ where :math:`dx(y) = x(y)_scale \cdot shift_factor` in pixels.
+ Defaults to 0.16
+ shift_prob (float): Probability of applying random shift. Defaults to
+ 0.3
+ scale_factor (Tuple[float, float]): Randomly resize the bbox in range
+ :math:`[scale_factor[0], scale_factor[1]]`. Defaults to (0.5, 1.5)
+ scale_prob (float): Probability of applying random resizing. Defaults
+ to 1.0
+ rotate_factor (float): Randomly rotate the bbox in
+ :math:`[-rotate_factor, rotate_factor]` in degrees. Defaults
+ to 80.0
+ rotate_prob (float): Probability of applying random rotation. Defaults
+ to 0.6
+ """
+
+ def __init__(self,
+ shift_factor: float = 0.16,
+ shift_prob: float = 0.3,
+ scale_factor: Tuple[float, float] = (0.5, 1.5),
+ scale_prob: float = 1.0,
+ rotate_factor: float = 80.0,
+ rotate_prob: float = 0.6) -> None:
+ super().__init__()
+
+ self.shift_factor = shift_factor
+ self.shift_prob = shift_prob
+ self.scale_factor = scale_factor
+ self.scale_prob = scale_prob
+ self.rotate_factor = rotate_factor
+ self.rotate_prob = rotate_prob
+
+ @staticmethod
+ def _truncnorm(low: float = -1.,
+ high: float = 1.,
+ size: tuple = ()) -> np.ndarray:
+ """Sample from a truncated normal distribution."""
+ return truncnorm.rvs(low, high, size=size).astype(np.float32)
+
+ @cache_randomness
+ def _get_transform_params(self, num_bboxes: int) -> Tuple:
+ """Get random transform parameters.
+
+ Args:
+ num_bboxes (int): The number of bboxes
+
+ Returns:
+ tuple:
+ - offset (np.ndarray): Offset factor of each bbox in shape (n, 2)
+ - scale (np.ndarray): Scaling factor of each bbox in shape (n, 1)
+ - rotate (np.ndarray): Rotation degree of each bbox in shape (n,)
+ """
+ # Get shift parameters
+ offset = self._truncnorm(size=(num_bboxes, 2)) * self.shift_factor
+ offset = np.where(
+ np.random.rand(num_bboxes, 1) < self.shift_prob, offset, 0.)
+
+ # Get scaling parameters
+ scale_min, scale_max = self.scale_factor
+ mu = (scale_max + scale_min) * 0.5
+ sigma = (scale_max - scale_min) * 0.5
+ scale = self._truncnorm(size=(num_bboxes, 1)) * sigma + mu
+ scale = np.where(
+ np.random.rand(num_bboxes, 1) < self.scale_prob, scale, 1.)
+
+ # Get rotation parameters
+ rotate = self._truncnorm(size=(num_bboxes, )) * self.rotate_factor
+ rotate = np.where(
+ np.random.rand(num_bboxes) < self.rotate_prob, rotate, 0.)
+
+ return offset, scale, rotate
+
+ def transform(self, results: Dict) -> Optional[dict]:
+ """The transform function of :class:`RandomBboxTransform`.
+
+ See ``transform()`` method of :class:`BaseTransform` for details.
+
+ Args:
+ results (dict): The result dict
+
+ Returns:
+ dict: The result dict.
+ """
+ bbox_scale = results['bbox_scale']
+ num_bboxes = bbox_scale.shape[0]
+
+ offset, scale, rotate = self._get_transform_params(num_bboxes)
+
+ results['bbox_center'] += offset * bbox_scale
+ results['bbox_scale'] *= scale
+ results['bbox_rotation'] = rotate
+
+ return results
+
+ def __repr__(self) -> str:
+ """print the basic information of the transform.
+
+ Returns:
+ str: Formatted string.
+ """
+ repr_str = self.__class__.__name__
+ repr_str += f'(shift_prob={self.shift_prob}, '
+ repr_str += f'shift_factor={self.shift_factor}, '
+ repr_str += f'scale_prob={self.scale_prob}, '
+ repr_str += f'scale_factor={self.scale_factor}, '
+ repr_str += f'rotate_prob={self.rotate_prob}, '
+ repr_str += f'rotate_factor={self.rotate_factor})'
+ return repr_str
+
+
+@TRANSFORMS.register_module()
+@avoid_cache_randomness
+class Albumentation(BaseTransform):
+ """Albumentation augmentation (pixel-level transforms only).
+
+ Adds custom pixel-level transformations from Albumentations library.
+ Please visit `https://albumentations.ai/docs/`
+ to get more information.
+
+ Note: we only support pixel-level transforms.
+ Please visit `https://github.com/albumentations-team/`
+ `albumentations#pixel-level-transforms`
+ to get more information about pixel-level transforms.
+
+ Required Keys:
+
+ - img
+
+ Modified Keys:
+
+ - img
+
+ Args:
+ transforms (List[dict]): A list of Albumentation transforms.
+ An example of ``transforms`` is as followed:
+ .. code-block:: python
+
+ [
+ dict(
+ type='RandomBrightnessContrast',
+ brightness_limit=[0.1, 0.3],
+ contrast_limit=[0.1, 0.3],
+ p=0.2),
+ dict(type='ChannelShuffle', p=0.1),
+ dict(
+ type='OneOf',
+ transforms=[
+ dict(type='Blur', blur_limit=3, p=1.0),
+ dict(type='MedianBlur', blur_limit=3, p=1.0)
+ ],
+ p=0.1),
+ ]
+ keymap (dict | None): key mapping from ``input key`` to
+ ``albumentation-style key``.
+ Defaults to None, which will use {'img': 'image'}.
+ """
+
+ def __init__(self,
+ transforms: List[dict],
+ keymap: Optional[dict] = None) -> None:
+ if albumentations is None:
+ raise RuntimeError('albumentations is not installed')
+
+ self.transforms = transforms
+
+ self.aug = albumentations.Compose(
+ [self.albu_builder(t) for t in self.transforms])
+
+ if not keymap:
+ self.keymap_to_albu = {
+ 'img': 'image',
+ }
+ else:
+ self.keymap_to_albu = keymap
+
+ def albu_builder(self, cfg: dict) -> albumentations:
+ """Import a module from albumentations.
+
+ It resembles some of :func:`build_from_cfg` logic.
+
+ Args:
+ cfg (dict): Config dict. It should at least contain the key "type".
+
+ Returns:
+ albumentations.BasicTransform: The constructed transform object
+ """
+
+ assert isinstance(cfg, dict) and 'type' in cfg
+ args = cfg.copy()
+
+ obj_type = args.pop('type')
+ if mmengine.is_str(obj_type):
+ if albumentations is None:
+ raise RuntimeError('albumentations is not installed')
+ rank, _ = get_dist_info()
+ if rank == 0 and not hasattr(
+ albumentations.augmentations.transforms, obj_type):
+ warnings.warn(
+ f'{obj_type} is not pixel-level transformations. '
+ 'Please use with caution.')
+ obj_cls = getattr(albumentations, obj_type)
+ elif isinstance(obj_type, type):
+ obj_cls = obj_type
+ else:
+ raise TypeError(f'type must be a str, but got {type(obj_type)}')
+
+ if 'transforms' in args:
+ args['transforms'] = [
+ self.albu_builder(transform)
+ for transform in args['transforms']
+ ]
+
+ return obj_cls(**args)
+
+ def transform(self, results: dict) -> dict:
+ """The transform function of :class:`Albumentation` to apply
+ albumentations transforms.
+
+ See ``transform()`` method of :class:`BaseTransform` for details.
+
+ Args:
+ results (dict): Result dict from the data pipeline.
+
+ Return:
+ dict: updated result dict.
+ """
+ # map result dict to albumentations format
+ results_albu = {}
+ for k, v in self.keymap_to_albu.items():
+ assert k in results, \
+ f'The `{k}` is required to perform albumentations transforms'
+ results_albu[v] = results[k]
+
+ # Apply albumentations transforms
+ results_albu = self.aug(**results_albu)
+
+ # map the albu results back to the original format
+ for k, v in self.keymap_to_albu.items():
+ results[k] = results_albu[v]
+
+ return results
+
+ def __repr__(self) -> str:
+ """print the basic information of the transform.
+
+ Returns:
+ str: Formatted string.
+ """
+ repr_str = self.__class__.__name__ + f'(transforms={self.transforms})'
+ return repr_str
+
+
+@TRANSFORMS.register_module()
+class PhotometricDistortion(BaseTransform):
+ """Apply photometric distortion to image sequentially, every transformation
+ is applied with a probability of 0.5. The position of random contrast is in
+ second or second to last.
+
+ 1. random brightness
+ 2. random contrast (mode 0)
+ 3. convert color from BGR to HSV
+ 4. random saturation
+ 5. random hue
+ 6. convert color from HSV to BGR
+ 7. random contrast (mode 1)
+ 8. randomly swap channels
+
+ Required Keys:
+
+ - img
+
+ Modified Keys:
+
+ - img
+
+ Args:
+ brightness_delta (int): delta of brightness.
+ contrast_range (tuple): range of contrast.
+ saturation_range (tuple): range of saturation.
+ hue_delta (int): delta of hue.
+ """
+
+ def __init__(self,
+ brightness_delta: int = 32,
+ contrast_range: Sequence[Number] = (0.5, 1.5),
+ saturation_range: Sequence[Number] = (0.5, 1.5),
+ hue_delta: int = 18) -> None:
+ self.brightness_delta = brightness_delta
+ self.contrast_lower, self.contrast_upper = contrast_range
+ self.saturation_lower, self.saturation_upper = saturation_range
+ self.hue_delta = hue_delta
+
+ @cache_randomness
+ def _random_flags(self) -> Sequence[Number]:
+ """Generate the random flags for subsequent transforms.
+
+ Returns:
+ Sequence[Number]: a sequence of numbers that indicate whether to
+ do the corresponding transforms.
+ """
+ # contrast_mode == 0 --> do random contrast first
+ # contrast_mode == 1 --> do random contrast last
+ contrast_mode = np.random.randint(2)
+ # whether to apply brightness distortion
+ brightness_flag = np.random.randint(2)
+ # whether to apply contrast distortion
+ contrast_flag = np.random.randint(2)
+ # the mode to convert color from BGR to HSV
+ hsv_mode = np.random.randint(4)
+ # whether to apply channel swap
+ swap_flag = np.random.randint(2)
+
+ # the beta in `self._convert` to be added to image array
+ # in brightness distortion
+ brightness_beta = np.random.uniform(-self.brightness_delta,
+ self.brightness_delta)
+ # the alpha in `self._convert` to be multiplied to image array
+ # in contrast distortion
+ contrast_alpha = np.random.uniform(self.contrast_lower,
+ self.contrast_upper)
+ # the alpha in `self._convert` to be multiplied to image array
+ # in saturation distortion to hsv-formatted img
+ saturation_alpha = np.random.uniform(self.saturation_lower,
+ self.saturation_upper)
+ # delta of hue to add to image array in hue distortion
+ hue_delta = np.random.randint(-self.hue_delta, self.hue_delta)
+ # the random permutation of channel order
+ swap_channel_order = np.random.permutation(3)
+
+ return (contrast_mode, brightness_flag, contrast_flag, hsv_mode,
+ swap_flag, brightness_beta, contrast_alpha, saturation_alpha,
+ hue_delta, swap_channel_order)
+
+ def _convert(self,
+ img: np.ndarray,
+ alpha: float = 1,
+ beta: float = 0) -> np.ndarray:
+ """Multiple with alpha and add beta with clip.
+
+ Args:
+ img (np.ndarray): The image array.
+ alpha (float): The random multiplier.
+ beta (float): The random offset.
+
+ Returns:
+ np.ndarray: The updated image array.
+ """
+ img = img.astype(np.float32) * alpha + beta
+ img = np.clip(img, 0, 255)
+ return img.astype(np.uint8)
+
+ def transform(self, results: dict) -> dict:
+ """The transform function of :class:`PhotometricDistortion` to perform
+ photometric distortion on images.
+
+ See ``transform()`` method of :class:`BaseTransform` for details.
+
+
+ Args:
+ results (dict): Result dict from the data pipeline.
+
+ Returns:
+ dict: Result dict with images distorted.
+ """
+
+ assert 'img' in results, '`img` is not found in results'
+ img = results['img']
+
+ (contrast_mode, brightness_flag, contrast_flag, hsv_mode, swap_flag,
+ brightness_beta, contrast_alpha, saturation_alpha, hue_delta,
+ swap_channel_order) = self._random_flags()
+
+ # random brightness distortion
+ if brightness_flag:
+ img = self._convert(img, beta=brightness_beta)
+
+ # contrast_mode == 0 --> do random contrast first
+ # contrast_mode == 1 --> do random contrast last
+ if contrast_mode == 1:
+ if contrast_flag:
+ img = self._convert(img, alpha=contrast_alpha)
+
+ if hsv_mode:
+ # random saturation/hue distortion
+ img = mmcv.bgr2hsv(img)
+ if hsv_mode == 1 or hsv_mode == 3:
+ # apply saturation distortion to hsv-formatted img
+ img[:, :, 1] = self._convert(
+ img[:, :, 1], alpha=saturation_alpha)
+ if hsv_mode == 2 or hsv_mode == 3:
+ # apply hue distortion to hsv-formatted img
+ img[:, :, 0] = img[:, :, 0].astype(int) + hue_delta
+ img = mmcv.hsv2bgr(img)
+
+ if contrast_mode == 1:
+ if contrast_flag:
+ img = self._convert(img, alpha=contrast_alpha)
+
+ # randomly swap channels
+ if swap_flag:
+ img = img[..., swap_channel_order]
+
+ results['img'] = img
+ return results
+
+ def __repr__(self) -> str:
+ """print the basic information of the transform.
+
+ Returns:
+ str: Formatted string.
+ """
+ repr_str = self.__class__.__name__
+ repr_str += (f'(brightness_delta={self.brightness_delta}, '
+ f'contrast_range=({self.contrast_lower}, '
+ f'{self.contrast_upper}), '
+ f'saturation_range=({self.saturation_lower}, '
+ f'{self.saturation_upper}), '
+ f'hue_delta={self.hue_delta})')
+ return repr_str
+
+
+@TRANSFORMS.register_module()
+class GenerateTarget(BaseTransform):
+ """Encode keypoints into Target.
+
+ The generated target is usually the supervision signal of the model
+ learning, e.g. heatmaps or regression labels.
+
+ Required Keys:
+
+ - keypoints
+ - keypoints_visible
+ - dataset_keypoint_weights
+
+ Added Keys:
+
+ - The keys of the encoded items from the codec will be updated into
+ the results, e.g. ``'heatmaps'`` or ``'keypoint_weights'``. See
+ the specific codec for more details.
+
+ Args:
+ encoder (dict | list[dict]): The codec config for keypoint encoding.
+ Both single encoder and multiple encoders (given as a list) are
+ supported
+ multilevel (bool): Determine the method to handle multiple encoders.
+ If ``multilevel==True``, generate multilevel targets from a group
+ of encoders of the same type (e.g. multiple :class:`MSRAHeatmap`
+ encoders with different sigma values); If ``multilevel==False``,
+ generate combined targets from a group of different encoders. This
+ argument will have no effect in case of single encoder. Defaults
+ to ``False``
+ use_dataset_keypoint_weights (bool): Whether use the keypoint weights
+ from the dataset meta information. Defaults to ``False``
+ target_type (str, deprecated): This argument is deprecated and has no
+ effect. Defaults to ``None``
+ """
+
+ def __init__(self,
+ encoder: MultiConfig,
+ target_type: Optional[str] = None,
+ multilevel: bool = False,
+ use_dataset_keypoint_weights: bool = False) -> None:
+ super().__init__()
+
+ if target_type is not None:
+ rank, _ = get_dist_info()
+ if rank == 0:
+ warnings.warn(
+ 'The argument `target_type` is deprecated in'
+ ' GenerateTarget. The target type and encoded '
+ 'keys will be determined by encoder(s).',
+ DeprecationWarning)
+
+ self.encoder_cfg = deepcopy(encoder)
+ self.multilevel = multilevel
+ self.use_dataset_keypoint_weights = use_dataset_keypoint_weights
+
+ if isinstance(self.encoder_cfg, list):
+ self.encoder = [
+ KEYPOINT_CODECS.build(cfg) for cfg in self.encoder_cfg
+ ]
+ else:
+ assert not self.multilevel, (
+ 'Need multiple encoder configs if ``multilevel==True``')
+ self.encoder = KEYPOINT_CODECS.build(self.encoder_cfg)
+
+ def transform(self, results: Dict) -> Optional[dict]:
+ """The transform function of :class:`GenerateTarget`.
+
+ See ``transform()`` method of :class:`BaseTransform` for details.
+ """
+
+ if results.get('transformed_keypoints', None) is not None:
+ # use keypoints transformed by TopdownAffine
+ keypoints = results['transformed_keypoints']
+ elif results.get('keypoints', None) is not None:
+ # use original keypoints
+ keypoints = results['keypoints']
+ else:
+ raise ValueError(
+ 'GenerateTarget requires \'transformed_keypoints\' or'
+ ' \'keypoints\' in the results.')
+
+ keypoints_visible = results['keypoints_visible']
+
+ # Encoded items from the encoder(s) will be updated into the results.
+ # Please refer to the document of the specific codec for details about
+ # encoded items.
+ if not isinstance(self.encoder, list):
+ # For single encoding, the encoded items will be directly added
+ # into results.
+ auxiliary_encode_kwargs = {
+ key: results[key]
+ for key in self.encoder.auxiliary_encode_keys
+ }
+ encoded = self.encoder.encode(
+ keypoints=keypoints,
+ keypoints_visible=keypoints_visible,
+ **auxiliary_encode_kwargs)
+
+ else:
+ encoded_list = []
+ for _encoder in self.encoder:
+ auxiliary_encode_kwargs = {
+ key: results[key]
+ for key in _encoder.auxiliary_encode_keys
+ }
+ encoded_list.append(
+ _encoder.encode(
+ keypoints=keypoints,
+ keypoints_visible=keypoints_visible,
+ **auxiliary_encode_kwargs))
+
+ if self.multilevel:
+ # For multilevel encoding, the encoded items from each encoder
+ # should have the same keys.
+
+ keys = encoded_list[0].keys()
+ if not all(_encoded.keys() == keys
+ for _encoded in encoded_list):
+ raise ValueError(
+ 'Encoded items from all encoders must have the same '
+ 'keys if ``multilevel==True``.')
+
+ encoded = {
+ k: [_encoded[k] for _encoded in encoded_list]
+ for k in keys
+ }
+
+ else:
+ # For combined encoding, the encoded items from different
+ # encoders should have no overlapping items, except for
+ # `keypoint_weights`. If multiple `keypoint_weights` are given,
+ # they will be multiplied as the final `keypoint_weights`.
+
+ encoded = dict()
+ keypoint_weights = []
+
+ for _encoded in encoded_list:
+ for key, value in _encoded.items():
+ if key == 'keypoint_weights':
+ keypoint_weights.append(value)
+ elif key not in encoded:
+ encoded[key] = value
+ else:
+ raise ValueError(
+ f'Overlapping item "{key}" from multiple '
+ 'encoders, which is not supported when '
+ '``multilevel==False``')
+
+ if keypoint_weights:
+ encoded['keypoint_weights'] = keypoint_weights
+
+ if self.use_dataset_keypoint_weights and 'keypoint_weights' in encoded:
+ if isinstance(encoded['keypoint_weights'], list):
+ for w in encoded['keypoint_weights']:
+ w *= results['dataset_keypoint_weights']
+ else:
+ encoded['keypoint_weights'] *= results[
+ 'dataset_keypoint_weights']
+
+ results.update(encoded)
+
+ if results.get('keypoint_weights', None) is not None:
+ results['transformed_keypoints_visible'] = results[
+ 'keypoint_weights']
+ elif results.get('keypoints', None) is not None:
+ results['transformed_keypoints_visible'] = results[
+ 'keypoints_visible']
+ else:
+ raise ValueError('GenerateTarget requires \'keypoint_weights\' or'
+ ' \'keypoints_visible\' in the results.')
+
+ return results
+
+ def __repr__(self) -> str:
+ """print the basic information of the transform.
+
+ Returns:
+ str: Formatted string.
+ """
+ repr_str = self.__class__.__name__
+ repr_str += (f'(encoder={str(self.encoder_cfg)}, ')
+ repr_str += ('use_dataset_keypoint_weights='
+ f'{self.use_dataset_keypoint_weights})')
+ return repr_str
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/converting.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/converting.py
new file mode 100644
index 0000000000000000000000000000000000000000..c6c17449946de5d7aa2929c0ca24a5af0a66b6b4
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/converting.py
@@ -0,0 +1,130 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import List, Tuple, Union
+
+import numpy as np
+from mmcv.transforms import BaseTransform
+
+from mmpose.registry import TRANSFORMS
+
+
+@TRANSFORMS.register_module()
+class KeypointConverter(BaseTransform):
+ """Change the order of keypoints according to the given mapping.
+
+ Required Keys:
+
+ - keypoints
+ - keypoints_visible
+
+ Modified Keys:
+
+ - keypoints
+ - keypoints_visible
+
+ Args:
+ num_keypoints (int): The number of keypoints in target dataset.
+ mapping (list): A list containing mapping indexes. Each element has
+ format (source_index, target_index)
+
+ Example:
+ >>> import numpy as np
+ >>> # case 1: 1-to-1 mapping
+ >>> # (0, 0) means target[0] = source[0]
+ >>> self = KeypointConverter(
+ >>> num_keypoints=3,
+ >>> mapping=[
+ >>> (0, 0), (1, 1), (2, 2), (3, 3)
+ >>> ])
+ >>> results = dict(
+ >>> keypoints=np.arange(34).reshape(2, 3, 2),
+ >>> keypoints_visible=np.arange(34).reshape(2, 3, 2) % 2)
+ >>> results = self(results)
+ >>> assert np.equal(results['keypoints'],
+ >>> np.arange(34).reshape(2, 3, 2)).all()
+ >>> assert np.equal(results['keypoints_visible'],
+ >>> np.arange(34).reshape(2, 3, 2) % 2).all()
+ >>>
+ >>> # case 2: 2-to-1 mapping
+ >>> # ((1, 2), 0) means target[0] = (source[1] + source[2]) / 2
+ >>> self = KeypointConverter(
+ >>> num_keypoints=3,
+ >>> mapping=[
+ >>> ((1, 2), 0), (1, 1), (2, 2)
+ >>> ])
+ >>> results = dict(
+ >>> keypoints=np.arange(34).reshape(2, 3, 2),
+ >>> keypoints_visible=np.arange(34).reshape(2, 3, 2) % 2)
+ >>> results = self(results)
+ """
+
+ def __init__(self, num_keypoints: int,
+ mapping: Union[List[Tuple[int, int]], List[Tuple[Tuple,
+ int]]]):
+ self.num_keypoints = num_keypoints
+ self.mapping = mapping
+ source_index, target_index = zip(*mapping)
+
+ src1, src2 = [], []
+ interpolation = False
+ for x in source_index:
+ if isinstance(x, (list, tuple)):
+ assert len(x) == 2, 'source_index should be a list/tuple of ' \
+ 'length 2'
+ src1.append(x[0])
+ src2.append(x[1])
+ interpolation = True
+ else:
+ src1.append(x)
+ src2.append(x)
+
+ # When paired source_indexes are input,
+ # keep a self.source_index2 for interpolation
+ if interpolation:
+ self.source_index2 = src2
+
+ self.source_index = src1
+ self.target_index = target_index
+ self.interpolation = interpolation
+
+ def transform(self, results: dict) -> dict:
+ num_instances = results['keypoints'].shape[0]
+
+ keypoints = np.zeros((num_instances, self.num_keypoints, 2))
+ keypoints_visible = np.zeros((num_instances, self.num_keypoints))
+
+ # When paired source_indexes are input,
+ # perform interpolation with self.source_index and self.source_index2
+ if self.interpolation:
+ keypoints[:, self.target_index] = 0.5 * (
+ results['keypoints'][:, self.source_index] +
+ results['keypoints'][:, self.source_index2])
+
+ keypoints_visible[:, self.target_index] = results[
+ 'keypoints_visible'][:, self.source_index] * \
+ results['keypoints_visible'][:, self.source_index2]
+ else:
+ keypoints[:,
+ self.target_index] = results['keypoints'][:, self.
+ source_index]
+ keypoints_visible[:, self.target_index] = results[
+ 'keypoints_visible'][:, self.source_index]
+
+ results['keypoints'] = keypoints
+ results['keypoints_visible'] = keypoints_visible
+ return results
+
+ def __repr__(self) -> str:
+ """print the basic information of the transform.
+
+ Returns:
+ str: Formatted string.
+ """
+ repr_str = self.__class__.__name__
+ repr_str += f'(num_keypoints={self.num_keypoints}, '\
+ f'mapping={self.mapping})'
+ return repr_str
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/formatting.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/formatting.py
new file mode 100644
index 0000000000000000000000000000000000000000..e73f86fa81a01102d29498c743c79cb1d2ac6a4b
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/formatting.py
@@ -0,0 +1,279 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Sequence, Union
+
+import numpy as np
+import torch
+from mmcv.transforms import BaseTransform
+from mmengine.structures import InstanceData, PixelData
+from mmengine.utils import is_seq_of
+
+from mmpose.registry import TRANSFORMS
+from mmpose.structures import MultilevelPixelData, PoseDataSample
+
+
+def image_to_tensor(img: Union[np.ndarray,
+ Sequence[np.ndarray]]) -> torch.torch.Tensor:
+ """Translate image or sequence of images to tensor. Multiple image tensors
+ will be stacked.
+
+ Args:
+ value (np.ndarray | Sequence[np.ndarray]): The original image or
+ image sequence
+
+ Returns:
+ torch.Tensor: The output tensor.
+ """
+
+ if isinstance(img, np.ndarray):
+ if len(img.shape) < 3:
+ img = np.expand_dims(img, -1)
+
+ img = np.ascontiguousarray(img)
+ tensor = torch.from_numpy(img).permute(2, 0, 1).contiguous()
+ else:
+ assert is_seq_of(img, np.ndarray)
+ tensor = torch.stack([image_to_tensor(_img) for _img in img])
+
+ return tensor
+
+
+def keypoints_to_tensor(keypoints: Union[np.ndarray, Sequence[np.ndarray]]
+ ) -> torch.torch.Tensor:
+ """Translate keypoints or sequence of keypoints to tensor. Multiple
+ keypoints tensors will be stacked.
+
+ Args:
+ keypoints (np.ndarray | Sequence[np.ndarray]): The keypoints or
+ keypoints sequence.
+
+ Returns:
+ torch.Tensor: The output tensor.
+ """
+ if isinstance(keypoints, np.ndarray):
+ keypoints = np.ascontiguousarray(keypoints)
+ N = keypoints.shape[0]
+ keypoints = keypoints.transpose(1, 2, 0).reshape(-1, N)
+ tensor = torch.from_numpy(keypoints).contiguous()
+ else:
+ assert is_seq_of(keypoints, np.ndarray)
+ tensor = torch.stack(
+ [keypoints_to_tensor(_keypoints) for _keypoints in keypoints])
+
+ return tensor
+
+
+@TRANSFORMS.register_module()
+class PackPoseInputs(BaseTransform):
+ """Pack the inputs data for pose estimation.
+
+ The ``img_meta`` item is always populated. The contents of the
+ ``img_meta`` dictionary depends on ``meta_keys``. By default it includes:
+
+ - ``id``: id of the data sample
+
+ - ``img_id``: id of the image
+
+ - ``'category_id'``: the id of the instance category
+
+ - ``img_path``: path to the image file
+
+ - ``crowd_index`` (optional): measure the crowding level of an image,
+ defined in CrowdPose dataset
+
+ - ``ori_shape``: original shape of the image as a tuple (h, w, c)
+
+ - ``img_shape``: shape of the image input to the network as a tuple \
+ (h, w). Note that images may be zero padded on the \
+ bottom/right if the batch tensor is larger than this shape.
+
+ - ``input_size``: the input size to the network
+
+ - ``flip``: a boolean indicating if image flip transform was used
+
+ - ``flip_direction``: the flipping direction
+
+ - ``flip_indices``: the indices of each keypoint's symmetric keypoint
+
+ - ``raw_ann_info`` (optional): raw annotation of the instance(s)
+
+ Args:
+ meta_keys (Sequence[str], optional): Meta keys which will be stored in
+ :obj: `PoseDataSample` as meta info. Defaults to ``('id',
+ 'img_id', 'img_path', 'category_id', 'crowd_index, 'ori_shape',
+ 'img_shape',, 'input_size', 'input_center', 'input_scale', 'flip',
+ 'flip_direction', 'flip_indices', 'raw_ann_info')``
+ """
+
+ # items in `instance_mapping_table` will be directly packed into
+ # PoseDataSample.gt_instances without converting to Tensor
+ instance_mapping_table = {
+ 'bbox': 'bboxes',
+ 'head_size': 'head_size',
+ 'bbox_center': 'bbox_centers',
+ 'bbox_scale': 'bbox_scales',
+ 'bbox_score': 'bbox_scores',
+ 'keypoints': 'keypoints',
+ 'keypoints_visible': 'keypoints_visible',
+ 'lifting_target': 'lifting_target',
+ 'lifting_target_visible': 'lifting_target_visible',
+ }
+
+ # items in `label_mapping_table` will be packed into
+ # PoseDataSample.gt_instance_labels and converted to Tensor. These items
+ # will be used for computing losses
+ label_mapping_table = {
+ 'keypoint_labels': 'keypoint_labels',
+ 'lifting_target_label': 'lifting_target_label',
+ 'lifting_target_weights': 'lifting_target_weights',
+ 'trajectory_weights': 'trajectory_weights',
+ 'keypoint_x_labels': 'keypoint_x_labels',
+ 'keypoint_y_labels': 'keypoint_y_labels',
+ 'keypoint_weights': 'keypoint_weights',
+ 'instance_coords': 'instance_coords',
+ 'transformed_keypoints_visible': 'keypoints_visible',
+ }
+
+ # items in `field_mapping_table` will be packed into
+ # PoseDataSample.gt_fields and converted to Tensor. These items will be
+ # used for computing losses
+ field_mapping_table = {
+ 'heatmaps': 'heatmaps',
+ 'instance_heatmaps': 'instance_heatmaps',
+ 'heatmap_mask': 'heatmap_mask',
+ 'heatmap_weights': 'heatmap_weights',
+ 'displacements': 'displacements',
+ 'displacement_weights': 'displacement_weights',
+ }
+
+ def __init__(self,
+ meta_keys=('id', 'img_id', 'img_path', 'category_id',
+ 'crowd_index', 'ori_shape', 'img_shape',
+ 'input_size', 'input_center', 'input_scale',
+ 'flip', 'flip_direction', 'flip_indices',
+ 'raw_ann_info'),
+ pack_transformed=False):
+ self.meta_keys = meta_keys
+ self.pack_transformed = pack_transformed
+
+ def transform(self, results: dict) -> dict:
+ """Method to pack the input data.
+
+ Args:
+ results (dict): Result dict from the data pipeline.
+
+ Returns:
+ dict:
+
+ - 'inputs' (obj:`torch.Tensor`): The forward data of models.
+ - 'data_samples' (obj:`PoseDataSample`): The annotation info of the
+ sample.
+ """
+ # Pack image(s) for 2d pose estimation
+ if 'img' in results:
+ img = results['img']
+ inputs_tensor = image_to_tensor(img)
+ # Pack keypoints for 3d pose-lifting
+ elif 'lifting_target' in results and 'keypoints' in results:
+ if 'keypoint_labels' in results:
+ keypoints = results['keypoint_labels']
+ else:
+ keypoints = results['keypoints']
+ inputs_tensor = keypoints_to_tensor(keypoints)
+
+
+ rgb_gt_tensor = image_to_tensor(results['rgb_gt'])
+
+ data_sample = PoseDataSample()
+
+ # pack instance data
+ gt_instances = InstanceData()
+ for key, packed_key in self.instance_mapping_table.items():
+ if key in results:
+ if 'lifting_target' in results and key in {
+ 'keypoints', 'keypoints_visible'
+ }:
+ continue
+ gt_instances.set_field(results[key], packed_key)
+
+ # pack `transformed_keypoints` for visualizing data transform
+ # and augmentation results
+ if self.pack_transformed and 'transformed_keypoints' in results:
+ gt_instances.set_field(results['transformed_keypoints'],
+ 'transformed_keypoints')
+ if self.pack_transformed and \
+ 'transformed_keypoints_visible' in results:
+ gt_instances.set_field(results['transformed_keypoints_visible'],
+ 'transformed_keypoints_visible')
+
+ data_sample.gt_instances = gt_instances
+
+ # pack instance labels
+ gt_instance_labels = InstanceData()
+ for key, packed_key in self.label_mapping_table.items():
+ if key in results:
+ # For pose-lifting, store only target-related fields
+ if 'lifting_target_label' in results and key in {
+ 'keypoint_labels', 'keypoint_weights',
+ 'transformed_keypoints_visible'
+ }:
+ continue
+ if isinstance(results[key], list):
+ # A list of labels is usually generated by combined
+ # multiple encoders (See ``GenerateTarget`` in
+ # mmpose/datasets/transforms/common_transforms.py)
+ # In this case, labels in list should have the same
+ # shape and will be stacked.
+ _labels = np.stack(results[key])
+ gt_instance_labels.set_field(_labels, packed_key)
+ else:
+ gt_instance_labels.set_field(results[key], packed_key)
+ data_sample.gt_instance_labels = gt_instance_labels.to_tensor()
+
+ # pack fields
+ gt_fields = None
+ for key, packed_key in self.field_mapping_table.items():
+ if key in results:
+ if isinstance(results[key], list):
+ if gt_fields is None:
+ gt_fields = MultilevelPixelData()
+ else:
+ assert isinstance(
+ gt_fields, MultilevelPixelData
+ ), 'Got mixed single-level and multi-level pixel data.'
+ else:
+ if gt_fields is None:
+ gt_fields = PixelData()
+ else:
+ assert isinstance(
+ gt_fields, PixelData
+ ), 'Got mixed single-level and multi-level pixel data.'
+
+ gt_fields.set_field(results[key], packed_key)
+
+ if gt_fields:
+ data_sample.gt_fields = gt_fields.to_tensor()
+
+ img_meta = {k: results[k] for k in self.meta_keys if k in results}
+ data_sample.set_metainfo(img_meta)
+
+ packed_results = dict()
+ packed_results['inputs'] = inputs_tensor
+ packed_results['data_samples'] = data_sample
+ packed_results['rgb_gt'] = rgb_gt_tensor
+
+ return packed_results
+
+ def __repr__(self) -> str:
+ """print the basic information of the transform.
+
+ Returns:
+ str: Formatted string.
+ """
+ repr_str = self.__class__.__name__
+ repr_str += f'(meta_keys={self.meta_keys})'
+ return repr_str
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/loading.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/loading.py
new file mode 100644
index 0000000000000000000000000000000000000000..fee4d433bd2624de47c02b713896efcdd377eb16
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/loading.py
@@ -0,0 +1,71 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional
+
+import numpy as np
+from mmcv.transforms import LoadImageFromFile
+
+from mmpose.registry import TRANSFORMS
+
+
+@TRANSFORMS.register_module()
+class LoadImage(LoadImageFromFile):
+ """Load an image from file or from the np.ndarray in ``results['img']``.
+
+ Required Keys:
+
+ - img_path
+ - img (optional)
+
+ Modified Keys:
+
+ - img
+ - img_shape
+ - ori_shape
+ - img_path (optional)
+
+ Args:
+ to_float32 (bool): Whether to convert the loaded image to a float32
+ numpy array. If set to False, the loaded image is an uint8 array.
+ Defaults to False.
+ color_type (str): The flag argument for :func:``mmcv.imfrombytes``.
+ Defaults to 'color'.
+ imdecode_backend (str): The image decoding backend type. The backend
+ argument for :func:``mmcv.imfrombytes``.
+ See :func:``mmcv.imfrombytes`` for details.
+ Defaults to 'cv2'.
+ backend_args (dict, optional): Arguments to instantiate the preifx of
+ uri corresponding backend. Defaults to None.
+ ignore_empty (bool): Whether to allow loading empty image or file path
+ not existent. Defaults to False.
+ """
+
+ def transform(self, results: dict) -> Optional[dict]:
+ """The transform function of :class:`LoadImage`.
+
+ Args:
+ results (dict): The result dict
+
+ Returns:
+ dict: The result dict.
+ """
+
+ if 'img' not in results:
+ # Load image from file by :meth:`LoadImageFromFile.transform`
+ results = super().transform(results)
+ else:
+ img = results['img']
+ assert isinstance(img, np.ndarray)
+ if self.to_float32:
+ img = img.astype(np.float32)
+
+ if 'img_path' not in results:
+ results['img_path'] = None
+ results['img_shape'] = img.shape[:2]
+ results['ori_shape'] = img.shape[:2]
+
+ return results
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/pose3d_transforms.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/pose3d_transforms.py
new file mode 100644
index 0000000000000000000000000000000000000000..523e6e5868d08c8b9af9226ca2f6ceccc27abca3
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/pose3d_transforms.py
@@ -0,0 +1,533 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from copy import deepcopy
+from typing import Dict, List, Optional, Sequence, Tuple, Union
+import cv2
+import numpy as np
+from mmcv.transforms import BaseTransform
+from mmcv.image import imflip
+from mmengine import is_seq_of
+from scipy.stats import truncnorm
+from mmpose.structures.bbox import bbox_xyxy2cs, flip_bbox
+from mmcv.transforms.utils import avoid_cache_randomness, cache_randomness
+from mmpose.registry import TRANSFORMS
+from mmpose.structures.keypoint import flip_keypoints_custom_center
+from mmpose.structures.keypoint import flip_keypoints
+from mmpose.structures.bbox import get_udp_warp_matrix, get_warp_matrix
+from .formatting import PackPoseInputs
+from mmpose.utils.typing import MultiConfig
+from scipy.stats import norm
+
+
+@TRANSFORMS.register_module()
+class Pose3dGenerateTarget(BaseTransform):
+ def __init__(self) -> None:
+ super().__init__()
+ return
+
+ def transform(self, results: Dict) -> Optional[dict]:
+ if 'keypoints_depth' not in results:
+ num_keypoints = results['transformed_keypoints'].shape[1]
+ results['pose3d'] = np.zeros((num_keypoints, 3)).astype(np.float32)
+ results['pose3d_visible'] = np.zeros(num_keypoints, dtype=bool)
+ results['K'] = np.eye(3).astype(np.float32)
+ return results
+
+ assert 'K' in results
+ results['K'] = results['K'].astype(np.float32)
+
+ K = results['K']
+ height, width = results['img'].shape[:2]
+
+ keypoints = results['transformed_keypoints'][0] ## 308 x 2
+ keypoints_valid = results['keypoints_visible'][0] ## 308. this is actually filtered using transformed keypoints
+
+ Z = results['keypoints_depth'][0, :, 0] ## 308
+
+ # Compute X, Y, Z as pose3d
+ fx, fy = K[0, 0], K[1, 1]
+ cx, cy = K[0, 2], K[1, 2]
+
+ X = (keypoints[:, 0] - cx) * Z / fx
+ Y = (keypoints[:, 1] - cy) * Z / fy
+
+ # Stack X, Y, Z to create pose3d
+ pose3d = np.stack([X, Y, Z], axis=-1)
+ pose2d = np.dot(K, pose3d.T).T ## project 3d keypoints to 2D
+ pose2d = pose2d[:, :2] / (pose2d[:, 2:] + 1e-8)
+
+ keypoints_valid = keypoints_valid * (pose2d[:, 0] >= 0) * (
+ pose2d[:, 0] < width) * (pose2d[:, 1] >= 0) * (pose2d[:, 1] < height)
+
+ # Apply validity mask
+ pose3d[keypoints_valid == 0] = 0
+ pose2d[keypoints_valid == 0] = 0
+
+ results['pose3d'] = pose3d.astype(np.float32)
+ results['pose3d_visible'] = keypoints_valid.astype(bool)
+
+ # # ## debug
+ # image = results['img']
+
+ # # Draw only visible keypoints
+ # for i in range(len(keypoints)):
+ # u = int(pose2d[i, 0])
+ # v = int(pose2d[i, 1])
+ # if keypoints_valid[i] and u >= 0 and u < image.shape[1] \
+ # and v >= 0 and v < image.shape[0]:
+
+ # # Projected keypoint in red
+ # cv2.circle(image, (u, v), 3, (0, 255, 0), -1)
+
+ # # Save debug image
+ # random_seed = np.random.randint(0, 100000)
+ # cv2.imwrite('pose3d_{}.png'.format(random_seed), image)
+
+ return results
+
+ def __repr__(self) -> str:
+ repr_str = self.__class__.__name__
+ return repr_str
+
+@TRANSFORMS.register_module()
+class PackPose3dInputs(PackPoseInputs):
+ def __init__(self, **kwargs):
+ super().__init__(**kwargs)
+
+ def transform(self, results: dict) -> dict:
+ ## this condition is used for inference only
+ if 'keypoints_visible' not in results:
+ return super().transform(results)
+
+ ## clean up keypoints_visible for out of bound keypoints
+ is_visible = results['keypoints_visible'] ## 1 x N_keypoints
+ image_width, image_height = results['input_size']
+ transformed_keypoints = results['transformed_keypoints'] ## 1 x N_keypoints x 2
+
+ is_visible = is_visible * (transformed_keypoints[:, :, 0] >= 0) * (transformed_keypoints[:, :, 0] < image_width) \
+ * (transformed_keypoints[:, :, 1] >= 0) * (transformed_keypoints[:, :, 1] < image_height)
+
+ results['keypoints_visible'] = is_visible
+
+ ## zero out out of bound keypoints
+ results['transformed_keypoints'][is_visible == 0] = 0
+
+ packed_results = super().transform(results) ## call packposeinputs
+
+ ## TODO: this if condition should not be needed but still crashes. investigate.
+ if 'pose3d' not in results:
+ num_keypoints = results['transformed_keypoints'].shape[1] ## keypoints is 1 x N x 2
+ results['pose3d'] = np.zeros((num_keypoints, 3)).astype(np.float32)
+ results['pose3d_visible'] = np.zeros(num_keypoints, dtype=bool)
+ results['K'] = np.eye(3).astype(np.float32)
+
+ packed_results['data_samples'].gt_instances.set_field(results['pose3d'].reshape(1, -1, 3), 'pose3d') ## 1 x N_keypoints x 3
+ packed_results['data_samples'].gt_instances.set_field(results['pose3d_visible'].reshape(1, -1), 'pose3d_visible') ## 1 x N_keypoints
+
+ if 'depth_heatmap' in results:
+ packed_results['data_samples'].gt_instances.set_field(results['depth_heatmap'][np.newaxis, ...], 'depth_heatmap') ## 1 x N_keypoints x num_bins
+
+ return packed_results
+
+@TRANSFORMS.register_module()
+class Pose3dRandomBBoxTransform(BaseTransform):
+ def __init__(self,
+ shift_factor: float = 0.16,
+ shift_prob: float = 0.3,
+ scale_factor: Tuple[float, float] = (0.5, 1.5),
+ scale_prob: float = 1.0,) -> None:
+ super().__init__()
+
+ self.shift_factor = shift_factor
+ self.shift_prob = shift_prob
+ self.scale_factor = scale_factor
+ self.scale_prob = scale_prob
+
+ @staticmethod
+ def _truncnorm(low: float = -1.,
+ high: float = 1.,
+ size: tuple = ()) -> np.ndarray:
+ """Sample from a truncated normal distribution."""
+ return truncnorm.rvs(low, high, size=size).astype(np.float32)
+
+ @cache_randomness
+ def _get_transform_params(self, num_bboxes: int) -> Tuple:
+ """Get random transform parameters.
+
+ Args:
+ num_bboxes (int): The number of bboxes
+
+ Returns:
+ tuple:
+ - offset (np.ndarray): Offset factor of each bbox in shape (n, 2)
+ - scale (np.ndarray): Scaling factor of each bbox in shape (n, 1)
+ - rotate (np.ndarray): Rotation degree of each bbox in shape (n,)
+ """
+ # Get shift parameters
+ offset = self._truncnorm(size=(num_bboxes, 2)) * self.shift_factor
+ offset = np.where(
+ np.random.rand(num_bboxes, 1) < self.shift_prob, offset, 0.)
+
+ # Get scaling parameters
+ scale_min, scale_max = self.scale_factor
+ mu = (scale_max + scale_min) * 0.5
+ sigma = (scale_max - scale_min) * 0.5
+ scale = self._truncnorm(size=(num_bboxes, 1)) * sigma + mu
+ scale = np.where(
+ np.random.rand(num_bboxes, 1) < self.scale_prob, scale, 1.)
+
+ return offset, scale
+
+ def transform(self, results: Dict) -> Optional[dict]:
+ """The transform function of :class:`RandomBboxTransform`.
+
+ See ``transform()`` method of :class:`BaseTransform` for details.
+
+ Args:
+ results (dict): The result dict
+
+ Returns:
+ dict: The result dict.
+ """
+ bbox_scale = results['bbox_scale']
+ num_bboxes = bbox_scale.shape[0]
+
+ offset, scale = self._get_transform_params(num_bboxes)
+
+ results['bbox_center'] += offset * bbox_scale
+ results['bbox_scale'] *= scale
+
+ return results
+
+ def __repr__(self) -> str:
+ """print the basic information of the transform.
+
+ Returns:
+ str: Formatted string.
+ """
+ repr_str = self.__class__.__name__
+ repr_str += f'(shift_prob={self.shift_prob}, '
+ repr_str += f'shift_factor={self.shift_factor}, '
+ repr_str += f'scale_prob={self.scale_prob}, '
+ repr_str += f'scale_factor={self.scale_factor}, '
+ return repr_str
+
+@TRANSFORMS.register_module()
+class Pose3dRandomFlip(BaseTransform):
+ def __init__(self,
+ prob: Union[float, List[float]] = 0.5,
+ direction: Union[str, List[str]] = 'horizontal') -> None:
+ if isinstance(prob, list):
+ assert is_list_of(prob, float)
+ assert 0 <= sum(prob) <= 1
+ elif isinstance(prob, float):
+ assert 0 <= prob <= 1
+ else:
+ raise ValueError(f'probs must be float or list of float, but \
+ got `{type(prob)}`.')
+ self.prob = prob
+
+ valid_directions = ['horizontal', 'vertical', 'diagonal']
+ if isinstance(direction, str):
+ assert direction in valid_directions
+ elif isinstance(direction, list):
+ assert is_list_of(direction, str)
+ assert set(direction).issubset(set(valid_directions))
+ else:
+ raise ValueError(f'direction must be either str or list of str, \
+ but got `{type(direction)}`.')
+ self.direction = direction
+
+ if isinstance(prob, list):
+ assert len(prob) == len(self.direction)
+
+ @cache_randomness
+ def _choose_direction(self) -> str:
+ """Choose the flip direction according to `prob` and `direction`"""
+ if isinstance(self.direction,
+ List) and not isinstance(self.direction, str):
+ # None means non-flip
+ direction_list: list = list(self.direction) + [None]
+ elif isinstance(self.direction, str):
+ # None means non-flip
+ direction_list = [self.direction, None]
+
+ if isinstance(self.prob, list):
+ non_prob: float = 1 - sum(self.prob)
+ prob_list = self.prob + [non_prob]
+ elif isinstance(self.prob, float):
+ non_prob = 1. - self.prob
+ # exclude non-flip
+ single_ratio = self.prob / (len(direction_list) - 1)
+ prob_list = [single_ratio] * (len(direction_list) - 1) + [non_prob]
+
+ cur_dir = np.random.choice(direction_list, p=prob_list)
+
+ return cur_dir
+
+ def transform(self, results: dict) -> dict:
+ flip_dir = self._choose_direction()
+ img_shape = results['img'].shape[:2] ## 1024 x 768
+
+ if flip_dir is None:
+ results['flip'] = False
+ results['flip_direction'] = None
+ else:
+ results['flip'] = True
+ results['flip_direction'] = flip_dir
+
+ h, w = results.get('input_size', results['img_shape'])
+ # flip image and mask
+ if isinstance(results['img'], list):
+ results['img'] = [
+ imflip(img, direction=flip_dir) for img in results['img']
+ ]
+ else:
+ results['img'] = imflip(results['img'], direction=flip_dir)
+
+ if 'img_mask' in results:
+ results['img_mask'] = imflip(
+ results['img_mask'], direction=flip_dir)
+
+ # flip bboxes
+ if results.get('bbox', None) is not None:
+ results['bbox'] = flip_bbox(
+ results['bbox'],
+ image_size=(w, h),
+ bbox_format='xyxy',
+ direction=flip_dir)
+
+ if results.get('bbox_center', None) is not None:
+ results['bbox_center'] = flip_bbox(
+ results['bbox_center'],
+ image_size=(w, h),
+ bbox_format='center',
+ direction=flip_dir)
+
+ # flip keypoints
+ if results.get('keypoints', None) is not None:
+ keypoints, keypoints_visible = flip_keypoints(
+ results['keypoints'],
+ results.get('keypoints_visible', None),
+ image_size=(w, h),
+ flip_indices=results['flip_indices'],
+ direction=flip_dir)
+
+ results['keypoints'] = keypoints
+ results['keypoints_visible'] = keypoints_visible
+
+ # flip camera parameters
+ if 'K' in results.keys():
+ # Flip the principal point for the left-right flipped image
+ results['K'][0, 2] = img_shape[1] - results['K'][0, 2] - 1
+
+ return results
+
+ def __repr__(self) -> str:
+ """print the basic information of the transform.
+
+ Returns:
+ str: Formatted string.
+ """
+ repr_str = self.__class__.__name__
+ repr_str += f'(prob={self.prob}, '
+ repr_str += f'direction={self.direction})'
+ return repr_str
+
+@TRANSFORMS.register_module()
+class RandomFlipAroundRoot(BaseTransform):
+ """Data augmentation with random horizontal joint flip around a root joint.
+
+ Args:
+ keypoints_flip_cfg (dict): Configurations of the
+ ``flip_keypoints_custom_center`` function for ``keypoints``. Please
+ refer to the docstring of the ``flip_keypoints_custom_center``
+ function for more details.
+ target_flip_cfg (dict): Configurations of the
+ ``flip_keypoints_custom_center`` function for ``lifting_target``.
+ Please refer to the docstring of the
+ ``flip_keypoints_custom_center`` function for more details.
+ flip_prob (float): Probability of flip. Default: 0.5.
+ flip_camera (bool): Whether to flip horizontal distortion coefficients.
+ Default: ``False``.
+
+ Required keys:
+ keypoints
+ lifting_target
+
+ Modified keys:
+ (keypoints, keypoints_visible, lifting_target, lifting_target_visible,
+ camera_param)
+ """
+
+ def __init__(self,
+ keypoints_flip_cfg,
+ target_flip_cfg,
+ flip_prob=0.5,
+ flip_camera=False):
+ self.keypoints_flip_cfg = keypoints_flip_cfg
+ self.target_flip_cfg = target_flip_cfg
+ self.flip_prob = flip_prob
+ self.flip_camera = flip_camera
+
+ def transform(self, results: Dict) -> dict:
+ """The transform function of :class:`ZeroCenterPose`.
+
+ See ``transform()`` method of :class:`BaseTransform` for details.
+
+ Args:
+ results (dict): The result dict
+
+ Returns:
+ dict: The result dict.
+ """
+
+ keypoints = results['keypoints']
+ if 'keypoints_visible' in results:
+ keypoints_visible = results['keypoints_visible']
+ else:
+ keypoints_visible = np.ones(keypoints.shape[:-1], dtype=np.float32)
+ lifting_target = results['lifting_target']
+ if 'lifting_target_visible' in results:
+ lifting_target_visible = results['lifting_target_visible']
+ else:
+ lifting_target_visible = np.ones(
+ lifting_target.shape[:-1], dtype=np.float32)
+
+ if np.random.rand() <= self.flip_prob:
+ if 'flip_indices' not in results:
+ flip_indices = list(range(self.num_keypoints))
+ else:
+ flip_indices = results['flip_indices']
+
+ # flip joint coordinates
+ keypoints, keypoints_visible = flip_keypoints_custom_center(
+ keypoints, keypoints_visible, flip_indices,
+ **self.keypoints_flip_cfg)
+ lifting_target, lifting_target_visible = flip_keypoints_custom_center( # noqa
+ lifting_target, lifting_target_visible, flip_indices,
+ **self.target_flip_cfg)
+
+ results['keypoints'] = keypoints
+ results['keypoints_visible'] = keypoints_visible
+ results['lifting_target'] = lifting_target
+ results['lifting_target_visible'] = lifting_target_visible
+
+ # flip horizontal distortion coefficients
+ if self.flip_camera:
+ assert 'camera_param' in results, \
+ 'Camera parameters are missing.'
+ _camera_param = deepcopy(results['camera_param'])
+
+ assert 'c' in _camera_param
+ _camera_param['c'][0] *= -1
+
+ if 'p' in _camera_param:
+ _camera_param['p'][0] *= -1
+
+ results['camera_param'].update(_camera_param)
+
+ return results
+
+@TRANSFORMS.register_module()
+class Pose3dTopdownAffine(BaseTransform):
+ def __init__(self,
+ input_size: Tuple[int, int],
+ use_udp: bool = False) -> None:
+ super().__init__()
+
+ assert is_seq_of(input_size, int) and len(input_size) == 2, (
+ f'Invalid input_size {input_size}')
+
+ self.input_size = input_size
+ self.use_udp = use_udp
+
+ @staticmethod
+ def _fix_aspect_ratio(bbox_scale: np.ndarray, aspect_ratio: float):
+ w, h = np.hsplit(bbox_scale, [1])
+ bbox_scale = np.where(w > h * aspect_ratio,
+ np.hstack([w, w / aspect_ratio]),
+ np.hstack([h * aspect_ratio, h]))
+ return bbox_scale
+
+ def transform(self, results: Dict) -> Optional[dict]:
+ w, h = self.input_size
+ warp_size = (int(w), int(h)) # (width, height), 768 x 1024
+
+ # reshape bbox to fixed aspect ratio
+ results['bbox_scale'] = self._fix_aspect_ratio(
+ results['bbox_scale'], aspect_ratio=w / h)
+
+ # TODO: support multi-instance
+ assert results['bbox_center'].shape[0] == 1, (
+ 'Top-down heatmap only supports single instance. Got invalid '
+ f'shape of bbox_center {results["bbox_center"].shape}.')
+
+ center = results['bbox_center'][0]
+ scale = results['bbox_scale'][0]
+ rot = 0. ## no rotation
+
+ if self.use_udp:
+ warp_mat = get_udp_warp_matrix(
+ center, scale, rot, output_size=(w, h))
+ else:
+ warp_mat = get_warp_matrix(center, scale, rot, output_size=(w, h))
+
+ if isinstance(results['img'], list):
+ results['img'] = [
+ cv2.warpAffine(
+ img, warp_mat, warp_size, flags=cv2.INTER_LINEAR)
+ for img in results['img']
+ ]
+ else:
+ results['img'] = cv2.warpAffine(
+ results['img'], warp_mat, warp_size, flags=cv2.INTER_LINEAR)
+
+ if results.get('keypoints', None) is not None:
+ transformed_keypoints = results['keypoints'].copy()
+ # Only transform (x, y) coordinates
+ transformed_keypoints[..., :2] = cv2.transform(
+ results['keypoints'][..., :2], warp_mat)
+ results['transformed_keypoints'] = transformed_keypoints
+
+ results['input_size'] = (w, h)
+
+ ## convert K from entire image to the cropped image
+ if 'K' in results:
+ K = results['K']
+
+ # Adjust focal lengths based on the scale factors
+ translation_x = center[0] - scale[0] / 2
+ translation_y = center[1] - scale[1] / 2
+ scale_factor_x = w / scale[0]
+ scale_factor_y = h / scale[1]
+
+ c_x_new = (K[0, 2] - translation_x) * scale_factor_x
+ c_y_new = (K[1, 2] - translation_y) * scale_factor_y
+
+ f_x_new = K[0, 0] * scale_factor_x
+ f_y_new = K[1, 1] * scale_factor_y
+
+ # Update the intrinsic matrix
+ results['K'] = np.array([
+ [f_x_new, 0, c_x_new],
+ [0, f_y_new, c_y_new],
+ [0, 0, 1]
+ ])
+
+ return results
+
+ def __repr__(self) -> str:
+ """print the basic information of the transform.
+
+ Returns:
+ str: Formatted string.
+ """
+ repr_str = self.__class__.__name__
+ repr_str += f'(input_size={self.input_size}, '
+ repr_str += f'use_udp={self.use_udp})'
+ return repr_str
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/topdown_transforms.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/topdown_transforms.py
new file mode 100644
index 0000000000000000000000000000000000000000..fe78f7e6d79479f63087cc7b5a7e8d87e8d049a1
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/datasets/transforms/topdown_transforms.py
@@ -0,0 +1,151 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Dict, Optional, Tuple
+
+import cv2
+import numpy as np
+from mmcv.transforms import BaseTransform
+from mmengine import is_seq_of
+
+from mmpose.registry import TRANSFORMS
+from mmpose.structures.bbox import get_udp_warp_matrix, get_warp_matrix
+
+@TRANSFORMS.register_module()
+class TopdownAffine(BaseTransform):
+ """Get the bbox image as the model input by affine transform.
+
+ Required Keys:
+
+ - img
+ - bbox_center
+ - bbox_scale
+ - bbox_rotation (optional)
+ - keypoints (optional)
+
+ Modified Keys:
+
+ - img
+ - bbox_scale
+
+ Added Keys:
+
+ - input_size
+ - transformed_keypoints
+
+ Args:
+ input_size (Tuple[int, int]): The input image size of the model in
+ [w, h]. The bbox region will be cropped and resize to `input_size`
+ use_udp (bool): Whether use unbiased data processing. See
+ `UDP (CVPR 2020)`_ for details. Defaults to ``False``
+
+ .. _`UDP (CVPR 2020)`: https://arxiv.org/abs/1911.07524
+ """
+
+ def __init__(self,
+ input_size: Tuple[int, int],
+ use_udp: bool = False) -> None:
+ super().__init__()
+
+ assert is_seq_of(input_size, int) and len(input_size) == 2, (
+ f'Invalid input_size {input_size}')
+
+ self.input_size = input_size
+ self.use_udp = use_udp
+
+ @staticmethod
+ def _fix_aspect_ratio(bbox_scale: np.ndarray, aspect_ratio: float):
+ """Reshape the bbox to a fixed aspect ratio.
+
+ Args:
+ bbox_scale (np.ndarray): The bbox scales (w, h) in shape (n, 2)
+ aspect_ratio (float): The ratio of ``w/h``
+
+ Returns:
+ np.darray: The reshaped bbox scales in (n, 2)
+ """
+
+ w, h = np.hsplit(bbox_scale, [1])
+ bbox_scale = np.where(w > h * aspect_ratio,
+ np.hstack([w, w / aspect_ratio]),
+ np.hstack([h * aspect_ratio, h]))
+ return bbox_scale
+
+ def transform(self, results: Dict) -> Optional[dict]:
+ """The transform function of :class:`TopdownAffine`.
+
+ See ``transform()`` method of :class:`BaseTransform` for details.
+
+ Args:
+ results (dict): The result dict
+
+ Returns:
+ dict: The result dict.
+ """
+
+ w, h = self.input_size
+ warp_size = (int(w), int(h))
+
+ # reshape bbox to fixed aspect ratio
+ results['bbox_scale'] = self._fix_aspect_ratio(
+ results['bbox_scale'], aspect_ratio=w / h)
+
+ # TODO: support multi-instance
+ assert results['bbox_center'].shape[0] == 1, (
+ 'Top-down heatmap only supports single instance. Got invalid '
+ f'shape of bbox_center {results["bbox_center"].shape}.')
+
+ center = results['bbox_center'][0]
+ scale = results['bbox_scale'][0]
+ if 'bbox_rotation' in results:
+ rot = results['bbox_rotation'][0]
+ else:
+ rot = 0.
+
+ if self.use_udp:
+ warp_mat = get_udp_warp_matrix(
+ center, scale, rot, output_size=(w, h))
+ else:
+ warp_mat = get_warp_matrix(center, scale, rot, output_size=(w, h))
+
+ if isinstance(results['img'], list):
+ results['img'] = [
+ cv2.warpAffine(
+ img, warp_mat, warp_size, flags=cv2.INTER_LINEAR)
+ for img in results['img']
+ ]
+ else:
+ results['img'] = cv2.warpAffine(
+ results['img'], warp_mat, warp_size, flags=cv2.INTER_LINEAR)
+
+ if results.get('keypoints', None) is not None:
+ transformed_keypoints = results['keypoints'].copy()
+ # Only transform (x, y) coordinates
+ transformed_keypoints[..., :2] = cv2.transform(
+ results['keypoints'][..., :2], warp_mat)
+ results['transformed_keypoints'] = transformed_keypoints
+
+ results['input_size'] = (w, h)
+
+ return results
+
+ def __repr__(self) -> str:
+ """print the basic information of the transform.
+
+ Returns:
+ str: Formatted string.
+ """
+ repr_str = self.__class__.__name__
+ repr_str += f'(input_size={self.input_size}, '
+ repr_str += f'use_udp={self.use_udp})'
+ return repr_str
+
+@TRANSFORMS.register_module()
+class CacheRGBTarget(BaseTransform):
+ def transform(self, results: dict) -> dict:
+
+ results['rgb_gt'] = results['img'].copy()
+ return results
\ No newline at end of file
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..97099ab45a7b148a11b1ab0a07ddc60def98e59e
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/__init__.py
@@ -0,0 +1,9 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .hooks import * # noqa: F401, F403
+from .optim_wrappers import * # noqa: F401, F403
+
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..f0d3fa08b6b26999ca3889cf2988c60ab49762ea
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/__init__.py
@@ -0,0 +1,13 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .ema_hook import ExpMomentumEMA
+from .visualization_hook import PoseVisualizationHook
+from .custom_visualization_hook import CustomPoseVisualizationHook
+from .general_visualization_hook import GeneralPoseVisualizationHook
+from .pose3d_visualization_hook import Pose3dVisualizationHook
+
+__all__ = ['PoseVisualizationHook', 'ExpMomentumEMA', 'CustomPoseVisualizationHook', 'GeneralPoseVisualizationHook', 'Pose3dVisualizationHook']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/custom_visualization_hook.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/custom_visualization_hook.py
new file mode 100644
index 0000000000000000000000000000000000000000..36f6244b5ff412be2cb7081702b2c96bc4afa6bb
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/custom_visualization_hook.py
@@ -0,0 +1,441 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os
+import warnings
+from typing import Optional, Sequence
+
+import torch
+import numpy as np
+import cv2
+import mmcv
+import torchvision
+import torchvision.transforms as transforms
+import mmengine
+import mmengine.fileio as fileio
+from mmengine.hooks import Hook
+from mmengine.runner import Runner
+from mmengine.visualization import Visualizer
+from matplotlib import pyplot as plt
+from mmpose.registry import HOOKS
+from mmpose.structures import PoseDataSample, merge_data_samples
+
+
+@HOOKS.register_module()
+class CustomPoseVisualizationHook(Hook):
+ """Pose Estimation Visualization Hook. Used to visualize validation and
+ testing process prediction results.
+
+ In the testing phase:
+
+ 1. If ``show`` is True, it means that only the prediction results are
+ visualized without storing data, so ``vis_backends`` needs to
+ be excluded.
+ 2. If ``out_dir`` is specified, it means that the prediction results
+ need to be saved to ``out_dir``. In order to avoid vis_backends
+ also storing data, so ``vis_backends`` needs to be excluded.
+ 3. ``vis_backends`` takes effect if the user does not specify ``show``
+ and `out_dir``. You can set ``vis_backends`` to WandbVisBackend or
+ TensorboardVisBackend to store the prediction result in Wandb or
+ Tensorboard.
+
+ Args:
+ enable (bool): whether to draw prediction results. If it is False,
+ it means that no drawing will be done. Defaults to False.
+ interval (int): The interval of visualization. Defaults to 50.
+ score_thr (float): The threshold to visualize the bboxes
+ and masks. Defaults to 0.3.
+ show (bool): Whether to display the drawn image. Default to False.
+ wait_time (float): The interval of show (s). Defaults to 0.
+ out_dir (str, optional): directory where painted images
+ will be saved in testing process.
+ backend_args (dict, optional): Arguments to instantiate the preifx of
+ uri corresponding backend. Defaults to None.
+ """
+
+ def __init__(
+ self,
+ enable: bool = False,
+ interval: int = 50,
+ kpt_thr: float = 0.3,
+ show: bool = False,
+ wait_time: float = 0.,
+ max_vis_samples: int = 16,
+ scale: int = 4,
+ out_dir: Optional[str] = None,
+ backend_args: Optional[dict] = None,
+ ):
+ self._visualizer: Visualizer = Visualizer.get_current_instance()
+ self.interval = interval
+ self.kpt_thr = kpt_thr
+ self.show = show
+ if self.show:
+ # No need to think about vis backends.
+ self._visualizer._vis_backends = {}
+ warnings.warn('The show is True, it means that only '
+ 'the prediction results are visualized '
+ 'without storing data, so vis_backends '
+ 'needs to be excluded.')
+
+ self.wait_time = wait_time
+ self.enable = enable
+ self.out_dir = out_dir
+ self._test_index = 0
+ self.backend_args = backend_args
+ self.max_vis_samples = max_vis_samples
+ self.scale = scale
+
+ def after_train_iter(self, runner: Runner, batch_idx: int, data_batch: dict,
+ outputs: Sequence[PoseDataSample]) -> None:
+ """Run after every ``self.interval`` validation iterations.
+
+ Args:
+ runner (:obj:`Runner`): The runner of the validation process.
+ batch_idx (int): The index of the current batch in the val loop.
+ data_batch (dict): Data from dataloader.
+ outputs (Sequence[:obj:`PoseDataSample`]): Outputs from model.
+ """
+ if self.enable is False:
+ return
+
+ # ## check if the rank is 0
+ if not runner.rank == 0:
+ return
+
+ # There is no guarantee that the same batch of images
+ # is visualized for each evaluation.
+ total_curr_iter = runner.iter
+
+ if total_curr_iter % self.interval != 0:
+ return
+
+ ## we divide by 255 to be compatible with the visualization functions
+ image = torch.cat([input.unsqueeze(dim=0)/255 for input in data_batch['inputs']], dim=0) ## B x 3 x H x W, not normalized in BGR format
+ output = outputs['vis_preds'].detach() ## B x 17 x H x W
+
+ batch_size = min(self.max_vis_samples, len(image))
+
+ image = image[:batch_size]
+ output = output[:batch_size]
+
+ target = []
+ for i in range(batch_size):
+ target.append(data_batch['data_samples'][i].get('gt_fields').get('heatmaps').unsqueeze(dim=0))
+
+ target = torch.cat(target, dim=0)
+
+ target_weight = []
+ for i in range(batch_size):
+ target_weight.append(data_batch['data_samples'][i].get('gt_instance_labels').get('keypoints_visible').unsqueeze(dim=0))
+ target_weight = torch.cat(target_weight, dim=0)
+
+ ##------------------------------------
+ vis_dir = os.path.join(runner.work_dir, 'vis_data')
+ if not os.path.exists(vis_dir):
+ os.makedirs(vis_dir, exist_ok=True)
+
+ prefix = os.path.join(vis_dir, 'train')
+ suffix = str(total_curr_iter).zfill(6)
+
+ original_image = image
+
+ save_batch_heatmaps(original_image, target, '{}_{}_hm_gt.jpg'.format(prefix, suffix), normalize=False, scale=self.scale, is_rgb=False)
+ save_batch_heatmaps(original_image, output, '{}_{}_hm_pred.jpg'.format(prefix, suffix), normalize=False, scale=self.scale, is_rgb=False)
+ save_batch_image_with_joints(255*original_image, target, target_weight, \
+ '{}_{}_gt.jpg'.format(prefix, suffix), scale=self.scale, is_rgb=False)
+ save_batch_image_with_joints(255*original_image, output, torch.ones_like(target_weight), \
+ '{}_{}_pred.jpg'.format(prefix, suffix), scale=self.scale, is_rgb=False)
+
+ return
+
+###------------------helpers-----------------------
+###------------------------------------------------------
+def batch_unnormalize_image(images, mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375]):
+ normalize = transforms.Normalize(mean=mean, std=std)
+ images[:, 0, :, :] = (images[:, 0, :, :]*normalize.std[0]) + normalize.mean[0]
+ images[:, 1, :, :] = (images[:, 1, :, :]*normalize.std[1]) + normalize.mean[1]
+ images[:, 2, :, :] = (images[:, 2, :, :]*normalize.std[2]) + normalize.mean[2]
+ return images
+
+def get_max_preds(batch_heatmaps):
+ '''
+ get predictions from score maps
+ heatmaps: numpy.ndarray([batch_size, num_joints, height, width])
+ '''
+ assert isinstance(batch_heatmaps, np.ndarray), \
+ 'batch_heatmaps should be numpy.ndarray'
+ assert batch_heatmaps.ndim == 4, 'batch_images should be 4-ndim'
+
+ batch_size = batch_heatmaps.shape[0]
+ num_joints = batch_heatmaps.shape[1]
+ width = batch_heatmaps.shape[3]
+ heatmaps_reshaped = batch_heatmaps.reshape((batch_size, num_joints, -1))
+ idx = np.argmax(heatmaps_reshaped, 2) ## B x 17
+ maxvals = np.amax(heatmaps_reshaped, 2) ## B x 17
+
+ maxvals = maxvals.reshape((batch_size, num_joints, 1)) ## B x 17 x 1
+ idx = idx.reshape((batch_size, num_joints, 1)) ## B x 17 x 1
+
+ preds = np.tile(idx, (1, 1, 2)).astype(np.float32) ## B x 17 x 2, like repeat in pytorch
+
+ preds[:, :, 0] = (preds[:, :, 0]) % width
+ preds[:, :, 1] = np.floor((preds[:, :, 1]) / width)
+
+ pred_mask = np.tile(np.greater(maxvals, 0.0), (1, 1, 2))
+ pred_mask = pred_mask.astype(np.float32)
+
+ preds *= pred_mask
+ return preds, maxvals
+
+
+def save_batch_heatmaps(batch_image, batch_heatmaps, file_name, normalize=True, scale=4, is_rgb=True):
+ '''
+ batch_image: [batch_size, channel, height, width]
+ batch_heatmaps: ['batch_size, num_joints, height, width]
+ file_name: saved file name
+ '''
+ ## normalize image
+ if normalize:
+ batch_image = batch_image.clone()
+ min = float(batch_image.min())
+ max = float(batch_image.max())
+
+ batch_image.add_(-min).div_(max - min + 1e-5)
+
+ ## check if type of batch_heatmaps is numpy.ndarray
+ if isinstance(batch_heatmaps, np.ndarray):
+ preds, maxvals = get_max_preds(batch_heatmaps)
+ batch_heatmaps = torch.from_numpy(batch_heatmaps)
+ else:
+ preds, maxvals = get_max_preds(batch_heatmaps.detach().cpu().numpy())
+
+ preds = preds*scale ## scale to original image size
+
+ batch_size = batch_heatmaps.size(0)
+ num_joints = batch_heatmaps.size(1)
+ heatmap_height = int(batch_heatmaps.size(2)*scale)
+ heatmap_width = int(batch_heatmaps.size(3)*scale)
+
+ grid_image = np.zeros((batch_size*heatmap_height,
+ (num_joints+1)*heatmap_width,
+ 3),
+ dtype=np.uint8)
+
+ for i in range(batch_size):
+ image = batch_image[i].mul(255)\
+ .clamp(0, 255)\
+ .byte()\
+ .permute(1, 2, 0)\
+ .cpu().numpy()
+ heatmaps = batch_heatmaps[i].mul(255)\
+ .clamp(0, 255)\
+ .byte()\
+ .cpu().numpy()
+
+ if is_rgb == True:
+ image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
+ resized_image = cv2.resize(image, (int(heatmap_width), int(heatmap_height)))
+
+ height_begin = heatmap_height * i
+ height_end = heatmap_height * (i + 1)
+ for j in range(num_joints):
+ cv2.circle(resized_image,
+ (int(preds[i][j][0]), int(preds[i][j][1])),
+ 1, [0, 0, 255], 1)
+ heatmap = heatmaps[j, :, :]
+ colored_heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
+ colored_heatmap = cv2.resize(colored_heatmap, (int(heatmap_width), int(heatmap_height)))
+ masked_image = colored_heatmap*0.7 + resized_image*0.3
+ cv2.circle(masked_image,
+ (int(preds[i][j][0]), int(preds[i][j][1])),
+ 1, [0, 0, 255], 1)
+
+ width_begin = heatmap_width * (j+1)
+ width_end = heatmap_width * (j+2)
+ grid_image[height_begin:height_end, width_begin:width_end, :] = \
+ masked_image
+
+ grid_image[height_begin:height_end, 0:heatmap_width, :] = resized_image
+
+ cv2.imwrite(file_name, grid_image)
+
+
+def save_batch_image_with_joints(batch_image, batch_heatmaps, batch_target_weight, file_name, is_rgb=True, scale=4, nrow=8, padding=2):
+ '''
+ batch_image: [batch_size, channel, height, width]
+ batch_joints: [batch_size, num_joints, 3],
+ batch_joints_vis: [batch_size, num_joints, 1],
+ }
+ '''
+
+ B, C, H, W = batch_image.size()
+ num_joints = batch_heatmaps.size(1)
+
+ ## check if type of batch_heatmaps is numpy.ndarray
+ if isinstance(batch_heatmaps, np.ndarray):
+ batch_joints, _ = get_max_preds(batch_heatmaps)
+ else:
+ batch_joints, _ = get_max_preds(batch_heatmaps.detach().cpu().numpy())
+
+ batch_joints = batch_joints*scale ## 4 is the ratio of output heatmap and input image
+
+ if isinstance(batch_joints, torch.Tensor):
+ batch_joints = batch_joints.cpu().numpy()
+
+ if isinstance(batch_target_weight, torch.Tensor):
+ batch_target_weight = batch_target_weight.cpu().numpy()
+ batch_target_weight = batch_target_weight.reshape(B, num_joints) ## B x 17
+
+ grid = []
+
+ for i in range(B):
+ image = batch_image[i].permute(1, 2, 0).cpu().numpy() #image_size x image_size x RGB
+ image = image.copy()
+ kps = batch_joints[i]
+
+ kps_vis = batch_target_weight[i].reshape(num_joints, 1)
+ kps = np.concatenate((kps, kps_vis), axis=1)
+
+ ## we need rgb images. if BGR convert to RGB
+ if is_rgb == False:
+ image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
+
+ kp_vis_image = coco_vis_keypoints(image, kps, vis_thres=0.3, alpha=0.7) ## H, W, C
+ kp_vis_image = kp_vis_image.transpose((2, 0, 1)).astype(np.float32)
+ kp_vis_image = torch.from_numpy(kp_vis_image.copy())
+ grid.append(kp_vis_image)
+
+ grid = torchvision.utils.make_grid(grid, nrow, padding)
+ ndarr = grid.byte().permute(1, 2, 0).cpu().numpy()
+ ndarr = cv2.cvtColor(ndarr, cv2.COLOR_RGB2BGR)
+ cv2.imwrite(file_name, ndarr)
+ return
+
+
+###------------------------vis-------------------------------
+# standard COCO format, 17 joints
+COCO_KP_ORDER = [
+ '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'
+ ]
+
+
+def kp_connections(keypoints):
+ kp_lines = [
+ [keypoints.index('left_eye'), keypoints.index('right_eye')],
+ [keypoints.index('left_eye'), keypoints.index('nose')],
+ [keypoints.index('right_eye'), keypoints.index('nose')],
+ [keypoints.index('right_eye'), keypoints.index('right_ear')],
+ [keypoints.index('left_eye'), keypoints.index('left_ear')],
+ [keypoints.index('right_shoulder'), keypoints.index('right_elbow')],
+ [keypoints.index('right_elbow'), keypoints.index('right_wrist')],
+ [keypoints.index('left_shoulder'), keypoints.index('left_elbow')],
+ [keypoints.index('left_elbow'), keypoints.index('left_wrist')],
+ [keypoints.index('right_hip'), keypoints.index('right_knee')],
+ [keypoints.index('right_knee'), keypoints.index('right_ankle')],
+ [keypoints.index('left_hip'), keypoints.index('left_knee')],
+ [keypoints.index('left_knee'), keypoints.index('left_ankle')],
+ [keypoints.index('right_shoulder'), keypoints.index('left_shoulder')],
+ [keypoints.index('right_hip'), keypoints.index('left_hip')],
+ ]
+ return kp_lines
+
+
+COCO_KP_CONNECTIONS = kp_connections(COCO_KP_ORDER)
+
+# ------------------------------------------------------------------------------------
+def coco_vis_keypoints(image, kps, vis_thres=0.3, alpha=0.7):
+ # image is [image_size, image_size, RGB] #numpy array
+ # kps is [17, 3] #numpy array
+ kps = kps.astype(np.int16)
+ bgr_image = image[:, :, ::-1] ##if this is directly in function call, this produces weird opecv cv2 Umat errors
+ kp_image = vis_keypoints(bgr_image, kps.T, vis_thres, alpha) #convert to bgr
+ kp_image = kp_image[:, :, ::-1] #bgr to rgb
+
+ return kp_image
+
+# ------------------------------------------------------------------------------------
+def vis_keypoints(img, kps, kp_thresh=-1, alpha=0.7):
+ """Visualizes keypoints (adapted from vis_one_image).
+ kps has shape (3, #keypoints) where 3 rows are (x, y, depth z).
+ needs a BGR image as it only uses opencv functions, returns a bgr image
+ """
+ dataset_keypoints = COCO_KP_ORDER
+ kp_lines = COCO_KP_CONNECTIONS
+
+ # Convert from plt 0-1 RGBA colors to 0-255 BGR colors for opencv.
+ cmap = plt.get_cmap('rainbow')
+ colors = [cmap(i) for i in np.linspace(0, 1, len(kp_lines) + 2)]
+ colors = [(c[2] * 255, c[1] * 255, c[0] * 255) for c in colors]
+
+ # Perform the drawing on a copy of the image, to allow for blending.
+ kp_mask = np.copy(img)
+
+ # Draw mid shoulder / mid hip first for better visualization.
+ mid_shoulder = (
+ kps[:2, dataset_keypoints.index('right_shoulder')] +
+ kps[:2, dataset_keypoints.index('left_shoulder')]) // 2
+ sc_mid_shoulder = np.minimum(
+ kps[2, dataset_keypoints.index('right_shoulder')],
+ kps[2, dataset_keypoints.index('left_shoulder')])
+ mid_hip = (
+ kps[:2, dataset_keypoints.index('right_hip')] +
+ kps[:2, dataset_keypoints.index('left_hip')]) // 2
+ sc_mid_hip = np.minimum(
+ kps[2, dataset_keypoints.index('right_hip')],
+ kps[2, dataset_keypoints.index('left_hip')])
+ nose_idx = dataset_keypoints.index('nose')
+
+ if sc_mid_shoulder > kp_thresh and kps[2, nose_idx] > kp_thresh:
+ kp_mask = cv2.line(
+ kp_mask, tuple(mid_shoulder), tuple(kps[:2, nose_idx]),
+ color=colors[len(kp_lines)], thickness=2, lineType=cv2.LINE_AA)
+ if sc_mid_shoulder > kp_thresh and sc_mid_hip > kp_thresh:
+ kp_mask = cv2.line(
+ kp_mask, tuple(mid_shoulder), tuple(mid_hip),
+ color=colors[len(kp_lines) + 1], thickness=2, lineType=cv2.LINE_AA)
+
+ # Draw the keypoints.
+ for l in range(len(kp_lines)):
+ i1 = kp_lines[l][0]
+ i2 = kp_lines[l][1]
+ p1 = kps[0, i1], kps[1, i1]
+ p2 = kps[0, i2], kps[1, i2]
+ if kps[2, i1] > kp_thresh and kps[2, i2] > kp_thresh:
+ kp_mask = cv2.line(
+ kp_mask, p1, p2,
+ color=colors[l], thickness=2, lineType=cv2.LINE_AA)
+ if kps[2, i1] > kp_thresh:
+ kp_mask = cv2.circle(
+ kp_mask, p1,
+ radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA)
+ if kps[2, i2] > kp_thresh:
+ kp_mask = cv2.circle(
+ kp_mask, p2,
+ radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA)
+
+ ## weird opencv bug on cv2UMat vs numpy
+ if type(kp_mask) != type(img):
+ kp_mask = kp_mask.get()
+
+ # Blend the keypoints.
+ result = cv2.addWeighted(img, 1.0 - alpha, kp_mask, alpha, 0)
+ return result
\ No newline at end of file
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/ema_hook.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/ema_hook.py
new file mode 100644
index 0000000000000000000000000000000000000000..339370118cc686c37b9af107319bf30f7e2f23b7
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/ema_hook.py
@@ -0,0 +1,74 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import math
+from typing import Optional
+
+import torch
+import torch.nn as nn
+from mmengine.model import ExponentialMovingAverage
+from torch import Tensor
+
+from mmpose.registry import MODELS
+
+
+@MODELS.register_module()
+class ExpMomentumEMA(ExponentialMovingAverage):
+ """Exponential moving average (EMA) with exponential momentum strategy,
+ which is used in YOLOX.
+
+ Ported from ` the implementation of MMDetection
+ `_.
+
+ Args:
+ model (nn.Module): The model to be averaged.
+ momentum (float): The momentum used for updating ema parameter.
+ Ema's parameter are updated with the formula:
+ `averaged_param = (1-momentum) * averaged_param + momentum *
+ source_param`. Defaults to 0.0002.
+ gamma (int): Use a larger momentum early in training and gradually
+ annealing to a smaller value to update the ema model smoothly. The
+ momentum is calculated as
+ `(1 - momentum) * exp(-(1 + steps) / gamma) + momentum`.
+ Defaults to 2000.
+ interval (int): Interval between two updates. Defaults to 1.
+ device (torch.device, optional): If provided, the averaged model will
+ be stored on the :attr:`device`. Defaults to None.
+ update_buffers (bool): if True, it will compute running averages for
+ both the parameters and the buffers of the model. Defaults to
+ False.
+ """
+
+ def __init__(self,
+ model: nn.Module,
+ momentum: float = 0.0002,
+ gamma: int = 2000,
+ interval=1,
+ device: Optional[torch.device] = None,
+ update_buffers: bool = False) -> None:
+ super().__init__(
+ model=model,
+ momentum=momentum,
+ interval=interval,
+ device=device,
+ update_buffers=update_buffers)
+ assert gamma > 0, f'gamma must be greater than 0, but got {gamma}'
+ self.gamma = gamma
+
+ def avg_func(self, averaged_param: Tensor, source_param: Tensor,
+ steps: int) -> None:
+ """Compute the moving average of the parameters using the exponential
+ momentum strategy.
+
+ Args:
+ averaged_param (Tensor): The averaged parameters.
+ source_param (Tensor): The source parameters.
+ steps (int): The number of times the parameters have been
+ updated.
+ """
+ momentum = (1 - self.momentum) * math.exp(
+ -float(1 + steps) / self.gamma) + self.momentum
+ averaged_param.mul_(1 - momentum).add_(source_param, alpha=momentum)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/general_visualization_hook.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/general_visualization_hook.py
new file mode 100644
index 0000000000000000000000000000000000000000..300ce41f4c7d4414d4eb7c2a4d17573e4498ded5
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/general_visualization_hook.py
@@ -0,0 +1,307 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os
+import warnings
+from typing import Optional, Sequence
+
+import torch
+import numpy as np
+import cv2
+import mmcv
+import torchvision
+import torchvision.transforms as transforms
+import mmengine
+import mmengine.fileio as fileio
+from mmengine.hooks import Hook
+from mmengine.runner import Runner
+from mmengine.visualization import Visualizer
+from matplotlib import pyplot as plt
+from mmpose.registry import HOOKS
+from mmpose.structures import PoseDataSample, merge_data_samples
+from mmpose.registry import VISUALIZERS
+from mmengine.structures import InstanceData
+
+@HOOKS.register_module()
+class GeneralPoseVisualizationHook(Hook):
+ """
+ """
+
+ def __init__(
+ self,
+ enable: bool = False,
+ interval: int = 50,
+ kpt_thr: float = 0.3,
+ show: bool = False,
+ wait_time: float = 0.,
+ max_vis_samples: int = 16,
+ scale: int = 4,
+ line_width: int = 4,
+ radius: int = 4,
+ out_dir: Optional[str] = None,
+ backend_args: Optional[dict] = None,
+ ):
+ self._visualizer: Visualizer = Visualizer.get_current_instance()
+ self.interval = interval
+ self.kpt_thr = kpt_thr
+ self.show = show
+ if self.show:
+ # No need to think about vis backends.
+ self._visualizer._vis_backends = {}
+ warnings.warn('The show is True, it means that only '
+ 'the prediction results are visualized '
+ 'without storing data, so vis_backends '
+ 'needs to be excluded.')
+
+ self.wait_time = wait_time
+ self.enable = enable
+ self.out_dir = out_dir
+ self._test_index = 0
+ self.backend_args = backend_args
+ self.max_vis_samples = max_vis_samples
+ self.scale = scale
+ self.init_visualizer = False
+ self._visualizer.line_width = line_width
+ self._visualizer.radius = radius
+ return
+
+ def after_train_iter(self, runner: Runner, batch_idx: int, data_batch: dict,
+ outputs: Sequence[PoseDataSample]) -> None:
+ """Run after every ``self.interval`` validation iterations.
+
+ Args:
+ runner (:obj:`Runner`): The runner of the validation process.
+ batch_idx (int): The index of the current batch in the val loop.
+ data_batch (dict): Data from dataloader.
+ outputs (Sequence[:obj:`PoseDataSample`]): Outputs from model.
+ """
+ if self.enable is False:
+ return
+
+ # ## check if the rank is 0
+ if not runner.rank == 0:
+ return
+
+ # There is no guarantee that the same batch of images
+ # is visualized for each evaluation.
+ total_curr_iter = runner.iter
+
+ if total_curr_iter % self.interval != 0:
+ return
+
+ ## we divide by 255 to be compatible with the visualization functions
+ image = torch.cat([input.unsqueeze(dim=0)/255 for input in data_batch['inputs']], dim=0) ## B x 3 x H x W, not normalized in BGR format
+ output = outputs['vis_preds'].detach() ## B x 17 x H x W
+
+ batch_size = min(self.max_vis_samples, len(image))
+
+ if self.init_visualizer == False:
+ self._visualizer.set_dataset_meta(runner.train_dataloader.dataset.metainfo) ## this sets the skeleton and skeleton links colors
+ self.init_visualizer = True
+
+ image = image[:batch_size]
+ output = output[:batch_size]
+
+ target = []
+ for i in range(batch_size):
+ target.append(data_batch['data_samples'][i].get('gt_fields').get('heatmaps').unsqueeze(dim=0))
+
+ target = torch.cat(target, dim=0)
+
+ target_weight = []
+ for i in range(batch_size):
+ target_weight.append(data_batch['data_samples'][i].get('gt_instance_labels').get('keypoints_visible').unsqueeze(dim=0))
+ target_weight = torch.cat(target_weight, dim=0)
+
+ ##------------------------------------
+ vis_dir = os.path.join(runner.work_dir, 'vis_data')
+ if not os.path.exists(vis_dir):
+ os.makedirs(vis_dir, exist_ok=True)
+
+ prefix = os.path.join(vis_dir, 'train')
+ suffix = str(total_curr_iter).zfill(6)
+
+ original_image = image
+
+ self.save_batch_heatmaps(original_image, target, '{}_{}_hm_gt.jpg'.format(prefix, suffix), normalize=False, scale=self.scale, is_rgb=False)
+ self.save_batch_heatmaps(original_image, output, '{}_{}_hm_pred.jpg'.format(prefix, suffix), normalize=False, scale=self.scale, is_rgb=False)
+ self.save_batch_image_with_joints(255*original_image, target, target_weight, '{}_{}_gt.jpg'.format(prefix, suffix), scale=self.scale, is_rgb=False)
+ self.save_batch_image_with_joints(255*original_image, output, torch.ones_like(target_weight), '{}_{}_pred.jpg'.format(prefix, suffix), scale=self.scale, is_rgb=False)
+
+ return
+
+ def save_batch_heatmaps(self, batch_image, batch_heatmaps, file_name, normalize=True, scale=4, is_rgb=True, max_num_joints=17):
+ '''
+ batch_image: [batch_size, channel, height, width]
+ batch_heatmaps: ['batch_size, num_joints, height, width]
+ file_name: saved file name
+ '''
+ ## normalize image
+ if normalize:
+ batch_image = batch_image.clone()
+ min_val = float(batch_image.min())
+ max_val = float(batch_image.max())
+
+ batch_image.add_(-min_val).div_(max_val - min_val + 1e-5)
+
+ ## check if type of batch_heatmaps is numpy.ndarray
+ if isinstance(batch_heatmaps, np.ndarray):
+ preds, maxvals = get_max_preds(batch_heatmaps)
+ batch_heatmaps = torch.from_numpy(batch_heatmaps)
+ else:
+ preds, maxvals = get_max_preds(batch_heatmaps.detach().cpu().numpy())
+
+ preds = preds*scale ## scale to original image size
+
+ batch_size = batch_heatmaps.size(0)
+ num_joints = batch_heatmaps.size(1)
+ heatmap_height = int(batch_heatmaps.size(2)*scale)
+ heatmap_width = int(batch_heatmaps.size(3)*scale)
+
+ num_joints = min(max_num_joints, num_joints)
+
+ grid_image = np.zeros((batch_size*heatmap_height,
+ (num_joints+1)*heatmap_width,
+ 3),
+ dtype=np.uint8)
+
+ body_joint_order = range(max_num_joints)
+
+ for i in range(batch_size):
+ image = batch_image[i].mul(255)\
+ .clamp(0, 255)\
+ .byte()\
+ .permute(1, 2, 0)\
+ .cpu().numpy()
+ heatmaps = batch_heatmaps[i].mul(255)\
+ .clamp(0, 255)\
+ .byte()\
+ .cpu().numpy()
+
+ if is_rgb == True:
+ image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
+ resized_image = cv2.resize(image, (int(heatmap_width), int(heatmap_height)))
+
+ height_begin = heatmap_height * i
+ height_end = heatmap_height * (i + 1)
+ for j in range(num_joints):
+
+ joint_index = body_joint_order[j]
+
+ cv2.circle(resized_image,
+ (int(preds[i][joint_index][0]), int(preds[i][joint_index][1])),
+ 1, [0, 0, 255], 1)
+ heatmap = heatmaps[joint_index, :, :]
+ colored_heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
+ colored_heatmap = cv2.resize(colored_heatmap, (int(heatmap_width), int(heatmap_height)))
+ masked_image = colored_heatmap*0.7 + resized_image*0.3
+ cv2.circle(masked_image,
+ (int(preds[i][joint_index][0]), int(preds[i][joint_index][1])),
+ 1, [0, 0, 255], 1)
+
+ width_begin = heatmap_width * (j+1)
+ width_end = heatmap_width * (j+2)
+ grid_image[height_begin:height_end, width_begin:width_end, :] = \
+ masked_image
+
+ grid_image[height_begin:height_end, 0:heatmap_width, :] = resized_image
+
+ cv2.imwrite(file_name, grid_image)
+ return
+
+
+ def save_batch_image_with_joints(self, batch_image, batch_heatmaps, batch_target_weight, file_name, dataset_info=None, is_rgb=True, scale=4, nrow=8, padding=2):
+ '''
+ batch_image: [batch_size, channel, height, width]
+ batch_joints: [batch_size, num_joints, 3],
+ batch_joints_vis: [batch_size, num_joints, 1],
+ }
+ '''
+
+ B, C, H, W = batch_image.size()
+ num_joints = batch_heatmaps.size(1)
+
+ ## check if type of batch_heatmaps is numpy.ndarray
+ if isinstance(batch_heatmaps, np.ndarray):
+ batch_joints, batch_scores = get_max_preds(batch_heatmaps)
+ else:
+ batch_joints, batch_scores = get_max_preds(batch_heatmaps.detach().cpu().numpy())
+
+ batch_joints = batch_joints*scale ## 4 is the ratio of output heatmap and input image
+
+ if isinstance(batch_joints, torch.Tensor):
+ batch_joints = batch_joints.cpu().numpy()
+
+ if isinstance(batch_target_weight, torch.Tensor):
+ batch_target_weight = batch_target_weight.cpu().numpy()
+ batch_target_weight = batch_target_weight.reshape(B, num_joints) ## B x 17
+
+ grid = []
+
+ for i in range(B):
+ image = batch_image[i].permute(1, 2, 0).cpu().numpy() #image_size x image_size x BGR. if is_rgb is False.
+ image = image.copy()
+ kps = batch_joints[i]
+ kps_vis = batch_target_weight[i]
+ kps_score = batch_scores[i].reshape(-1)
+
+ if is_rgb == False:
+ image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # convert bgr to rgb image
+
+ instances = InstanceData(metainfo=dict(keypoints=[kps], keypoints_visible=[kps_vis], keypoint_scores=[kps_score]))
+ kp_vis_image = self._visualizer._draw_instances_kpts(image, instances=instances) ## H, W, C, rgb image
+ kp_vis_image = cv2.cvtColor(kp_vis_image, cv2.COLOR_RGB2BGR) ## convert rgb to bgr image
+
+ kp_vis_image = kp_vis_image.transpose((2, 0, 1)).astype(np.float32)
+ kp_vis_image = torch.from_numpy(kp_vis_image.copy())
+ grid.append(kp_vis_image)
+
+ grid = torchvision.utils.make_grid(grid, nrow, padding)
+ ndarr = grid.byte().permute(1, 2, 0).cpu().numpy()
+ cv2.imwrite(file_name, ndarr)
+ return
+
+
+###------------------helpers-----------------------
+###------------------------------------------------------
+def batch_unnormalize_image(images, mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375]):
+ normalize = transforms.Normalize(mean=mean, std=std)
+ images[:, 0, :, :] = (images[:, 0, :, :]*normalize.std[0]) + normalize.mean[0]
+ images[:, 1, :, :] = (images[:, 1, :, :]*normalize.std[1]) + normalize.mean[1]
+ images[:, 2, :, :] = (images[:, 2, :, :]*normalize.std[2]) + normalize.mean[2]
+ return images
+
+def get_max_preds(batch_heatmaps):
+ '''
+ get predictions from score maps
+ heatmaps: numpy.ndarray([batch_size, num_joints, height, width])
+ '''
+ assert isinstance(batch_heatmaps, np.ndarray), \
+ 'batch_heatmaps should be numpy.ndarray'
+ assert batch_heatmaps.ndim == 4, 'batch_images should be 4-ndim'
+
+ batch_size = batch_heatmaps.shape[0]
+ num_joints = batch_heatmaps.shape[1]
+ width = batch_heatmaps.shape[3]
+ heatmaps_reshaped = batch_heatmaps.reshape((batch_size, num_joints, -1))
+ idx = np.argmax(heatmaps_reshaped, 2) ## B x 17
+ maxvals = np.amax(heatmaps_reshaped, 2) ## B x 17
+
+ maxvals = maxvals.reshape((batch_size, num_joints, 1)) ## B x 17 x 1
+ idx = idx.reshape((batch_size, num_joints, 1)) ## B x 17 x 1
+
+ preds = np.tile(idx, (1, 1, 2)).astype(np.float32) ## B x 17 x 2, like repeat in pytorch
+
+ preds[:, :, 0] = (preds[:, :, 0]) % width
+ preds[:, :, 1] = np.floor((preds[:, :, 1]) / width)
+
+ pred_mask = np.tile(np.greater(maxvals, 0.0), (1, 1, 2))
+ pred_mask = pred_mask.astype(np.float32)
+
+ preds *= pred_mask
+ return preds, maxvals
+
+# ------------------------------------------------------------------------------------
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/pose3d_visualization_hook.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/pose3d_visualization_hook.py
new file mode 100644
index 0000000000000000000000000000000000000000..2e87d68a29be37bfb5a577f55c7d7e8dee91701c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/pose3d_visualization_hook.py
@@ -0,0 +1,299 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os
+import warnings
+from typing import Optional, Sequence
+
+import torch
+import numpy as np
+import cv2
+import mmcv
+import torchvision
+import torchvision.transforms as transforms
+import mmengine
+import mmengine.fileio as fileio
+from mmengine.hooks import Hook
+from mmengine.runner import Runner
+from mmengine.visualization import Visualizer
+from matplotlib import pyplot as plt
+from mmpose.registry import HOOKS
+from mmpose.structures import PoseDataSample, merge_data_samples
+from mmpose.registry import VISUALIZERS
+from mmengine.structures import InstanceData
+
+@HOOKS.register_module()
+class Pose3dVisualizationHook(Hook):
+ def __init__(
+ self,
+ enable: bool = False,
+ interval: int = 50,
+ kpt_thr: float = 0.3,
+ show: bool = False,
+ wait_time: float = 0.,
+ max_vis_samples: int = 16,
+ scale: int = 4,
+ line_width: int = 4,
+ radius: int = 4,
+ out_dir: Optional[str] = None,
+ backend_args: Optional[dict] = None,
+ ):
+ self._visualizer: Visualizer = Visualizer.get_current_instance()
+ self.interval = interval
+ self.kpt_thr = kpt_thr
+ self.show = show
+ if self.show:
+ # No need to think about vis backends.
+ self._visualizer._vis_backends = {}
+ warnings.warn('The show is True, it means that only '
+ 'the prediction results are visualized '
+ 'without storing data, so vis_backends '
+ 'needs to be excluded.')
+
+ self.wait_time = wait_time
+ self.enable = enable
+ self.out_dir = out_dir
+ self._test_index = 0
+ self.backend_args = backend_args
+ self.max_vis_samples = max_vis_samples
+ self.scale = scale
+ self.init_visualizer = False
+ self._visualizer.line_width = line_width
+ self._visualizer.radius = radius
+ return
+
+ def after_train_iter(self, runner: Runner, batch_idx: int, data_batch: dict,
+ outputs: Sequence[PoseDataSample]) -> None:
+ """Run after every ``self.interval`` validation iterations.
+
+ Args:
+ runner (:obj:`Runner`): The runner of the validation process.
+ batch_idx (int): The index of the current batch in the val loop.
+ data_batch (dict): Data from dataloader.
+ outputs (Sequence[:obj:`PoseDataSample`]): Outputs from model.
+ """
+ if self.enable is False:
+ return
+
+ # ## check if the rank is 0
+ if not runner.rank == 0:
+ return
+
+ # There is no guarantee that the same batch of images
+ # is visualized for each evaluation.
+ total_curr_iter = runner.iter
+
+ if total_curr_iter % self.interval != 0:
+ return
+
+ ## we divide by 255 to be compatible with the visualization functions
+ image = torch.cat([input.unsqueeze(dim=0)/255 for input in data_batch['inputs']], dim=0) ## B x 3 x H x W, not normalized in BGR format
+ output = outputs['vis_preds']['pose2d'].detach() ## B x 308 x 2
+ output_pose3d = outputs['vis_preds']['pose3d'].detach() ## B x 308 x 3
+
+ batch_size = min(self.max_vis_samples, len(image))
+
+ if self.init_visualizer == False:
+ self._visualizer.set_dataset_meta(runner.train_dataloader.dataset.metainfo) ## this sets the skeleton and skeleton links colors
+ self.init_visualizer = True
+
+ image = image[:batch_size]
+ output = output[:batch_size]
+ output_pose3d = output_pose3d[:batch_size].detach().cpu() ## B x 308 x 3
+
+ # target = []
+ # for i in range(batch_size):
+ # target.append(torch.tensor(data_batch['data_samples'][i].get('gt_instances').get('transformed_keypoints')))
+ # target = torch.cat(target, dim=0) ## B x 308 x 2
+
+ target = []
+ for i in range(batch_size):
+ target.append(data_batch['data_samples'][i].get('gt_fields').get('heatmaps').unsqueeze(dim=0))
+ target = torch.cat(target, dim=0)
+
+ target_weight = []
+ for i in range(batch_size):
+ target_weight.append(torch.tensor(data_batch['data_samples'][i].get('gt_instances').get('keypoints_visible')))
+ target_weight = torch.cat(target_weight, dim=0) ## B x 308
+
+ gt_K = []
+ for i in range(batch_size):
+ gt_K.append(torch.from_numpy(data_batch['data_samples'][i].K.astype(np.float32)).unsqueeze(dim=0)) ## 3 x 3
+ gt_K = torch.cat(gt_K, dim=0) ## B x 3 x 3
+
+ gt_pose3d = []
+ for i in range(batch_size):
+ gt_pose3d.append(torch.from_numpy(data_batch['data_samples'][i].gt_instances.pose3d[0].astype(np.float32)))
+ gt_pose3d = torch.stack(gt_pose3d) ## B x 308 x 4
+
+ ## compute pose2d_from_pose3d using gt_K
+ pose2d_homogeneous = torch.bmm(output_pose3d, gt_K.transpose(1, 2)) # [B, 308, 3]
+ pose2d = pose2d_homogeneous[:, :, :2] / (pose2d_homogeneous[:, :, 2:3] + 1e-5)
+
+ gt_pose2d_homogeneous = torch.bmm(gt_pose3d, gt_K.transpose(1, 2)) # [B, 308, 3]
+ gt_pose2d = gt_pose2d_homogeneous[:, :, :2] / (gt_pose2d_homogeneous[:, :, 2:3] + 1e-5)
+ ##------------------------------------
+ pose2d_vis_dir = os.path.join(runner.work_dir, 'vis_data', '2d')
+ pose3d_vis_dir = os.path.join(runner.work_dir, 'vis_data', '3d')
+
+ if not os.path.exists(pose2d_vis_dir):
+ os.makedirs(pose2d_vis_dir, exist_ok=True)
+
+ if not os.path.exists(pose3d_vis_dir):
+ os.makedirs(pose3d_vis_dir, exist_ok=True)
+
+ pose2d_prefix = os.path.join(pose2d_vis_dir, 'train')
+ pose3d_prefix = os.path.join(pose3d_vis_dir, 'train')
+
+ suffix = str(total_curr_iter).zfill(6)
+
+ original_image = image
+
+ self.save_batch_image_with_joints(255*original_image, target, target_weight, '{}_{}_gt.jpg'.format(pose2d_prefix, suffix), scale=self.scale, is_rgb=False)
+ self.save_batch_image_with_joints(255*original_image, output, torch.ones_like(target_weight), '{}_{}_pred.jpg'.format(pose2d_prefix, suffix), scale=self.scale, is_rgb=False)
+ # self.save_batch_image_with_pose3d(255*original_image, target, target_weight, '{}_{}_gt.jpg'.format(pose2d_prefix, suffix), is_rgb=False)
+ # self.save_batch_image_with_pose3d(255*original_image, output, torch.ones_like(target_weight), '{}_{}_pred.jpg'.format(pose2d_prefix, suffix), is_rgb=False)
+
+ self.save_batch_image_with_pose3d(255*original_image, gt_pose2d, torch.ones_like(target_weight), '{}_{}_pose3d_gt.jpg'.format(pose3d_prefix, suffix), is_rgb=False)
+ self.save_batch_image_with_pose3d(255*original_image, pose2d, torch.ones_like(target_weight), '{}_{}_pose3d_pred.jpg'.format(pose3d_prefix, suffix), is_rgb=False)
+
+ return
+
+ def save_batch_image_with_pose3d(self, batch_image, batch_joints, batch_target_weight, file_name, dataset_info=None, is_rgb=True, nrow=8, padding=2):
+ B, C, H, W = batch_image.size()
+ num_joints = batch_joints.size(1)
+
+ if isinstance(batch_joints, torch.Tensor):
+ batch_joints = batch_joints.detach().cpu().numpy()
+
+ if isinstance(batch_target_weight, torch.Tensor):
+ batch_target_weight = batch_target_weight.cpu().numpy()
+ batch_target_weight = batch_target_weight.reshape(B, num_joints) ## B x 17
+
+ grid = []
+
+ for i in range(B):
+ image = batch_image[i].permute(1, 2, 0).cpu().numpy() #image_size x image_size x BGR. if is_rgb is False.
+ image = image.copy()
+ kps = batch_joints[i] ## N x 2
+ kps_vis = batch_target_weight[i]
+ kps_score = batch_target_weight[i]
+
+ ## set min val kps to 0.0
+ kps = np.maximum(kps, 0.0)
+ kps[:, 0] = np.minimum(kps[:, 0], image.shape[1]) ## x
+ kps[:, 1] = np.minimum(kps[:, 1], image.shape[0]) ## y
+
+ if is_rgb == False:
+ image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # convert bgr to rgb image
+
+ image = image.astype(np.uint8)
+
+ instances = InstanceData(metainfo=dict(keypoints=[kps], keypoints_visible=[kps_vis], keypoint_scores=[kps_score]))
+ kp_vis_image = self._visualizer._draw_instances_kpts(image, instances=instances) ## H, W, C, rgb image
+ kp_vis_image = cv2.cvtColor(kp_vis_image, cv2.COLOR_RGB2BGR) ## convert rgb to bgr image
+
+ kp_vis_image = kp_vis_image.transpose((2, 0, 1)).astype(np.float32)
+ kp_vis_image = torch.from_numpy(kp_vis_image.copy())
+ grid.append(kp_vis_image)
+
+ grid = torchvision.utils.make_grid(grid, nrow, padding)
+ ndarr = grid.byte().permute(1, 2, 0).cpu().numpy()
+ cv2.imwrite(file_name, ndarr)
+ return
+
+
+ def save_batch_image_with_joints(self, batch_image, batch_heatmaps, batch_target_weight, file_name, dataset_info=None, is_rgb=True, scale=4, nrow=8, padding=2):
+ '''
+ batch_image: [batch_size, channel, height, width]
+ batch_joints: [batch_size, num_joints, 3],
+ batch_joints_vis: [batch_size, num_joints, 1],
+ }
+ '''
+
+ B, C, H, W = batch_image.size()
+ num_joints = batch_heatmaps.size(1)
+
+ ## check if type of batch_heatmaps is numpy.ndarray
+ if isinstance(batch_heatmaps, np.ndarray):
+ batch_joints, batch_scores = get_max_preds(batch_heatmaps)
+ else:
+ batch_joints, batch_scores = get_max_preds(batch_heatmaps.detach().cpu().numpy())
+
+ batch_joints = batch_joints*scale ## 4 is the ratio of output heatmap and input image
+
+ if isinstance(batch_joints, torch.Tensor):
+ batch_joints = batch_joints.cpu().numpy()
+
+ if isinstance(batch_target_weight, torch.Tensor):
+ batch_target_weight = batch_target_weight.cpu().numpy()
+ batch_target_weight = batch_target_weight.reshape(B, num_joints) ## B x 17
+
+ grid = []
+
+ for i in range(B):
+ image = batch_image[i].permute(1, 2, 0).cpu().numpy() #image_size x image_size x BGR. if is_rgb is False.
+ image = image.copy()
+ kps = batch_joints[i]
+ kps_vis = batch_target_weight[i]
+ kps_score = batch_scores[i].reshape(-1)
+
+ if is_rgb == False:
+ image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # convert bgr to rgb image
+
+ instances = InstanceData(metainfo=dict(keypoints=[kps], keypoints_visible=[kps_vis], keypoint_scores=[kps_score]))
+ kp_vis_image = self._visualizer._draw_instances_kpts(image, instances=instances) ## H, W, C, rgb image
+ kp_vis_image = cv2.cvtColor(kp_vis_image, cv2.COLOR_RGB2BGR) ## convert rgb to bgr image
+
+ kp_vis_image = kp_vis_image.transpose((2, 0, 1)).astype(np.float32)
+ kp_vis_image = torch.from_numpy(kp_vis_image.copy())
+ grid.append(kp_vis_image)
+
+ grid = torchvision.utils.make_grid(grid, nrow, padding)
+ ndarr = grid.byte().permute(1, 2, 0).cpu().numpy()
+ cv2.imwrite(file_name, ndarr)
+ return
+
+###------------------helpers-----------------------
+###------------------------------------------------------
+def batch_unnormalize_image(images, mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375]):
+ normalize = transforms.Normalize(mean=mean, std=std)
+ images[:, 0, :, :] = (images[:, 0, :, :]*normalize.std[0]) + normalize.mean[0]
+ images[:, 1, :, :] = (images[:, 1, :, :]*normalize.std[1]) + normalize.mean[1]
+ images[:, 2, :, :] = (images[:, 2, :, :]*normalize.std[2]) + normalize.mean[2]
+ return images
+
+def get_max_preds(batch_heatmaps):
+ '''
+ get predictions from score maps
+ heatmaps: numpy.ndarray([batch_size, num_joints, height, width])
+ '''
+ assert isinstance(batch_heatmaps, np.ndarray), \
+ 'batch_heatmaps should be numpy.ndarray'
+ assert batch_heatmaps.ndim == 4, 'batch_images should be 4-ndim'
+
+ batch_size = batch_heatmaps.shape[0]
+ num_joints = batch_heatmaps.shape[1]
+ width = batch_heatmaps.shape[3]
+ heatmaps_reshaped = batch_heatmaps.reshape((batch_size, num_joints, -1))
+ idx = np.argmax(heatmaps_reshaped, 2) ## B x 17
+ maxvals = np.amax(heatmaps_reshaped, 2) ## B x 17
+
+ maxvals = maxvals.reshape((batch_size, num_joints, 1)) ## B x 17 x 1
+ idx = idx.reshape((batch_size, num_joints, 1)) ## B x 17 x 1
+
+ preds = np.tile(idx, (1, 1, 2)).astype(np.float32) ## B x 17 x 2, like repeat in pytorch
+
+ preds[:, :, 0] = (preds[:, :, 0]) % width
+ preds[:, :, 1] = np.floor((preds[:, :, 1]) / width)
+
+ pred_mask = np.tile(np.greater(maxvals, 0.0), (1, 1, 2))
+ pred_mask = pred_mask.astype(np.float32)
+
+ preds *= pred_mask
+ return preds, maxvals
+
+# ------------------------------------------------------------------------------------
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/visualization_hook.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/visualization_hook.py
new file mode 100644
index 0000000000000000000000000000000000000000..6ec0487c3e680dc29a12c184a74105d9bc7fcc34
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/hooks/visualization_hook.py
@@ -0,0 +1,182 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os
+import warnings
+from typing import Optional, Sequence
+
+import torch
+import numpy as np
+import cv2
+import mmcv
+import torchvision
+import torchvision.transforms as transforms
+import mmengine
+import mmengine.fileio as fileio
+from mmengine.hooks import Hook
+from mmengine.runner import Runner
+from mmengine.visualization import Visualizer
+from matplotlib import pyplot as plt
+from mmpose.registry import HOOKS
+from mmpose.structures import PoseDataSample, merge_data_samples
+
+
+@HOOKS.register_module()
+class PoseVisualizationHook(Hook):
+ """Pose Estimation Visualization Hook. Used to visualize validation and
+ testing process prediction results.
+
+ In the testing phase:
+
+ 1. If ``show`` is True, it means that only the prediction results are
+ visualized without storing data, so ``vis_backends`` needs to
+ be excluded.
+ 2. If ``out_dir`` is specified, it means that the prediction results
+ need to be saved to ``out_dir``. In order to avoid vis_backends
+ also storing data, so ``vis_backends`` needs to be excluded.
+ 3. ``vis_backends`` takes effect if the user does not specify ``show``
+ and `out_dir``. You can set ``vis_backends`` to WandbVisBackend or
+ TensorboardVisBackend to store the prediction result in Wandb or
+ Tensorboard.
+
+ Args:
+ enable (bool): whether to draw prediction results. If it is False,
+ it means that no drawing will be done. Defaults to False.
+ interval (int): The interval of visualization. Defaults to 50.
+ score_thr (float): The threshold to visualize the bboxes
+ and masks. Defaults to 0.3.
+ show (bool): Whether to display the drawn image. Default to False.
+ wait_time (float): The interval of show (s). Defaults to 0.
+ out_dir (str, optional): directory where painted images
+ will be saved in testing process.
+ backend_args (dict, optional): Arguments to instantiate the preifx of
+ uri corresponding backend. Defaults to None.
+ """
+
+ def __init__(
+ self,
+ enable: bool = False,
+ interval: int = 50,
+ kpt_thr: float = 0.3,
+ show: bool = False,
+ wait_time: float = 0.,
+ max_vis_samples: int = 16,
+ scale: int = 4,
+ out_dir: Optional[str] = None,
+ backend_args: Optional[dict] = None,
+ ):
+ self._visualizer: Visualizer = Visualizer.get_current_instance()
+ self.interval = interval
+ self.kpt_thr = kpt_thr
+ self.show = show
+ if self.show:
+ # No need to think about vis backends.
+ self._visualizer._vis_backends = {}
+ warnings.warn('The show is True, it means that only '
+ 'the prediction results are visualized '
+ 'without storing data, so vis_backends '
+ 'needs to be excluded.')
+
+ self.wait_time = wait_time
+ self.enable = enable
+ self.out_dir = out_dir
+ self._test_index = 0
+ self.backend_args = backend_args
+ self.max_vis_samples = max_vis_samples
+ self.scale = scale
+
+ def after_val_iter(self, runner: Runner, batch_idx: int, data_batch: dict,
+ outputs: Sequence[PoseDataSample]) -> None:
+ """Run after every ``self.interval`` validation iterations.
+
+ Args:
+ runner (:obj:`Runner`): The runner of the validation process.
+ batch_idx (int): The index of the current batch in the val loop.
+ data_batch (dict): Data from dataloader.
+ outputs (Sequence[:obj:`PoseDataSample`]): Outputs from model.
+ """
+ if self.enable is False:
+ return
+
+ self._visualizer.set_dataset_meta(runner.val_evaluator.dataset_meta)
+
+ # There is no guarantee that the same batch of images
+ # is visualized for each evaluation.
+ total_curr_iter = runner.iter + batch_idx
+
+ # Visualize only the first data
+ img_path = data_batch['data_samples'][0].get('img_path')
+ img_bytes = fileio.get(img_path, backend_args=self.backend_args)
+ img = mmcv.imfrombytes(img_bytes, channel_order='rgb')
+ data_sample = outputs[0]
+
+ # revert the heatmap on the original image
+ data_sample = merge_data_samples([data_sample])
+
+ if total_curr_iter % self.interval == 0:
+ self._visualizer.add_datasample(
+ os.path.basename(img_path) if self.show else 'val_img',
+ img,
+ data_sample=data_sample,
+ draw_gt=False,
+ draw_bbox=True,
+ draw_heatmap=True,
+ show=self.show,
+ wait_time=self.wait_time,
+ kpt_thr=self.kpt_thr,
+ step=total_curr_iter)
+
+ def after_test_iter(self, runner: Runner, batch_idx: int, data_batch: dict,
+ outputs: Sequence[PoseDataSample]) -> None:
+ """Run after every testing iterations.
+
+ Args:
+ runner (:obj:`Runner`): The runner of the testing process.
+ batch_idx (int): The index of the current batch in the test loop.
+ data_batch (dict): Data from dataloader.
+ outputs (Sequence[:obj:`PoseDataSample`]): Outputs from model.
+ """
+ if self.enable is False:
+ return
+
+ if self.out_dir is not None:
+ self.out_dir = os.path.join(runner.work_dir, runner.timestamp,
+ self.out_dir)
+ mmengine.mkdir_or_exist(self.out_dir)
+
+ self._visualizer.set_dataset_meta(runner.test_evaluator.dataset_meta)
+
+ for data_sample in outputs:
+ self._test_index += 1
+
+ img_path = data_sample.get('img_path')
+ img_bytes = fileio.get(img_path, backend_args=self.backend_args)
+ img = mmcv.imfrombytes(img_bytes, channel_order='rgb')
+ data_sample = merge_data_samples([data_sample])
+
+ out_file = None
+ if self.out_dir is not None:
+ out_file_name, postfix = os.path.basename(img_path).rsplit(
+ '.', 1)
+ index = len([
+ fname for fname in os.listdir(self.out_dir)
+ if fname.startswith(out_file_name)
+ ])
+ out_file = f'{out_file_name}_{index}.{postfix}'
+ out_file = os.path.join(self.out_dir, out_file)
+
+ self._visualizer.add_datasample(
+ os.path.basename(img_path) if self.show else 'test_img',
+ img,
+ data_sample=data_sample,
+ show=self.show,
+ draw_gt=False,
+ draw_bbox=True,
+ draw_heatmap=True,
+ wait_time=self.wait_time,
+ kpt_thr=self.kpt_thr,
+ out_file=out_file,
+ step=self._test_index)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/optim_wrappers/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/optim_wrappers/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..ded26e63e235c3494b3db785f11acb797dc60d0c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/optim_wrappers/__init__.py
@@ -0,0 +1,9 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .layer_decay_optim_wrapper import LayerDecayOptimWrapperConstructor
+
+__all__ = ['LayerDecayOptimWrapperConstructor']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/optim_wrappers/layer_decay_optim_wrapper.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/optim_wrappers/layer_decay_optim_wrapper.py
new file mode 100644
index 0000000000000000000000000000000000000000..8e3e0e299db750ade44f7d67b74bf696f2110e5c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/engine/optim_wrappers/layer_decay_optim_wrapper.py
@@ -0,0 +1,78 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmengine.dist.utils import get_dist_info
+from mmengine.optim import DefaultOptimWrapperConstructor
+from mmengine.registry import OPTIM_WRAPPER_CONSTRUCTORS
+
+
+def get_num_layer_for_vit(var_name, num_max_layer):
+ if var_name in ('backbone.cls_token', 'backbone.mask_token',
+ 'backbone.pos_embed'):
+ return 0
+ elif var_name.startswith('backbone.patch_embed'):
+ return 0
+ elif var_name.startswith('backbone.layers'):
+ layer_id = int(var_name.split('.')[2])
+ return layer_id + 1
+ else:
+ return num_max_layer - 1
+
+
+@OPTIM_WRAPPER_CONSTRUCTORS.register_module(force=True)
+class LayerDecayOptimWrapperConstructor(DefaultOptimWrapperConstructor):
+
+ def __init__(self, optim_wrapper_cfg, paramwise_cfg=None):
+ super().__init__(optim_wrapper_cfg, paramwise_cfg=None)
+ self.layer_decay_rate = paramwise_cfg.get('layer_decay_rate', 0.5)
+
+ super().__init__(optim_wrapper_cfg, paramwise_cfg)
+
+ def add_params(self, params, module, prefix='', lr=None):
+ parameter_groups = {}
+ print(self.paramwise_cfg)
+ num_layers = self.paramwise_cfg.get('num_layers') + 2
+ layer_decay_rate = self.paramwise_cfg.get('layer_decay_rate')
+ weight_decay = self.base_wd
+
+ for name, param in module.named_parameters():
+ if not param.requires_grad:
+ continue # frozen weights
+ if (len(param.shape) == 1 or name.endswith('.bias')
+ or 'pos_embed' in name):
+ group_name = 'no_decay'
+ this_weight_decay = 0.
+ else:
+ group_name = 'decay'
+ this_weight_decay = weight_decay
+ layer_id = get_num_layer_for_vit(name, num_layers)
+ group_name = 'layer_%d_%s' % (layer_id, group_name)
+
+ if group_name not in parameter_groups:
+ scale = layer_decay_rate**(num_layers - layer_id - 1)
+
+ parameter_groups[group_name] = {
+ 'weight_decay': this_weight_decay,
+ 'params': [],
+ 'param_names': [],
+ 'lr_scale': scale,
+ 'group_name': group_name,
+ 'lr': scale * self.base_lr,
+ }
+
+ parameter_groups[group_name]['params'].append(param)
+ parameter_groups[group_name]['param_names'].append(name)
+ rank, _ = get_dist_info()
+ if rank == 0:
+ to_display = {}
+ for key in parameter_groups:
+ to_display[key] = {
+ 'param_names': parameter_groups[key]['param_names'],
+ 'lr_scale': parameter_groups[key]['lr_scale'],
+ 'lr': parameter_groups[key]['lr'],
+ 'weight_decay': parameter_groups[key]['weight_decay'],
+ }
+ params.extend(parameter_groups.values())
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..b15d8feb01d3999cd9aad7b4b746aa05b55a5617
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/__init__.py
@@ -0,0 +1,8 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .functional import * # noqa: F401,F403
+from .metrics import * # noqa: F401,F403
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..73eb6b7c7f0d97ee7068661dceadd7c628c8fdec
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..0cfa56fb365ed1d2e9c9e57c763243aa1a912ae5
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/__init__.py
@@ -0,0 +1,17 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .keypoint_eval import (keypoint_auc, keypoint_epe, keypoint_mpjpe,
+ keypoint_nme, keypoint_pck_accuracy,
+ multilabel_classification_accuracy,
+ pose_pck_accuracy, simcc_pck_accuracy)
+from .nms import nms, oks_nms, soft_oks_nms
+
+__all__ = [
+ 'keypoint_pck_accuracy', 'keypoint_auc', 'keypoint_nme', 'keypoint_epe',
+ 'pose_pck_accuracy', 'multilabel_classification_accuracy',
+ 'simcc_pck_accuracy', 'nms', 'oks_nms', 'soft_oks_nms', 'keypoint_mpjpe'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..36e96856443e7d0e6b1fd4974f0e7c46199ee539
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/__pycache__/keypoint_eval.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/__pycache__/keypoint_eval.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7b2f6009a1c1dd1270bdfec6f17f77ac10d49f30
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/__pycache__/keypoint_eval.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/__pycache__/mesh_eval.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/__pycache__/mesh_eval.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e472b7ab69a45cf90b85bd23e07966c76ff7cdbc
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/__pycache__/mesh_eval.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/__pycache__/nms.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/__pycache__/nms.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c2b089aa0bf0d8857559f049fb7151d6b8cfc36f
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/__pycache__/nms.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/keypoint_eval.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/keypoint_eval.py
new file mode 100644
index 0000000000000000000000000000000000000000..be77cebd60e4c13e43c6ced4e21cc95b239c819c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/keypoint_eval.py
@@ -0,0 +1,380 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional, Tuple
+
+import numpy as np
+
+from mmpose.codecs.utils import get_heatmap_maximum, get_simcc_maximum
+from .mesh_eval import compute_similarity_transform
+
+
+def _calc_distances(preds: np.ndarray, gts: np.ndarray, mask: np.ndarray,
+ norm_factor: np.ndarray) -> np.ndarray:
+ """Calculate the normalized distances between preds and target.
+
+ Note:
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D (normally, D=2 or D=3)
+
+ Args:
+ preds (np.ndarray[N, K, D]): Predicted keypoint location.
+ gts (np.ndarray[N, K, D]): Groundtruth keypoint location.
+ mask (np.ndarray[N, K]): Visibility of the target. False for invisible
+ joints, and True for visible. Invisible joints will be ignored for
+ accuracy calculation.
+ norm_factor (np.ndarray[N, D]): Normalization factor.
+ Typical value is heatmap_size.
+
+ Returns:
+ np.ndarray[K, N]: The normalized distances. \
+ If target keypoints are missing, the distance is -1.
+ """
+ N, K, _ = preds.shape
+ # set mask=0 when norm_factor==0
+ _mask = mask.copy()
+ _mask[np.where((norm_factor == 0).sum(1))[0], :] = False
+
+ distances = np.full((N, K), -1, dtype=np.float32)
+ # handle invalid values
+ norm_factor[np.where(norm_factor <= 0)] = 1e6
+ distances[_mask] = np.linalg.norm(
+ ((preds - gts) / norm_factor[:, None, :])[_mask], axis=-1)
+ return distances.T
+
+
+def _distance_acc(distances: np.ndarray, thr: float = 0.5) -> float:
+ """Return the percentage below the distance threshold, while ignoring
+ distances values with -1.
+
+ Note:
+ - instance number: N
+
+ Args:
+ distances (np.ndarray[N, ]): The normalized distances.
+ thr (float): Threshold of the distances.
+
+ Returns:
+ float: Percentage of distances below the threshold. \
+ If all target keypoints are missing, return -1.
+ """
+ distance_valid = distances != -1
+ num_distance_valid = distance_valid.sum()
+ if num_distance_valid > 0:
+ return (distances[distance_valid] < thr).sum() / num_distance_valid
+ return -1
+
+
+def keypoint_pck_accuracy(pred: np.ndarray, gt: np.ndarray, mask: np.ndarray,
+ thr: np.ndarray, norm_factor: np.ndarray) -> tuple:
+ """Calculate the pose accuracy of PCK for each individual keypoint and the
+ averaged accuracy across all keypoints for coordinates.
+
+ Note:
+ PCK metric measures accuracy of the localization of the body joints.
+ The distances between predicted positions and the ground-truth ones
+ are typically normalized by the bounding box size.
+ The threshold (thr) of the normalized distance is commonly set
+ as 0.05, 0.1 or 0.2 etc.
+
+ - instance number: N
+ - keypoint number: K
+
+ Args:
+ pred (np.ndarray[N, K, 2]): Predicted keypoint location.
+ gt (np.ndarray[N, K, 2]): Groundtruth keypoint location.
+ mask (np.ndarray[N, K]): Visibility of the target. False for invisible
+ joints, and True for visible. Invisible joints will be ignored for
+ accuracy calculation.
+ thr (float): Threshold of PCK calculation.
+ norm_factor (np.ndarray[N, 2]): Normalization factor for H&W.
+
+ Returns:
+ tuple: A tuple containing keypoint accuracy.
+
+ - acc (np.ndarray[K]): Accuracy of each keypoint.
+ - avg_acc (float): Averaged accuracy across all keypoints.
+ - cnt (int): Number of valid keypoints.
+ """
+ distances = _calc_distances(pred, gt, mask, norm_factor)
+ acc = np.array([_distance_acc(d, thr) for d in distances])
+ valid_acc = acc[acc >= 0]
+ cnt = len(valid_acc)
+ avg_acc = valid_acc.mean() if cnt > 0 else 0.0
+ return acc, avg_acc, cnt
+
+
+def keypoint_auc(pred: np.ndarray,
+ gt: np.ndarray,
+ mask: np.ndarray,
+ norm_factor: np.ndarray,
+ num_thrs: int = 20) -> float:
+ """Calculate the Area under curve (AUC) of keypoint PCK accuracy.
+
+ Note:
+ - instance number: N
+ - keypoint number: K
+
+ Args:
+ pred (np.ndarray[N, K, 2]): Predicted keypoint location.
+ gt (np.ndarray[N, K, 2]): Groundtruth keypoint location.
+ mask (np.ndarray[N, K]): Visibility of the target. False for invisible
+ joints, and True for visible. Invisible joints will be ignored for
+ accuracy calculation.
+ norm_factor (float): Normalization factor.
+ num_thrs (int): number of thresholds to calculate auc.
+
+ Returns:
+ float: Area under curve (AUC) of keypoint PCK accuracy.
+ """
+ nor = np.tile(np.array([[norm_factor, norm_factor]]), (pred.shape[0], 1))
+ thrs = [1.0 * i / num_thrs for i in range(num_thrs)]
+ avg_accs = []
+ for thr in thrs:
+ _, avg_acc, _ = keypoint_pck_accuracy(pred, gt, mask, thr, nor)
+ avg_accs.append(avg_acc)
+
+ auc = 0
+ for i in range(num_thrs):
+ auc += 1.0 / num_thrs * avg_accs[i]
+ return auc
+
+
+def keypoint_nme(pred: np.ndarray, gt: np.ndarray, mask: np.ndarray,
+ normalize_factor: np.ndarray) -> float:
+ """Calculate the normalized mean error (NME).
+
+ Note:
+ - instance number: N
+ - keypoint number: K
+
+ Args:
+ pred (np.ndarray[N, K, 2]): Predicted keypoint location.
+ gt (np.ndarray[N, K, 2]): Groundtruth keypoint location.
+ mask (np.ndarray[N, K]): Visibility of the target. False for invisible
+ joints, and True for visible. Invisible joints will be ignored for
+ accuracy calculation.
+ normalize_factor (np.ndarray[N, 2]): Normalization factor.
+
+ Returns:
+ float: normalized mean error
+ """
+ distances = _calc_distances(pred, gt, mask, normalize_factor)
+ distance_valid = distances[distances != -1]
+ return distance_valid.sum() / max(1, len(distance_valid))
+
+
+def keypoint_epe(pred: np.ndarray, gt: np.ndarray, mask: np.ndarray) -> float:
+ """Calculate the end-point error.
+
+ Note:
+ - instance number: N
+ - keypoint number: K
+
+ Args:
+ pred (np.ndarray[N, K, 2]): Predicted keypoint location.
+ gt (np.ndarray[N, K, 2]): Groundtruth keypoint location.
+ mask (np.ndarray[N, K]): Visibility of the target. False for invisible
+ joints, and True for visible. Invisible joints will be ignored for
+ accuracy calculation.
+
+ Returns:
+ float: Average end-point error.
+ """
+
+ distances = _calc_distances(
+ pred, gt, mask,
+ np.ones((pred.shape[0], pred.shape[2]), dtype=np.float32))
+ distance_valid = distances[distances != -1]
+ return distance_valid.sum() / max(1, len(distance_valid))
+
+
+def pose_pck_accuracy(output: np.ndarray,
+ target: np.ndarray,
+ mask: np.ndarray,
+ thr: float = 0.05,
+ normalize: Optional[np.ndarray] = None) -> tuple:
+ """Calculate the pose accuracy of PCK for each individual keypoint and the
+ averaged accuracy across all keypoints from heatmaps.
+
+ Note:
+ PCK metric measures accuracy of the localization of the body joints.
+ The distances between predicted positions and the ground-truth ones
+ are typically normalized by the bounding box size.
+ The threshold (thr) of the normalized distance is commonly set
+ as 0.05, 0.1 or 0.2 etc.
+
+ - batch_size: N
+ - num_keypoints: K
+ - heatmap height: H
+ - heatmap width: W
+
+ Args:
+ output (np.ndarray[N, K, H, W]): Model output heatmaps.
+ target (np.ndarray[N, K, H, W]): Groundtruth heatmaps.
+ mask (np.ndarray[N, K]): Visibility of the target. False for invisible
+ joints, and True for visible. Invisible joints will be ignored for
+ accuracy calculation.
+ thr (float): Threshold of PCK calculation. Default 0.05.
+ normalize (np.ndarray[N, 2]): Normalization factor for H&W.
+
+ Returns:
+ tuple: A tuple containing keypoint accuracy.
+
+ - np.ndarray[K]: Accuracy of each keypoint.
+ - float: Averaged accuracy across all keypoints.
+ - int: Number of valid keypoints.
+ """
+ N, K, H, W = output.shape
+ if K == 0:
+ return None, 0, 0
+ if normalize is None:
+ normalize = np.tile(np.array([[H, W]]), (N, 1))
+
+ pred, _ = get_heatmap_maximum(output)
+ gt, _ = get_heatmap_maximum(target)
+ return keypoint_pck_accuracy(pred, gt, mask, thr, normalize)
+
+
+def simcc_pck_accuracy(output: Tuple[np.ndarray, np.ndarray],
+ target: Tuple[np.ndarray, np.ndarray],
+ simcc_split_ratio: float,
+ mask: np.ndarray,
+ thr: float = 0.05,
+ normalize: Optional[np.ndarray] = None) -> tuple:
+ """Calculate the pose accuracy of PCK for each individual keypoint and the
+ averaged accuracy across all keypoints from SimCC.
+
+ Note:
+ PCK metric measures accuracy of the localization of the body joints.
+ The distances between predicted positions and the ground-truth ones
+ are typically normalized by the bounding box size.
+ The threshold (thr) of the normalized distance is commonly set
+ as 0.05, 0.1 or 0.2 etc.
+
+ - instance number: N
+ - keypoint number: K
+
+ Args:
+ output (Tuple[np.ndarray, np.ndarray]): Model predicted SimCC.
+ target (Tuple[np.ndarray, np.ndarray]): Groundtruth SimCC.
+ mask (np.ndarray[N, K]): Visibility of the target. False for invisible
+ joints, and True for visible. Invisible joints will be ignored for
+ accuracy calculation.
+ thr (float): Threshold of PCK calculation. Default 0.05.
+ normalize (np.ndarray[N, 2]): Normalization factor for H&W.
+
+ Returns:
+ tuple: A tuple containing keypoint accuracy.
+
+ - np.ndarray[K]: Accuracy of each keypoint.
+ - float: Averaged accuracy across all keypoints.
+ - int: Number of valid keypoints.
+ """
+ pred_x, pred_y = output
+ gt_x, gt_y = target
+
+ N, _, Wx = pred_x.shape
+ _, _, Wy = pred_y.shape
+ W, H = int(Wx / simcc_split_ratio), int(Wy / simcc_split_ratio)
+
+ if normalize is None:
+ normalize = np.tile(np.array([[H, W]]), (N, 1))
+
+ pred_coords, _ = get_simcc_maximum(pred_x, pred_y)
+ pred_coords /= simcc_split_ratio
+ gt_coords, _ = get_simcc_maximum(gt_x, gt_y)
+ gt_coords /= simcc_split_ratio
+
+ return keypoint_pck_accuracy(pred_coords, gt_coords, mask, thr, normalize)
+
+
+def multilabel_classification_accuracy(pred: np.ndarray,
+ gt: np.ndarray,
+ mask: np.ndarray,
+ thr: float = 0.5) -> float:
+ """Get multi-label classification accuracy.
+
+ Note:
+ - batch size: N
+ - label number: L
+
+ Args:
+ pred (np.ndarray[N, L, 2]): model predicted labels.
+ gt (np.ndarray[N, L, 2]): ground-truth labels.
+ mask (np.ndarray[N, 1] or np.ndarray[N, L] ): reliability of
+ ground-truth labels.
+ thr (float): Threshold for calculating accuracy.
+
+ Returns:
+ float: multi-label classification accuracy.
+ """
+ # we only compute accuracy on the samples with ground-truth of all labels.
+ valid = (mask > 0).min(axis=1) if mask.ndim == 2 else (mask > 0)
+ pred, gt = pred[valid], gt[valid]
+
+ if pred.shape[0] == 0:
+ acc = 0.0 # when no sample is with gt labels, set acc to 0.
+ else:
+ # The classification of a sample is regarded as correct
+ # only if it's correct for all labels.
+ acc = (((pred - thr) * (gt - thr)) > 0).all(axis=1).mean()
+ return acc
+
+
+def keypoint_mpjpe(pred: np.ndarray,
+ gt: np.ndarray,
+ mask: np.ndarray,
+ alignment: str = 'none'):
+ """Calculate the mean per-joint position error (MPJPE) and the error after
+ rigid alignment with the ground truth (P-MPJPE).
+
+ Note:
+ - batch_size: N
+ - num_keypoints: K
+ - keypoint_dims: C
+
+ Args:
+ pred (np.ndarray): Predicted keypoint location with shape [N, K, C].
+ gt (np.ndarray): Groundtruth keypoint location with shape [N, K, C].
+ mask (np.ndarray): Visibility of the target with shape [N, K].
+ False for invisible joints, and True for visible.
+ Invisible joints will be ignored for accuracy calculation.
+ alignment (str, optional): method to align the prediction with the
+ groundtruth. Supported options are:
+
+ - ``'none'``: no alignment will be applied
+ - ``'scale'``: align in the least-square sense in scale
+ - ``'procrustes'``: align in the least-square sense in
+ scale, rotation and translation.
+
+ Returns:
+ tuple: A tuple containing joint position errors
+
+ - (float | np.ndarray): mean per-joint position error (mpjpe).
+ - (float | np.ndarray): mpjpe after rigid alignment with the
+ ground truth (p-mpjpe).
+ """
+ assert mask.any()
+
+ if alignment == 'none':
+ pass
+ elif alignment == 'procrustes':
+ pred = np.stack([
+ compute_similarity_transform(pred_i, gt_i)
+ for pred_i, gt_i in zip(pred, gt)
+ ])
+ elif alignment == 'scale':
+ pred_dot_pred = np.einsum('nkc,nkc->n', pred, pred)
+ pred_dot_gt = np.einsum('nkc,nkc->n', pred, gt)
+ scale_factor = pred_dot_gt / pred_dot_pred
+ pred = pred * scale_factor[:, None, None]
+ else:
+ raise ValueError(f'Invalid value for alignment: {alignment}')
+ error = np.linalg.norm(pred - gt, ord=2, axis=-1)[mask].mean()
+
+ return error
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/mesh_eval.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/mesh_eval.py
new file mode 100644
index 0000000000000000000000000000000000000000..114b73d5e1a89314a58c32cdffcfa436a1e5f2fc
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/mesh_eval.py
@@ -0,0 +1,72 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+# ------------------------------------------------------------------------------
+# Adapted from https://github.com/akanazawa/hmr
+# Original licence: Copyright (c) 2018 akanazawa, under the MIT License.
+# ------------------------------------------------------------------------------
+
+import numpy as np
+
+
+def compute_similarity_transform(source_points, target_points):
+ """Computes a similarity transform (sR, t) that takes a set of 3D points
+ source_points (N x 3) closest to a set of 3D points target_points, where R
+ is an 3x3 rotation matrix, t 3x1 translation, s scale. And return the
+ transformed 3D points source_points_hat (N x 3). i.e. solves the orthogonal
+ Procrutes problem.
+
+ Note:
+ Points number: N
+
+ Args:
+ source_points (np.ndarray): Source point set with shape [N, 3].
+ target_points (np.ndarray): Target point set with shape [N, 3].
+
+ Returns:
+ np.ndarray: Transformed source point set with shape [N, 3].
+ """
+
+ assert target_points.shape[0] == source_points.shape[0]
+ assert target_points.shape[1] == 3 and source_points.shape[1] == 3
+
+ source_points = source_points.T
+ target_points = target_points.T
+
+ # 1. Remove mean.
+ mu1 = source_points.mean(axis=1, keepdims=True)
+ mu2 = target_points.mean(axis=1, keepdims=True)
+ X1 = source_points - mu1
+ X2 = target_points - mu2
+
+ # 2. Compute variance of X1 used for scale.
+ var1 = np.sum(X1**2)
+
+ # 3. The outer product of X1 and X2.
+ K = X1.dot(X2.T)
+
+ # 4. Solution that Maximizes trace(R'K) is R=U*V', where U, V are
+ # singular vectors of K.
+ U, _, Vh = np.linalg.svd(K)
+ V = Vh.T
+ # Construct Z that fixes the orientation of R to get det(R)=1.
+ Z = np.eye(U.shape[0])
+ Z[-1, -1] *= np.sign(np.linalg.det(U.dot(V.T)))
+ # Construct R.
+ R = V.dot(Z.dot(U.T))
+
+ # 5. Recover scale.
+ scale = np.trace(R.dot(K)) / var1
+
+ # 6. Recover translation.
+ t = mu2 - scale * (R.dot(mu1))
+
+ # 7. Transform the source points:
+ source_points_hat = scale * R.dot(source_points) + t
+
+ source_points_hat = source_points_hat.T
+
+ return source_points_hat
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/nms.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/nms.py
new file mode 100644
index 0000000000000000000000000000000000000000..bf973afe8fa0be92bb0896b542ab5f556ce3b06c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/functional/nms.py
@@ -0,0 +1,333 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+# ------------------------------------------------------------------------------
+# Adapted from https://github.com/leoxiaobin/deep-high-resolution-net.pytorch
+# and https://github.com/HRNet/DEKR
+# Original licence: Copyright (c) Microsoft, under the MIT License.
+# ------------------------------------------------------------------------------
+
+from typing import List, Optional
+
+import numpy as np
+
+
+def nms(dets: np.ndarray, thr: float) -> List[int]:
+ """Greedily select boxes with high confidence and overlap <= thr.
+
+ Args:
+ dets (np.ndarray): [[x1, y1, x2, y2, score]].
+ thr (float): Retain overlap < thr.
+
+ Returns:
+ list: Indexes to keep.
+ """
+ if len(dets) == 0:
+ return []
+
+ x1 = dets[:, 0]
+ y1 = dets[:, 1]
+ x2 = dets[:, 2]
+ y2 = dets[:, 3]
+ scores = dets[:, 4]
+
+ areas = (x2 - x1 + 1) * (y2 - y1 + 1)
+ order = scores.argsort()[::-1]
+
+ keep = []
+ while len(order) > 0:
+ i = order[0]
+ keep.append(i)
+ xx1 = np.maximum(x1[i], x1[order[1:]])
+ yy1 = np.maximum(y1[i], y1[order[1:]])
+ xx2 = np.minimum(x2[i], x2[order[1:]])
+ yy2 = np.minimum(y2[i], y2[order[1:]])
+
+ w = np.maximum(0.0, xx2 - xx1 + 1)
+ h = np.maximum(0.0, yy2 - yy1 + 1)
+ inter = w * h
+ ovr = inter / (areas[i] + areas[order[1:]] - inter)
+
+ inds = np.where(ovr <= thr)[0]
+ order = order[inds + 1]
+
+ return keep
+
+
+def oks_iou(g: np.ndarray,
+ d: np.ndarray,
+ a_g: float,
+ a_d: np.ndarray,
+ sigmas: Optional[np.ndarray] = None,
+ vis_thr: Optional[float] = None) -> np.ndarray:
+ """Calculate oks ious.
+
+ Note:
+
+ - number of keypoints: K
+ - number of instances: N
+
+ Args:
+ g (np.ndarray): The instance to calculate OKS IOU with other
+ instances. Containing the keypoints coordinates. Shape: (K*3, )
+ d (np.ndarray): The rest instances. Containing the keypoints
+ coordinates. Shape: (N, K*3)
+ a_g (float): Area of the ground truth object.
+ a_d (np.ndarray): Area of the detected object. Shape: (N, )
+ sigmas (np.ndarray, optional): Keypoint labelling uncertainty.
+ Please refer to `COCO keypoint evaluation
+ `__ for more details.
+ If not given, use the sigmas on COCO dataset.
+ If specified, shape: (K, ). Defaults to ``None``
+ vis_thr(float, optional): Threshold of the keypoint visibility.
+ If specified, will calculate OKS based on those keypoints whose
+ visibility higher than vis_thr. If not given, calculate the OKS
+ based on all keypoints. Defaults to ``None``
+
+ Returns:
+ np.ndarray: The oks ious.
+ """
+ if sigmas is None:
+ sigmas = np.array([
+ .26, .25, .25, .35, .35, .79, .79, .72, .72, .62, .62, 1.07, 1.07,
+ .87, .87, .89, .89
+ ]) / 10.0
+ vars = (sigmas * 2)**2
+ xg = g[0::3]
+ yg = g[1::3]
+ vg = g[2::3]
+ ious = np.zeros(len(d), dtype=np.float32)
+ for n_d in range(0, len(d)):
+ xd = d[n_d, 0::3]
+ yd = d[n_d, 1::3]
+ vd = d[n_d, 2::3]
+ dx = xd - xg
+ dy = yd - yg
+ e = (dx**2 + dy**2) / vars / ((a_g + a_d[n_d]) / 2 + np.spacing(1)) / 2
+ if vis_thr is not None:
+ ind = list((vg > vis_thr) & (vd > vis_thr))
+ e = e[ind]
+ ious[n_d] = np.sum(np.exp(-e)) / len(e) if len(e) != 0 else 0.0
+ return ious
+
+
+def oks_nms(kpts_db: List[dict],
+ thr: float,
+ sigmas: Optional[np.ndarray] = None,
+ vis_thr: Optional[float] = None,
+ score_per_joint: bool = False):
+ """OKS NMS implementations.
+
+ Args:
+ kpts_db (List[dict]): The keypoints results of the same image.
+ thr (float): The threshold of NMS. Will retain oks overlap < thr.
+ sigmas (np.ndarray, optional): Keypoint labelling uncertainty.
+ Please refer to `COCO keypoint evaluation
+ `__ for more details.
+ If not given, use the sigmas on COCO dataset. Defaults to ``None``
+ vis_thr(float, optional): Threshold of the keypoint visibility.
+ If specified, will calculate OKS based on those keypoints whose
+ visibility higher than vis_thr. If not given, calculate the OKS
+ based on all keypoints. Defaults to ``None``
+ score_per_joint(bool): Whether the input scores (in kpts_db) are
+ per-joint scores. Defaults to ``False``
+
+ Returns:
+ np.ndarray: indexes to keep.
+ """
+ if len(kpts_db) == 0:
+ return []
+
+ if score_per_joint:
+ scores = np.array([k['score'].mean() for k in kpts_db])
+ else:
+ scores = np.array([k['score'] for k in kpts_db])
+
+ kpts = np.array([k['keypoints'].flatten() for k in kpts_db])
+ areas = np.array([k['area'] for k in kpts_db])
+
+ order = scores.argsort()[::-1]
+
+ keep = []
+ while len(order) > 0:
+ i = order[0]
+ keep.append(i)
+
+ oks_ovr = oks_iou(kpts[i], kpts[order[1:]], areas[i], areas[order[1:]],
+ sigmas, vis_thr)
+
+ inds = np.where(oks_ovr <= thr)[0]
+ order = order[inds + 1]
+
+ keep = np.array(keep)
+
+ return keep
+
+
+def _rescore(overlap: np.ndarray,
+ scores: np.ndarray,
+ thr: float,
+ type: str = 'gaussian'):
+ """Rescoring mechanism gaussian or linear.
+
+ Args:
+ overlap (np.ndarray): The calculated oks ious.
+ scores (np.ndarray): target scores.
+ thr (float): retain oks overlap < thr.
+ type (str): The rescoring type. Could be 'gaussian' or 'linear'.
+ Defaults to ``'gaussian'``
+
+ Returns:
+ np.ndarray: indexes to keep
+ """
+ assert len(overlap) == len(scores)
+ assert type in ['gaussian', 'linear']
+
+ if type == 'linear':
+ inds = np.where(overlap >= thr)[0]
+ scores[inds] = scores[inds] * (1 - overlap[inds])
+ else:
+ scores = scores * np.exp(-overlap**2 / thr)
+
+ return scores
+
+
+def soft_oks_nms(kpts_db: List[dict],
+ thr: float,
+ max_dets: int = 20,
+ sigmas: Optional[np.ndarray] = None,
+ vis_thr: Optional[float] = None,
+ score_per_joint: bool = False):
+ """Soft OKS NMS implementations.
+
+ Args:
+ kpts_db (List[dict]): The keypoints results of the same image.
+ thr (float): The threshold of NMS. Will retain oks overlap < thr.
+ max_dets (int): Maximum number of detections to keep. Defaults to 20
+ sigmas (np.ndarray, optional): Keypoint labelling uncertainty.
+ Please refer to `COCO keypoint evaluation
+ `__ for more details.
+ If not given, use the sigmas on COCO dataset. Defaults to ``None``
+ vis_thr(float, optional): Threshold of the keypoint visibility.
+ If specified, will calculate OKS based on those keypoints whose
+ visibility higher than vis_thr. If not given, calculate the OKS
+ based on all keypoints. Defaults to ``None``
+ score_per_joint(bool): Whether the input scores (in kpts_db) are
+ per-joint scores. Defaults to ``False``
+
+ Returns:
+ np.ndarray: indexes to keep.
+ """
+ if len(kpts_db) == 0:
+ return []
+
+ if score_per_joint:
+ scores = np.array([k['score'].mean() for k in kpts_db])
+ else:
+ scores = np.array([k['score'] for k in kpts_db])
+
+ kpts = np.array([k['keypoints'].flatten() for k in kpts_db])
+ areas = np.array([k['area'] for k in kpts_db])
+
+ order = scores.argsort()[::-1]
+ scores = scores[order]
+
+ keep = np.zeros(max_dets, dtype=np.intp)
+ keep_cnt = 0
+ while len(order) > 0 and keep_cnt < max_dets:
+ i = order[0]
+
+ oks_ovr = oks_iou(kpts[i], kpts[order[1:]], areas[i], areas[order[1:]],
+ sigmas, vis_thr)
+
+ order = order[1:]
+ scores = _rescore(oks_ovr, scores[1:], thr)
+
+ tmp = scores.argsort()[::-1]
+ order = order[tmp]
+ scores = scores[tmp]
+
+ keep[keep_cnt] = i
+ keep_cnt += 1
+
+ keep = keep[:keep_cnt]
+
+ return keep
+
+
+def nearby_joints_nms(
+ kpts_db: List[dict],
+ dist_thr: float,
+ num_nearby_joints_thr: Optional[int] = None,
+ score_per_joint: bool = False,
+ max_dets: int = 30,
+):
+ """Nearby joints NMS implementations. Instances with non-maximum scores
+ will be suppressed if they have too much closed joints with other
+ instances. This function is modified from project
+ `DEKR`.
+
+ Args:
+ kpts_db (list[dict]): keypoints and scores.
+ dist_thr (float): threshold for judging whether two joints are close.
+ num_nearby_joints_thr (int): threshold for judging whether two
+ instances are close.
+ max_dets (int): max number of detections to keep.
+ score_per_joint (bool): the input scores (in kpts_db) are per joint
+ scores.
+
+ Returns:
+ np.ndarray: indexes to keep.
+ """
+
+ assert dist_thr > 0, '`dist_thr` must be greater than 0.'
+ if len(kpts_db) == 0:
+ return []
+
+ if score_per_joint:
+ scores = np.array([k['score'].mean() for k in kpts_db])
+ else:
+ scores = np.array([k['score'] for k in kpts_db])
+
+ kpts = np.array([k['keypoints'] for k in kpts_db])
+
+ num_people, num_joints, _ = kpts.shape
+ if num_nearby_joints_thr is None:
+ num_nearby_joints_thr = num_joints // 2
+ assert num_nearby_joints_thr < num_joints, '`num_nearby_joints_thr` must '\
+ 'be less than the number of joints.'
+
+ # compute distance threshold
+ pose_area = kpts.max(axis=1) - kpts.min(axis=1)
+ pose_area = np.sqrt(np.power(pose_area, 2).sum(axis=1))
+ pose_area = pose_area.reshape(num_people, 1, 1)
+ pose_area = np.tile(pose_area, (num_people, num_joints))
+ close_dist_thr = pose_area * dist_thr
+
+ # count nearby joints between instances
+ instance_dist = kpts[:, None] - kpts
+ instance_dist = np.sqrt(np.power(instance_dist, 2).sum(axis=3))
+ close_instance_num = (instance_dist < close_dist_thr).sum(2)
+ close_instance = close_instance_num > num_nearby_joints_thr
+
+ # apply nms
+ ignored_pose_inds, keep_pose_inds = set(), list()
+ indexes = np.argsort(scores)[::-1]
+ for i in indexes:
+ if i in ignored_pose_inds:
+ continue
+ keep_inds = close_instance[i].nonzero()[0]
+ keep_ind = keep_inds[np.argmax(scores[keep_inds])]
+ if keep_ind not in ignored_pose_inds:
+ keep_pose_inds.append(keep_ind)
+ ignored_pose_inds = ignored_pose_inds.union(set(keep_inds))
+
+ # limit the number of output instances
+ if max_dets > 0 and len(keep_pose_inds) > max_dets:
+ sub_inds = np.argsort(scores[keep_pose_inds])[-1:-max_dets - 1:-1]
+ keep_pose_inds = [keep_pose_inds[i] for i in sub_inds]
+
+ return keep_pose_inds
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..f5f381a5ea8f6e4cfa98a260cef765697de8cd47
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__init__.py
@@ -0,0 +1,23 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .coco_metric import CocoMetric
+from .coco_wholebody_metric import CocoWholeBodyMetric
+from .keypoint_2d_metrics import (AUC, EPE, NME, JhmdbPCKAccuracy,
+ MpiiPCKAccuracy, PCKAccuracy)
+from .keypoint_3d_metrics import MPJPE
+from .keypoint_partition_metric import KeypointPartitionMetric
+from .posetrack18_metric import PoseTrack18Metric
+from .goliath_metric import GoliathMetric
+from .goliath_coco_wholebody_metric import GoliathCocoWholeBodyMetric
+from .goliath3d_coco_wholebody_metric import Goliath3dCocoWholeBodyMetric
+
+__all__ = [
+ 'CocoMetric', 'PCKAccuracy', 'MpiiPCKAccuracy', 'JhmdbPCKAccuracy', 'AUC',
+ 'EPE', 'NME', 'PoseTrack18Metric', 'CocoWholeBodyMetric',
+ 'KeypointPartitionMetric', 'MPJPE', 'GoliathMetric',
+ 'GoliathCocoWholeBodyMetric', 'Goliath3dCocoWholeBodyMetric'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b8697483bc989f9563a81ab6380a4d6a402aa43a
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/coco_metric.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/coco_metric.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e0785cd6c459fd27e91665b13b85ad63bdfad0a7
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/coco_metric.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/coco_wholebody_metric.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/coco_wholebody_metric.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..312bc7d70587b44885574591e5f5b81a4ca54e6a
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/coco_wholebody_metric.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/goliath3d_coco_wholebody_metric.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/goliath3d_coco_wholebody_metric.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..129ad265b94704fbbd2b9b707dc52c5d70dc01c1
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/goliath3d_coco_wholebody_metric.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/goliath_coco_wholebody_metric.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/goliath_coco_wholebody_metric.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0c2a17881960d0975acd45fdcd7277aa3eb1be41
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/goliath_coco_wholebody_metric.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/goliath_metric.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/goliath_metric.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2783d5d4518cb531173108069538d85d4543e7c5
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/goliath_metric.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/keypoint_2d_metrics.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/keypoint_2d_metrics.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b2e5a2e9518c0e2d8b2c971b5db169d8e3a4c0bc
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/keypoint_2d_metrics.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/keypoint_3d_metrics.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/keypoint_3d_metrics.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..223ded61591a5baaf8f0ec40a3de8bf8b220ad43
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/keypoint_3d_metrics.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/keypoint_partition_metric.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/keypoint_partition_metric.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bbaead18a27e081fa9e5565b6941e1ba14b0b8c4
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/keypoint_partition_metric.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/posetrack18_metric.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/posetrack18_metric.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..721092cafdb0a44c9883420c45e50141d53e1772
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/__pycache__/posetrack18_metric.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/coco_metric.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/coco_metric.py
new file mode 100644
index 0000000000000000000000000000000000000000..bffc5e1f92259c6219863eccd746facc76a92747
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/coco_metric.py
@@ -0,0 +1,555 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import datetime
+import os.path as osp
+import tempfile
+from collections import OrderedDict, defaultdict
+from typing import Dict, Optional, Sequence
+
+import numpy as np
+from mmengine.evaluator import BaseMetric
+from mmengine.fileio import dump, get_local_path, load
+from mmengine.logging import MMLogger
+from xtcocotools.coco import COCO
+from xtcocotools.cocoeval import COCOeval
+
+from mmpose.registry import METRICS
+from ..functional import oks_nms, soft_oks_nms
+
+
+@METRICS.register_module()
+class CocoMetric(BaseMetric):
+ """COCO pose estimation task evaluation metric.
+
+ Evaluate AR, AP, and mAP for keypoint detection tasks. Support COCO
+ dataset and other datasets in COCO format. Please refer to
+ `COCO keypoint evaluation `__
+ for more details.
+
+ Args:
+ ann_file (str, optional): Path to the coco format annotation file.
+ If not specified, ground truth annotations from the dataset will
+ be converted to coco format. Defaults to None
+ use_area (bool): Whether to use ``'area'`` message in the annotations.
+ If the ground truth annotations (e.g. CrowdPose, AIC) do not have
+ the field ``'area'``, please set ``use_area=False``.
+ Defaults to ``True``
+ iou_type (str): The same parameter as `iouType` in
+ :class:`xtcocotools.COCOeval`, which can be ``'keypoints'``, or
+ ``'keypoints_crowd'`` (used in CrowdPose dataset).
+ Defaults to ``'keypoints'``
+ score_mode (str): The mode to score the prediction results which
+ should be one of the following options:
+
+ - ``'bbox'``: Take the score of bbox as the score of the
+ prediction results.
+ - ``'bbox_keypoint'``: Use keypoint score to rescore the
+ prediction results.
+ - ``'bbox_rle'``: Use rle_score to rescore the
+ prediction results.
+
+ Defaults to ``'bbox_keypoint'`
+ keypoint_score_thr (float): The threshold of keypoint score. The
+ keypoints with score lower than it will not be included to
+ rescore the prediction results. Valid only when ``score_mode`` is
+ ``bbox_keypoint``. Defaults to ``0.2``
+ nms_mode (str): The mode to perform Non-Maximum Suppression (NMS),
+ which should be one of the following options:
+
+ - ``'oks_nms'``: Use Object Keypoint Similarity (OKS) to
+ perform NMS.
+ - ``'soft_oks_nms'``: Use Object Keypoint Similarity (OKS)
+ to perform soft NMS.
+ - ``'none'``: Do not perform NMS. Typically for bottomup mode
+ output.
+
+ Defaults to ``'oks_nms'`
+ nms_thr (float): The Object Keypoint Similarity (OKS) threshold
+ used in NMS when ``nms_mode`` is ``'oks_nms'`` or
+ ``'soft_oks_nms'``. Will retain the prediction results with OKS
+ lower than ``nms_thr``. Defaults to ``0.9``
+ format_only (bool): Whether only format the output results without
+ doing quantitative evaluation. This is designed for the need of
+ test submission when the ground truth annotations are absent. If
+ set to ``True``, ``outfile_prefix`` should specify the path to
+ store the output results. Defaults to ``False``
+ outfile_prefix (str | None): The prefix of json files. It includes
+ the file path and the prefix of filename, e.g., ``'a/b/prefix'``.
+ If not specified, a temp file will be created. Defaults to ``None``
+ collect_device (str): Device name used for collecting results from
+ different ranks during distributed training. Must be ``'cpu'`` or
+ ``'gpu'``. Defaults to ``'cpu'``
+ prefix (str, optional): The prefix that will be added in the metric
+ names to disambiguate homonymous metrics of different evaluators.
+ If prefix is not provided in the argument, ``self.default_prefix``
+ will be used instead. Defaults to ``None``
+ """
+ default_prefix: Optional[str] = 'coco'
+
+ def __init__(self,
+ ann_file: Optional[str] = None,
+ use_area: bool = True,
+ iou_type: str = 'keypoints',
+ score_mode: str = 'bbox_keypoint',
+ keypoint_score_thr: float = 0.2,
+ nms_mode: str = 'oks_nms',
+ nms_thr: float = 0.9,
+ format_only: bool = False,
+ outfile_prefix: Optional[str] = None,
+ collect_device: str = 'cpu',
+ prefix: Optional[str] = None) -> None:
+ super().__init__(collect_device=collect_device, prefix=prefix)
+ self.ann_file = ann_file
+ # initialize coco helper with the annotation json file
+ # if ann_file is not specified, initialize with the converted dataset
+ if ann_file is not None:
+ with get_local_path(ann_file) as local_path:
+ self.coco = COCO(local_path)
+ else:
+ self.coco = None
+
+ self.use_area = use_area
+ self.iou_type = iou_type
+
+ allowed_score_modes = ['bbox', 'bbox_keypoint', 'bbox_rle', 'keypoint']
+ if score_mode not in allowed_score_modes:
+ raise ValueError(
+ "`score_mode` should be one of 'bbox', 'bbox_keypoint', "
+ f"'bbox_rle', but got {score_mode}")
+ self.score_mode = score_mode
+ self.keypoint_score_thr = keypoint_score_thr
+
+ allowed_nms_modes = ['oks_nms', 'soft_oks_nms', 'none']
+ if nms_mode not in allowed_nms_modes:
+ raise ValueError(
+ "`nms_mode` should be one of 'oks_nms', 'soft_oks_nms', "
+ f"'none', but got {nms_mode}")
+ self.nms_mode = nms_mode
+ self.nms_thr = nms_thr
+
+ if format_only:
+ assert outfile_prefix is not None, '`outfile_prefix` can not be '\
+ 'None when `format_only` is True, otherwise the result file '\
+ 'will be saved to a temp directory which will be cleaned up '\
+ 'in the end.'
+ elif ann_file is not None:
+ # do evaluation only if the ground truth annotations exist
+ assert 'annotations' in load(ann_file), \
+ 'Ground truth annotations are required for evaluation '\
+ 'when `format_only` is False.'
+
+ self.format_only = format_only
+ self.outfile_prefix = outfile_prefix
+
+ def process(self, data_batch: Sequence[dict],
+ data_samples: Sequence[dict]) -> None:
+ """Process one batch of data samples and predictions. The processed
+ results should be stored in ``self.results``, which will be used to
+ compute the metrics when all batches have been processed.
+
+ Args:
+ data_batch (Sequence[dict]): A batch of data
+ from the dataloader.
+ data_samples (Sequence[dict]): A batch of outputs from
+ the model, each of which has the following keys:
+
+ - 'id': The id of the sample
+ - 'img_id': The image_id of the sample
+ - 'pred_instances': The prediction results of instance(s)
+ """
+ for data_sample in data_samples:
+ if 'pred_instances' not in data_sample:
+ raise ValueError(
+ '`pred_instances` are required to process the '
+ f'predictions results in {self.__class__.__name__}. ')
+
+ # keypoints.shape: [N, K, 2],
+ # N: number of instances, K: number of keypoints
+ # for topdown-style output, N is usually 1, while for
+ # bottomup-style output, N is the number of instances in the image
+ keypoints = data_sample['pred_instances']['keypoints']
+ # [N, K], the scores for all keypoints of all instances
+ keypoint_scores = data_sample['pred_instances']['keypoint_scores']
+ assert keypoint_scores.shape == keypoints.shape[:2]
+
+ # parse prediction results
+ pred = dict()
+ pred['id'] = data_sample['id']
+ pred['img_id'] = data_sample['img_id']
+ pred['keypoints'] = keypoints
+ pred['keypoint_scores'] = keypoint_scores
+ pred['category_id'] = data_sample.get('category_id', 1)
+
+ if 'bbox_scores' in data_sample['pred_instances']:
+ # some one-stage models will predict bboxes and scores
+ # together with keypoints
+ bbox_scores = data_sample['pred_instances']['bbox_scores']
+ elif ('bbox_scores' not in data_sample['gt_instances']
+ or len(data_sample['gt_instances']['bbox_scores']) !=
+ len(keypoints)):
+ # bottom-up models might output different number of
+ # instances from annotation
+ bbox_scores = np.ones(len(keypoints))
+ else:
+ # top-down models use detected bboxes, the scores of which
+ # are contained in the gt_instances
+ bbox_scores = data_sample['gt_instances']['bbox_scores']
+ pred['bbox_scores'] = bbox_scores
+
+ # get area information
+ if 'bbox_scales' in data_sample['gt_instances']:
+ pred['areas'] = np.prod(
+ data_sample['gt_instances']['bbox_scales'], axis=1)
+
+ # parse gt
+ gt = dict()
+ if self.coco is None:
+ gt['width'] = data_sample['ori_shape'][1]
+ gt['height'] = data_sample['ori_shape'][0]
+ gt['img_id'] = data_sample['img_id']
+ if self.iou_type == 'keypoints_crowd':
+ assert 'crowd_index' in data_sample, \
+ '`crowd_index` is required when `self.iou_type` is ' \
+ '`keypoints_crowd`'
+ gt['crowd_index'] = data_sample['crowd_index']
+ assert 'raw_ann_info' in data_sample, \
+ 'The row ground truth annotations are required for ' \
+ 'evaluation when `ann_file` is not provided'
+ anns = data_sample['raw_ann_info']
+ gt['raw_ann_info'] = anns if isinstance(anns, list) else [anns]
+
+ # add converted result to the results list
+ self.results.append((pred, gt))
+
+ def gt_to_coco_json(self, gt_dicts: Sequence[dict],
+ outfile_prefix: str) -> str:
+ """Convert ground truth to coco format json file.
+
+ Args:
+ gt_dicts (Sequence[dict]): Ground truth of the dataset. Each dict
+ contains the ground truth information about the data sample.
+ Required keys of the each `gt_dict` in `gt_dicts`:
+ - `img_id`: image id of the data sample
+ - `width`: original image width
+ - `height`: original image height
+ - `raw_ann_info`: the raw annotation information
+ Optional keys:
+ - `crowd_index`: measure the crowding level of an image,
+ defined in CrowdPose dataset
+ It is worth mentioning that, in order to compute `CocoMetric`,
+ there are some required keys in the `raw_ann_info`:
+ - `id`: the id to distinguish different annotations
+ - `image_id`: the image id of this annotation
+ - `category_id`: the category of the instance.
+ - `bbox`: the object bounding box
+ - `keypoints`: the keypoints cooridinates along with their
+ visibilities. Note that it need to be aligned
+ with the official COCO format, e.g., a list with length
+ N * 3, in which N is the number of keypoints. And each
+ triplet represent the [x, y, visible] of the keypoint.
+ - `iscrowd`: indicating whether the annotation is a crowd.
+ It is useful when matching the detection results to
+ the ground truth.
+ There are some optional keys as well:
+ - `area`: it is necessary when `self.use_area` is `True`
+ - `num_keypoints`: it is necessary when `self.iou_type`
+ is set as `keypoints_crowd`.
+ outfile_prefix (str): The filename prefix of the json files. If the
+ prefix is "somepath/xxx", the json file will be named
+ "somepath/xxx.gt.json".
+ Returns:
+ str: The filename of the json file.
+ """
+ image_infos = []
+ annotations = []
+ img_ids = []
+ ann_ids = []
+
+ for gt_dict in gt_dicts:
+ # filter duplicate image_info
+ if gt_dict['img_id'] not in img_ids:
+ image_info = dict(
+ id=gt_dict['img_id'],
+ width=gt_dict['width'],
+ height=gt_dict['height'],
+ )
+ if self.iou_type == 'keypoints_crowd':
+ image_info['crowdIndex'] = gt_dict['crowd_index']
+
+ image_infos.append(image_info)
+ img_ids.append(gt_dict['img_id'])
+
+ # filter duplicate annotations
+ for ann in gt_dict['raw_ann_info']:
+ if ann is None:
+ # during evaluation on bottom-up datasets, some images
+ # do not have instance annotation
+ continue
+
+ annotation = dict(
+ id=ann['id'],
+ image_id=ann['image_id'],
+ category_id=ann['category_id'],
+ bbox=ann['bbox'],
+ keypoints=ann['keypoints'],
+ iscrowd=ann['iscrowd'],
+ )
+ if self.use_area:
+ assert 'area' in ann, \
+ '`area` is required when `self.use_area` is `True`'
+ annotation['area'] = ann['area']
+
+ if self.iou_type == 'keypoints_crowd':
+ assert 'num_keypoints' in ann, \
+ '`num_keypoints` is required when `self.iou_type` ' \
+ 'is `keypoints_crowd`'
+ annotation['num_keypoints'] = ann['num_keypoints']
+
+ annotations.append(annotation)
+ ann_ids.append(ann['id'])
+
+ info = dict(
+ date_created=str(datetime.datetime.now()),
+ description='Coco json file converted by mmpose CocoMetric.')
+ coco_json = dict(
+ info=info,
+ images=image_infos,
+ categories=self.dataset_meta['CLASSES'],
+ licenses=None,
+ annotations=annotations,
+ )
+ converted_json_path = f'{outfile_prefix}.gt.json'
+ dump(coco_json, converted_json_path, sort_keys=True, indent=4)
+ return converted_json_path
+
+ def compute_metrics(self, results: list) -> Dict[str, float]:
+ """Compute the metrics from processed results.
+
+ Args:
+ results (list): The processed results of each batch.
+
+ Returns:
+ Dict[str, float]: The computed metrics. The keys are the names of
+ the metrics, and the values are corresponding results.
+ """
+ logger: MMLogger = MMLogger.get_current_instance()
+
+ # split prediction and gt list
+ preds, gts = zip(*results)
+
+ tmp_dir = None
+ if self.outfile_prefix is None:
+ tmp_dir = tempfile.TemporaryDirectory()
+ outfile_prefix = osp.join(tmp_dir.name, 'results')
+ else:
+ outfile_prefix = self.outfile_prefix
+
+ if self.coco is None:
+ # use converted gt json file to initialize coco helper
+ logger.info('Converting ground truth to coco format...')
+ coco_json_path = self.gt_to_coco_json(
+ gt_dicts=gts, outfile_prefix=outfile_prefix)
+ self.coco = COCO(coco_json_path)
+
+ kpts = defaultdict(list)
+
+ # group the preds by img_id
+ for pred in preds:
+ img_id = pred['img_id']
+ for idx in range(len(pred['keypoints'])):
+ instance = {
+ 'id': pred['id'],
+ 'img_id': pred['img_id'],
+ 'category_id': pred['category_id'],
+ 'keypoints': pred['keypoints'][idx],
+ 'keypoint_scores': pred['keypoint_scores'][idx],
+ 'bbox_score': pred['bbox_scores'][idx],
+ }
+
+ if 'areas' in pred:
+ instance['area'] = pred['areas'][idx]
+ else:
+ # use keypoint to calculate bbox and get area
+ keypoints = pred['keypoints'][idx]
+ area = (
+ np.max(keypoints[:, 0]) - np.min(keypoints[:, 0])) * (
+ np.max(keypoints[:, 1]) - np.min(keypoints[:, 1]))
+ instance['area'] = area
+
+ kpts[img_id].append(instance)
+
+ # sort keypoint results according to id and remove duplicate ones
+ kpts = self._sort_and_unique_bboxes(kpts, key='id')
+
+ # score the prediction results according to `score_mode`
+ # and perform NMS according to `nms_mode`
+ valid_kpts = defaultdict(list)
+ num_keypoints = self.dataset_meta['num_keypoints']
+ for img_id, instances in kpts.items():
+ for instance in instances:
+ # concatenate the keypoint coordinates and scores
+ instance['keypoints'] = np.concatenate([
+ instance['keypoints'], instance['keypoint_scores'][:, None]
+ ],
+ axis=-1)
+ if self.score_mode == 'bbox':
+ instance['score'] = instance['bbox_score']
+ elif self.score_mode == 'keypoint':
+ instance['score'] = np.mean(instance['keypoint_scores'])
+ else:
+ bbox_score = instance['bbox_score']
+ if self.score_mode == 'bbox_rle':
+ keypoint_scores = instance['keypoint_scores']
+ instance['score'] = float(bbox_score +
+ np.mean(keypoint_scores) +
+ np.max(keypoint_scores))
+
+ else: # self.score_mode == 'bbox_keypoint':
+ mean_kpt_score = 0
+ valid_num = 0
+ for kpt_idx in range(num_keypoints):
+ kpt_score = instance['keypoint_scores'][kpt_idx]
+ if kpt_score > self.keypoint_score_thr:
+ mean_kpt_score += kpt_score
+ valid_num += 1
+ if valid_num != 0:
+ mean_kpt_score /= valid_num
+ instance['score'] = bbox_score * mean_kpt_score
+ # perform nms
+ if self.nms_mode == 'none':
+ valid_kpts[img_id] = instances
+ else:
+ nms = oks_nms if self.nms_mode == 'oks_nms' else soft_oks_nms
+ keep = nms(
+ instances,
+ self.nms_thr,
+ sigmas=self.dataset_meta['sigmas'])
+ valid_kpts[img_id] = [instances[_keep] for _keep in keep]
+
+ # convert results to coco style and dump into a json file
+ self.results2json(valid_kpts, outfile_prefix=outfile_prefix)
+
+ # only format the results without doing quantitative evaluation
+ if self.format_only:
+ logger.info('results are saved in '
+ f'{osp.dirname(outfile_prefix)}')
+ return {}
+
+ # evaluation results
+ eval_results = OrderedDict()
+ logger.info(f'Evaluating {self.__class__.__name__}...')
+ info_str = self._do_python_keypoint_eval(outfile_prefix)
+ name_value = OrderedDict(info_str)
+ eval_results.update(name_value)
+
+ if tmp_dir is not None:
+ tmp_dir.cleanup()
+ return eval_results
+
+ def results2json(self, keypoints: Dict[int, list],
+ outfile_prefix: str) -> str:
+ """Dump the keypoint detection results to a COCO style json file.
+
+ Args:
+ keypoints (Dict[int, list]): Keypoint detection results
+ of the dataset.
+ outfile_prefix (str): The filename prefix of the json files. If the
+ prefix is "somepath/xxx", the json files will be named
+ "somepath/xxx.keypoints.json",
+
+ Returns:
+ str: The json file name of keypoint results.
+ """
+ # the results with category_id
+ cat_results = []
+
+ for _, img_kpts in keypoints.items():
+ _keypoints = np.array(
+ [img_kpt['keypoints'] for img_kpt in img_kpts])
+ num_keypoints = self.dataset_meta['num_keypoints']
+ # collect all the person keypoints in current image
+ _keypoints = _keypoints.reshape(-1, num_keypoints * 3)
+
+ result = [{
+ 'image_id': img_kpt['img_id'],
+ 'category_id': img_kpt['category_id'],
+ 'keypoints': keypoint.tolist(),
+ 'score': float(img_kpt['score']),
+ } for img_kpt, keypoint in zip(img_kpts, _keypoints)]
+
+ cat_results.extend(result)
+
+ res_file = f'{outfile_prefix}.keypoints.json'
+ dump(cat_results, res_file, sort_keys=True, indent=4)
+
+ def _do_python_keypoint_eval(self, outfile_prefix: str) -> list:
+ """Do keypoint evaluation using COCOAPI.
+
+ Args:
+ outfile_prefix (str): The filename prefix of the json files. If the
+ prefix is "somepath/xxx", the json files will be named
+ "somepath/xxx.keypoints.json",
+
+ Returns:
+ list: a list of tuples. Each tuple contains the evaluation stats
+ name and corresponding stats value.
+ """
+ res_file = f'{outfile_prefix}.keypoints.json'
+ coco_det = self.coco.loadRes(res_file)
+ sigmas = self.dataset_meta['sigmas']
+ coco_eval = COCOeval(self.coco, coco_det, self.iou_type, sigmas,
+ self.use_area)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ if self.iou_type == 'keypoints_crowd':
+ stats_names = [
+ 'AP', 'AP .5', 'AP .75', 'AR', 'AR .5', 'AR .75', 'AP(E)',
+ 'AP(M)', 'AP(H)'
+ ]
+ else:
+ stats_names = [
+ 'AP', 'AP .5', 'AP .75', 'AP (M)', 'AP (L)', 'AR', 'AR .5',
+ 'AR .75', 'AR (M)', 'AR (L)'
+ ]
+
+ info_str = list(zip(stats_names, coco_eval.stats))
+
+ return info_str
+
+ def _sort_and_unique_bboxes(self,
+ kpts: Dict[int, list],
+ key: str = 'id') -> Dict[int, list]:
+ """Sort keypoint detection results in each image and remove the
+ duplicate ones. Usually performed in multi-batch testing.
+
+ Args:
+ kpts (Dict[int, list]): keypoint prediction results. The keys are
+ '`img_id`' and the values are list that may contain
+ keypoints of multiple persons. Each element in the list is a
+ dict containing the ``'key'`` field.
+ See the argument ``key`` for details.
+ key (str): The key name in each person prediction results. The
+ corresponding value will be used for sorting the results.
+ Default: ``'id'``.
+
+ Returns:
+ Dict[int, list]: The sorted keypoint detection results.
+ """
+ for img_id, persons in kpts.items():
+ # deal with bottomup-style output
+ if isinstance(kpts[img_id][0][key], Sequence):
+ return kpts
+ num = len(persons)
+ kpts[img_id] = sorted(kpts[img_id], key=lambda x: x[key])
+ for i in range(num - 1, 0, -1):
+ if kpts[img_id][i][key] == kpts[img_id][i - 1][key]:
+ del kpts[img_id][i]
+
+ return kpts
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/coco_wholebody_metric.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/coco_wholebody_metric.py
new file mode 100644
index 0000000000000000000000000000000000000000..16ed7b2ff75275931c0ab200b6b9e4bb04527000
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/coco_wholebody_metric.py
@@ -0,0 +1,317 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import datetime
+from typing import Dict, Optional, Sequence
+
+import numpy as np
+from mmengine.fileio import dump
+from xtcocotools.cocoeval import COCOeval
+
+from mmpose.registry import METRICS
+from .coco_metric import CocoMetric
+
+
+@METRICS.register_module()
+class CocoWholeBodyMetric(CocoMetric):
+ """COCO-WholeBody evaluation metric.
+
+ Evaluate AR, AP, and mAP for COCO-WholeBody keypoint detection tasks.
+ Support COCO-WholeBody dataset. Please refer to
+ `COCO keypoint evaluation `__
+ for more details.
+
+ Args:
+ ann_file (str, optional): Path to the coco format annotation file.
+ If not specified, ground truth annotations from the dataset will
+ be converted to coco format. Defaults to None
+ use_area (bool): Whether to use ``'area'`` message in the annotations.
+ If the ground truth annotations (e.g. CrowdPose, AIC) do not have
+ the field ``'area'``, please set ``use_area=False``.
+ Defaults to ``True``
+ iou_type (str): The same parameter as `iouType` in
+ :class:`xtcocotools.COCOeval`, which can be ``'keypoints'``, or
+ ``'keypoints_crowd'`` (used in CrowdPose dataset).
+ Defaults to ``'keypoints'``
+ score_mode (str): The mode to score the prediction results which
+ should be one of the following options:
+
+ - ``'bbox'``: Take the score of bbox as the score of the
+ prediction results.
+ - ``'bbox_keypoint'``: Use keypoint score to rescore the
+ prediction results.
+ - ``'bbox_rle'``: Use rle_score to rescore the
+ prediction results.
+
+ Defaults to ``'bbox_keypoint'`
+ keypoint_score_thr (float): The threshold of keypoint score. The
+ keypoints with score lower than it will not be included to
+ rescore the prediction results. Valid only when ``score_mode`` is
+ ``bbox_keypoint``. Defaults to ``0.2``
+ nms_mode (str): The mode to perform Non-Maximum Suppression (NMS),
+ which should be one of the following options:
+
+ - ``'oks_nms'``: Use Object Keypoint Similarity (OKS) to
+ perform NMS.
+ - ``'soft_oks_nms'``: Use Object Keypoint Similarity (OKS)
+ to perform soft NMS.
+ - ``'none'``: Do not perform NMS. Typically for bottomup mode
+ output.
+
+ Defaults to ``'oks_nms'`
+ nms_thr (float): The Object Keypoint Similarity (OKS) threshold
+ used in NMS when ``nms_mode`` is ``'oks_nms'`` or
+ ``'soft_oks_nms'``. Will retain the prediction results with OKS
+ lower than ``nms_thr``. Defaults to ``0.9``
+ format_only (bool): Whether only format the output results without
+ doing quantitative evaluation. This is designed for the need of
+ test submission when the ground truth annotations are absent. If
+ set to ``True``, ``outfile_prefix`` should specify the path to
+ store the output results. Defaults to ``False``
+ outfile_prefix (str | None): The prefix of json files. It includes
+ the file path and the prefix of filename, e.g., ``'a/b/prefix'``.
+ If not specified, a temp file will be created. Defaults to ``None``
+ **kwargs: Keyword parameters passed to :class:`mmeval.BaseMetric`
+ """
+ default_prefix: Optional[str] = 'coco-wholebody'
+ body_num = 17
+ foot_num = 6
+ face_num = 68
+ left_hand_num = 21
+ right_hand_num = 21
+
+ def gt_to_coco_json(self, gt_dicts: Sequence[dict],
+ outfile_prefix: str) -> str:
+ """Convert ground truth to coco format json file.
+
+ Args:
+ gt_dicts (Sequence[dict]): Ground truth of the dataset. Each dict
+ contains the ground truth information about the data sample.
+ Required keys of the each `gt_dict` in `gt_dicts`:
+ - `img_id`: image id of the data sample
+ - `width`: original image width
+ - `height`: original image height
+ - `raw_ann_info`: the raw annotation information
+ Optional keys:
+ - `crowd_index`: measure the crowding level of an image,
+ defined in CrowdPose dataset
+ It is worth mentioning that, in order to compute `CocoMetric`,
+ there are some required keys in the `raw_ann_info`:
+ - `id`: the id to distinguish different annotations
+ - `image_id`: the image id of this annotation
+ - `category_id`: the category of the instance.
+ - `bbox`: the object bounding box
+ - `keypoints`: the keypoints cooridinates along with their
+ visibilities. Note that it need to be aligned
+ with the official COCO format, e.g., a list with length
+ N * 3, in which N is the number of keypoints. And each
+ triplet represent the [x, y, visible] of the keypoint.
+ - 'keypoints'
+ - `iscrowd`: indicating whether the annotation is a crowd.
+ It is useful when matching the detection results to
+ the ground truth.
+ There are some optional keys as well:
+ - `area`: it is necessary when `self.use_area` is `True`
+ - `num_keypoints`: it is necessary when `self.iou_type`
+ is set as `keypoints_crowd`.
+ outfile_prefix (str): The filename prefix of the json files. If the
+ prefix is "somepath/xxx", the json file will be named
+ "somepath/xxx.gt.json".
+ Returns:
+ str: The filename of the json file.
+ """
+ image_infos = []
+ annotations = []
+ img_ids = []
+ ann_ids = []
+
+ for gt_dict in gt_dicts:
+ # filter duplicate image_info
+ if gt_dict['img_id'] not in img_ids:
+ image_info = dict(
+ id=gt_dict['img_id'],
+ width=gt_dict['width'],
+ height=gt_dict['height'],
+ )
+ if self.iou_type == 'keypoints_crowd':
+ image_info['crowdIndex'] = gt_dict['crowd_index']
+
+ image_infos.append(image_info)
+ img_ids.append(gt_dict['img_id'])
+
+ # filter duplicate annotations
+ for ann in gt_dict['raw_ann_info']:
+ annotation = dict(
+ id=ann['id'],
+ image_id=ann['image_id'],
+ category_id=ann['category_id'],
+ bbox=ann['bbox'],
+ keypoints=ann['keypoints'],
+ foot_kpts=ann['foot_kpts'],
+ face_kpts=ann['face_kpts'],
+ lefthand_kpts=ann['lefthand_kpts'],
+ righthand_kpts=ann['righthand_kpts'],
+ iscrowd=ann['iscrowd'],
+ )
+ if self.use_area:
+ assert 'area' in ann, \
+ '`area` is required when `self.use_area` is `True`'
+ annotation['area'] = ann['area']
+
+ annotations.append(annotation)
+ ann_ids.append(ann['id'])
+
+ info = dict(
+ date_created=str(datetime.datetime.now()),
+ description='Coco json file converted by mmpose CocoMetric.')
+ coco_json: dict = dict(
+ info=info,
+ images=image_infos,
+ categories=self.dataset_meta['CLASSES'],
+ licenses=None,
+ annotations=annotations,
+ )
+ converted_json_path = f'{outfile_prefix}.gt.json'
+ dump(coco_json, converted_json_path, sort_keys=True, indent=4)
+ return converted_json_path
+
+ def results2json(self, keypoints: Dict[int, list],
+ outfile_prefix: str) -> str:
+ """Dump the keypoint detection results to a COCO style json file.
+
+ Args:
+ keypoints (Dict[int, list]): Keypoint detection results
+ of the dataset.
+ outfile_prefix (str): The filename prefix of the json files. If the
+ prefix is "somepath/xxx", the json files will be named
+ "somepath/xxx.keypoints.json",
+
+ Returns:
+ str: The json file name of keypoint results.
+ """
+ # the results with category_id
+ cat_id = 1
+ cat_results = []
+
+ cuts = np.cumsum([
+ 0, self.body_num, self.foot_num, self.face_num, self.left_hand_num,
+ self.right_hand_num
+ ]) * 3
+
+ for _, img_kpts in keypoints.items():
+ _keypoints = np.array(
+ [img_kpt['keypoints'] for img_kpt in img_kpts])
+ num_keypoints = self.dataset_meta['num_keypoints']
+ # collect all the person keypoints in current image
+ _keypoints = _keypoints.reshape(-1, num_keypoints * 3)
+
+ result = [{
+ 'image_id': img_kpt['img_id'],
+ 'category_id': cat_id,
+ 'keypoints': _keypoint[cuts[0]:cuts[1]].tolist(),
+ 'foot_kpts': _keypoint[cuts[1]:cuts[2]].tolist(),
+ 'face_kpts': _keypoint[cuts[2]:cuts[3]].tolist(),
+ 'lefthand_kpts': _keypoint[cuts[3]:cuts[4]].tolist(),
+ 'righthand_kpts': _keypoint[cuts[4]:cuts[5]].tolist(),
+ 'score': float(img_kpt['score']),
+ } for img_kpt, _keypoint in zip(img_kpts, _keypoints)]
+
+ cat_results.extend(result)
+
+ res_file = f'{outfile_prefix}.keypoints.json'
+ dump(cat_results, res_file, sort_keys=True, indent=4)
+
+ def _do_python_keypoint_eval(self, outfile_prefix: str) -> list:
+ """Do keypoint evaluation using COCOAPI.
+
+ Args:
+ outfile_prefix (str): The filename prefix of the json files. If the
+ prefix is "somepath/xxx", the json files will be named
+ "somepath/xxx.keypoints.json",
+
+ Returns:
+ list: a list of tuples. Each tuple contains the evaluation stats
+ name and corresponding stats value.
+ """
+ res_file = f'{outfile_prefix}.keypoints.json'
+ coco_det = self.coco.loadRes(res_file)
+ sigmas = self.dataset_meta['sigmas']
+
+ cuts = np.cumsum([
+ 0, self.body_num, self.foot_num, self.face_num, self.left_hand_num,
+ self.right_hand_num
+ ])
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_body',
+ sigmas[cuts[0]:cuts[1]],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_foot',
+ sigmas[cuts[1]:cuts[2]],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_face',
+ sigmas[cuts[2]:cuts[3]],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_lefthand',
+ sigmas[cuts[3]:cuts[4]],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_righthand',
+ sigmas[cuts[4]:cuts[5]],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco, coco_det, 'keypoints_wholebody', sigmas, use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ stats_names = [
+ 'AP', 'AP .5', 'AP .75', 'AP (M)', 'AP (L)', 'AR', 'AR .5',
+ 'AR .75', 'AR (M)', 'AR (L)'
+ ]
+
+ info_str = list(zip(stats_names, coco_eval.stats))
+
+ return info_str
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/goliath3d_coco_wholebody_metric.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/goliath3d_coco_wholebody_metric.py
new file mode 100644
index 0000000000000000000000000000000000000000..d7d69182220aa1ae8aec18042004b4ca0e3afcc5
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/goliath3d_coco_wholebody_metric.py
@@ -0,0 +1,495 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import datetime
+from typing import Dict, Optional, Sequence
+import numpy as np
+import os
+from mmpose.registry import METRICS
+from .coco_metric import CocoMetric
+import os.path as osp
+import tempfile
+from collections import OrderedDict, defaultdict
+from mmengine.evaluator import BaseMetric
+from mmengine.fileio import dump, get_local_path, load
+from mmengine.logging import MMLogger
+from xtcocotools.coco import COCO
+from xtcocotools.cocoeval import COCOeval
+from ..functional import oks_nms, soft_oks_nms
+
+from .coco_wholebody_metric import CocoWholeBodyMetric
+from mmpose.datasets.datasets.utils import parse_pose_metainfo
+
+try:
+ from configs._base_.datasets.coco_wholebody import dataset_info as coco_wholebody_dataset_meta
+ coco_wholebody_dataset_meta = parse_pose_metainfo(coco_wholebody_dataset_meta)
+except Exception as e:
+ pass
+
+@METRICS.register_module()
+class Goliath3dCocoWholeBodyMetric(CocoMetric):
+ """
+ """
+ default_prefix: Optional[str] = 'goliath3d'
+ body_num = 17
+ foot_num = 6
+ face_num = 46
+ left_hand_num = 20
+ right_hand_num = 20
+ remaining_extra_num = 7 ## total to 116
+
+ def __init__(self,
+ ann_file: Optional[str] = None,
+ coco_wholebody_ann_file: Optional[str] = None,
+ use_area: bool = True,
+ iou_type: str = 'keypoints',
+ score_mode: str = 'bbox_keypoint',
+ keypoint_score_thr: float = 0.2,
+ nms_mode: str = 'oks_nms',
+ nms_thr: float = 0.9,
+ format_only: bool = False,
+ outfile_prefix: Optional[str] = None,
+ collect_device: str = 'cpu',
+ prefix: Optional[str] = None) -> None:
+
+ super().__init__(ann_file, use_area, iou_type, score_mode, keypoint_score_thr, nms_mode,\
+ nms_thr, format_only, outfile_prefix, collect_device, prefix)
+
+ self.coco_wholebody_metric = CocoWholeBodyMetric(coco_wholebody_ann_file, use_area, iou_type, score_mode, keypoint_score_thr, \
+ nms_mode, nms_thr, format_only, outfile_prefix, collect_device, 'coco-wholebody')
+
+ self.coco_wholebody_metric._dataset_meta = coco_wholebody_dataset_meta
+ self.coco_wholebody_num_keypoints = self.coco_wholebody_metric._dataset_meta['num_keypoints']
+
+ self.goliath_num_images = len(self.coco.getImgIds())
+ self.coco_wholebody_num_images = len(self.coco_wholebody_metric.coco.getImgIds())
+
+ ## uncomment to debug
+ # self.goliath_num_images = 16
+ # self.coco_wholebody_num_images = 16
+
+ return
+
+
+ def gt_to_coco_json(self, gt_dicts: Sequence[dict],
+ outfile_prefix: str) -> str:
+ """
+ """
+ image_infos = []
+ annotations = []
+ img_ids = []
+ ann_ids = []
+
+ for gt_dict in gt_dicts:
+ # filter duplicate image_info
+ if gt_dict['img_id'] not in img_ids:
+ image_info = dict(
+ id=gt_dict['img_id'],
+ width=gt_dict['width'],
+ height=gt_dict['height'],
+ )
+ if self.iou_type == 'keypoints_crowd':
+ image_info['crowdIndex'] = gt_dict['crowd_index']
+
+ image_infos.append(image_info)
+ img_ids.append(gt_dict['img_id'])
+
+ # filter duplicate annotations
+ for ann in gt_dict['raw_ann_info']:
+ annotation = dict(
+ id=ann['id'],
+ image_id=ann['image_id'],
+ category_id=ann['category_id'],
+ bbox=ann['bbox'],
+ keypoints=ann['keypoints'],
+ foot_kpts=ann['foot_kpts'],
+ face_kpts=ann['face_kpts'],
+ lefthand_kpts=ann['lefthand_kpts'],
+ righthand_kpts=ann['righthand_kpts'],
+ iscrowd=ann['iscrowd'],
+ )
+ if self.use_area:
+ assert 'area' in ann, \
+ '`area` is required when `self.use_area` is `True`'
+ annotation['area'] = ann['area']
+
+ annotations.append(annotation)
+ ann_ids.append(ann['id'])
+
+ info = dict(
+ date_created=str(datetime.datetime.now()),
+ description='Coco json file converted by mmpose CocoMetric.')
+ coco_json: dict = dict(
+ info=info,
+ images=image_infos,
+ categories=self.dataset_meta['CLASSES'],
+ licenses=None,
+ annotations=annotations,
+ )
+ converted_json_path = f'{outfile_prefix}.gt.json'
+ dump(coco_json, converted_json_path, sort_keys=True, indent=4)
+ return converted_json_path
+
+ def convert_results_goliath_to_coco_wholebody(self, results: list) -> list:
+ """Convert the results of Goliath to COCO-WholeBody format.
+
+ Args:
+ results (list): The processed results of each batch.
+
+ Returns:
+ list: The converted results.
+ """
+ # split prediction and gt list
+ preds, gts = zip(*results) ## gts are don't care here
+ coco_wholebody_to_goliath_mapping = self.dataset_meta['coco_wholebody_to_goliath_mapping'] ## coco_wholebody_index to goliath_index mapping
+ coco_wholebody_indexes, goliath_indexes = zip(*[(k, v) for k, v in coco_wholebody_to_goliath_mapping.items()])
+
+ for pred in preds:
+ goliath_keypoints = pred['keypoints'] ## 1 x 308 x 2
+ goliath_keypoint_scores = pred['keypoint_scores'] ## 1 x 308
+
+ num_detections = goliath_keypoints.shape[0]
+
+ coco_wholebody_keypoints = np.zeros((num_detections, self.coco_wholebody_num_keypoints, 2))
+ coco_wholebody_keypoint_scores = np.zeros((num_detections, self.coco_wholebody_num_keypoints))
+
+ coco_wholebody_keypoints[:, coco_wholebody_indexes, :] = goliath_keypoints[:, goliath_indexes, :]
+ coco_wholebody_keypoint_scores[:, coco_wholebody_indexes] = goliath_keypoint_scores[:, goliath_indexes]
+
+ pred['keypoints'] = coco_wholebody_keypoints
+ pred['keypoint_scores'] = coco_wholebody_keypoint_scores
+
+ # combine the predictions and ground truths
+ results = list(zip(preds, gts))
+
+ return results
+
+ def compute_metrics(self, results: list) -> Dict[str, float]:
+ """Compute the metrics from processed results.
+
+ Args:
+ results (list): The processed results of each batch.
+
+ Returns:
+ Dict[str, float]: The computed metrics. The keys are the names of
+ the metrics, and the values are corresponding results.
+ """
+ print(f'goliath num images:{self.goliath_num_images}, coco_wholebody num images:{self.coco_wholebody_num_images}, results length:{len(results)}')
+
+ assert len(results) > self.goliath_num_images
+
+ results_goliath = results[:self.goliath_num_images]
+ results_coco_wholebody = self.convert_results_goliath_to_coco_wholebody(results[self.goliath_num_images:])
+
+ # Print goliath metrics in orange
+ print('\033[38;5;208m' + '-----------------------------------start goliath3d eval------------------------------------------'+ '\033[0m')
+ goliath_metrics = self.compute_goliath_metrics(results_goliath)
+ print('\033[38;5;208m' + '-----------------------------------end goliath3d eval------------------------------------------' + '\033[0m')
+
+ # Print coco_wholebody metrics in green
+ print('\033[32m' + '-----------------------------------start coco_wholebody eval------------------------------------------'+ '\033[0m')
+ coco_wholebody_metrics = self.coco_wholebody_metric.compute_metrics(results_coco_wholebody)
+ print('\033[32m' + '-----------------------------------end coco_wholebody eval------------------------------------------' + '\033[0m')
+
+ metrics = goliath_metrics.copy()
+
+ for metric_name, metric_value in coco_wholebody_metrics.items():
+ metrics[f'coco_wholebody_{metric_name}'] = metric_value
+
+ return metrics
+
+ def compute_goliath_metrics(self, results: list) -> Dict[str, float]:
+ """Compute the metrics from processed results.
+
+ Args:
+ results (list): The processed results of each batch.
+
+ Returns:
+ Dict[str, float]: The computed metrics. The keys are the names of
+ the metrics, and the values are corresponding results.
+ """
+ logger: MMLogger = MMLogger.get_current_instance()
+
+ # split prediction and gt list
+ preds, gts = zip(*results)
+
+ tmp_dir = None
+ if self.outfile_prefix is None:
+ tmp_dir = tempfile.TemporaryDirectory()
+ outfile_prefix = osp.join(tmp_dir.name, 'results')
+ else:
+ outfile_prefix = self.outfile_prefix
+
+ if self.coco is None:
+ # use converted gt json file to initialize coco helper
+ logger.info('Converting ground truth to coco format...')
+ coco_json_path = self.gt_to_coco_json(
+ gt_dicts=gts, outfile_prefix=outfile_prefix)
+ self.coco = COCO(coco_json_path)
+
+ kpts = defaultdict(list)
+
+ # group the preds by img_id
+ for pred in preds:
+ img_id = pred['img_id']
+ assert pred['img_id'] == pred['id']
+ for idx in range(len(pred['keypoints'])):
+ instance = {
+ 'id': pred['id'],
+ 'img_id': pred['img_id'],
+ 'category_id': pred['category_id'],
+ 'keypoints': pred['keypoints'][idx],
+ 'keypoint_scores': pred['keypoint_scores'][idx],
+ 'bbox_score': pred['bbox_scores'][idx],
+ }
+
+ if 'areas' in pred:
+ instance['area'] = pred['areas'][idx]
+ else:
+ # use keypoint to calculate bbox and get area
+ keypoints = pred['keypoints'][idx]
+ area = (
+ np.max(keypoints[:, 0]) - np.min(keypoints[:, 0])) * (
+ np.max(keypoints[:, 1]) - np.min(keypoints[:, 1]))
+ instance['area'] = area
+
+ kpts[img_id].append(instance)
+
+ # sort keypoint results according to id and remove duplicate ones
+ kpts = self._sort_and_unique_bboxes(kpts, key='id')
+
+ # score the prediction results according to `score_mode`
+ # and perform NMS according to `nms_mode`
+ valid_kpts = defaultdict(list)
+ num_keypoints = self.dataset_meta['num_keypoints']
+ for img_id, instances in kpts.items():
+ for instance in instances:
+ # concatenate the keypoint coordinates and scores
+ instance['keypoints'] = np.concatenate([
+ instance['keypoints'], instance['keypoint_scores'][:, None]
+ ], axis=-1)
+ if self.score_mode == 'bbox':
+ instance['score'] = instance['bbox_score']
+ elif self.score_mode == 'keypoint':
+ instance['score'] = np.mean(instance['keypoint_scores'])
+ else:
+ bbox_score = instance['bbox_score']
+ if self.score_mode == 'bbox_rle':
+ keypoint_scores = instance['keypoint_scores']
+ instance['score'] = float(bbox_score +
+ np.mean(keypoint_scores) +
+ np.max(keypoint_scores))
+
+ else: # self.score_mode == 'bbox_keypoint':
+ mean_kpt_score = 0
+ valid_num = 0
+ for kpt_idx in range(num_keypoints):
+ kpt_score = instance['keypoint_scores'][kpt_idx]
+ if kpt_score > self.keypoint_score_thr:
+ mean_kpt_score += kpt_score
+ valid_num += 1
+ if valid_num != 0:
+ mean_kpt_score /= valid_num
+ instance['score'] = bbox_score * mean_kpt_score
+ # perform nms
+ if self.nms_mode == 'none':
+ valid_kpts[img_id] = instances
+ else:
+ nms = oks_nms if self.nms_mode == 'oks_nms' else soft_oks_nms
+ keep = nms(
+ instances,
+ self.nms_thr,
+ sigmas=self.dataset_meta['sigmas'])
+ valid_kpts[img_id] = [instances[_keep] for _keep in keep]
+
+ # convert results to coco style and dump into a json file
+ self.results2json(valid_kpts, outfile_prefix=outfile_prefix)
+
+ # only format the results without doing quantitative evaluation
+ if self.format_only:
+ logger.info('results are saved in '
+ f'{osp.dirname(outfile_prefix)}')
+ return {}
+
+ # evaluation results
+ eval_results = OrderedDict()
+ logger.info(f'Evaluating {self.__class__.__name__}...')
+ info_str = self._do_python_keypoint_eval(outfile_prefix)
+ name_value = OrderedDict(info_str)
+ eval_results.update(name_value)
+
+ if tmp_dir is not None:
+ tmp_dir.cleanup()
+ return eval_results
+
+ def results2json(self, keypoints: Dict[int, list],
+ outfile_prefix: str) -> str:
+ """Dump the keypoint detection results to a COCO style json file.
+
+ Args:
+ keypoints (Dict[int, list]): Keypoint detection results
+ of the dataset.
+ outfile_prefix (str): The filename prefix of the json files. If the
+ prefix is "somepath/xxx", the json files will be named
+ "somepath/xxx.keypoints.json",
+
+ Returns:
+ str: The json file name of keypoint results.
+ """
+ # the results with category_id
+ cat_id = 1
+ cat_results = []
+
+ self.goliath_info = self.coco.__dict__['dataset']['info']['goliath_info']
+ self.body_keypoint_ids = self.goliath_info['body_keypoint_ids']
+ self.foot_keypoint_ids = self.goliath_info['foot_keypoint_ids']
+ self.face_keypoint_ids = self.goliath_info['face_keypoint_ids']
+ self.left_hand_keypoint_ids = self.goliath_info['left_hand_keypoint_ids']
+ self.right_hand_keypoint_ids = self.goliath_info['right_hand_keypoint_ids']
+
+ assert len(self.body_keypoint_ids) == self.body_num
+ assert len(self.foot_keypoint_ids) == self.foot_num
+ assert len(self.face_keypoint_ids) == self.face_num
+ assert len(self.left_hand_keypoint_ids) == self.left_hand_num
+ assert len(self.right_hand_keypoint_ids) == self.right_hand_num
+
+ for _, img_kpts in keypoints.items():
+ _keypoints = np.array(
+ [img_kpt['keypoints'] for img_kpt in img_kpts])
+ num_keypoints = self.dataset_meta['num_keypoints']
+ # collect all the person keypoints in current image
+ _body_keypoints = _keypoints[:, self.body_keypoint_ids].copy() ## get only body keypoints
+ _foot_keypoints = _keypoints[:, self.foot_keypoint_ids].copy() ## get only foot keypoints
+ _face_keypoints = _keypoints[:, self.face_keypoint_ids].copy() ## get only face keypoints
+ _left_hand_keypoints = _keypoints[:, self.left_hand_keypoint_ids].copy() ## get only left hand keypoints
+ _right_hand_keypoints = _keypoints[:, self.right_hand_keypoint_ids].copy() ## get only right hand keypoints
+
+ _keypoints = _keypoints.reshape(-1, num_keypoints * 3) ## flatten
+ _body_keypoints = _body_keypoints.reshape(-1, self.body_num * 3) ## flatten
+ _foot_keypoints = _foot_keypoints.reshape(-1, self.foot_num * 3) ## flatten
+ _face_keypoints = _face_keypoints.reshape(-1, self.face_num * 3) ## flatten
+ _left_hand_keypoints = _left_hand_keypoints.reshape(-1, self.left_hand_num * 3) ## flatten
+ _right_hand_keypoints = _right_hand_keypoints.reshape(-1, self.right_hand_num * 3) ## flatten
+
+ result = [{
+ 'image_id': img_kpt['img_id'],
+ 'category_id': cat_id,
+ 'goliath_wholebody_kpts': _keypoint.tolist(), ## all keypoints. Modified in xtcocotools
+ 'keypoints': _body_keypoint.tolist(), ## xtcocotools treats this as body keypoints, 17 default
+ 'foot_kpts': _foot_keypoint.tolist(),
+ 'face_kpts': _face_keypoint.tolist(),
+ 'lefthand_kpts': _left_hand_keypoint.tolist(),
+ 'righthand_kpts': _right_hand_keypoint.tolist(),
+ 'score': float(img_kpt['score']),
+ } for img_kpt, _keypoint, _body_keypoint, _foot_keypoint, _face_keypoint, \
+ _left_hand_keypoint, _right_hand_keypoint in zip(img_kpts, _keypoints, \
+ _body_keypoints, _foot_keypoints, _face_keypoints, \
+ _left_hand_keypoints, _right_hand_keypoints)]
+
+ cat_results.extend(result)
+
+ res_file = f'{outfile_prefix}.keypoints.json'
+ dump(cat_results, res_file, sort_keys=True, indent=4)
+
+ def _do_python_keypoint_eval(self, outfile_prefix: str) -> list:
+ """Do keypoint evaluation using COCOAPI.
+
+ Args:
+ outfile_prefix (str): The filename prefix of the json files. If the
+ prefix is "somepath/xxx", the json files will be named
+ "somepath/xxx.keypoints.json",
+
+ Returns:
+ list: a list of tuples. Each tuple contains the evaluation stats
+ name and corresponding stats value.
+ """
+ res_file = f'{outfile_prefix}.keypoints.json'
+ coco_det = self.coco.loadRes(res_file)
+ sigmas = self.dataset_meta['sigmas']
+
+ self.goliath_info = self.coco.__dict__['dataset']['info']['goliath_info']
+ self.body_keypoint_ids = self.goliath_info['body_keypoint_ids']
+ self.foot_keypoint_ids = self.goliath_info['foot_keypoint_ids']
+ self.face_keypoint_ids = self.goliath_info['face_keypoint_ids']
+ self.left_hand_keypoint_ids = self.goliath_info['left_hand_keypoint_ids']
+ self.right_hand_keypoint_ids = self.goliath_info['right_hand_keypoint_ids']
+
+ assert len(self.body_keypoint_ids) == self.body_num
+ assert len(self.foot_keypoint_ids) == self.foot_num
+ assert len(self.face_keypoint_ids) == self.face_num
+ assert len(self.left_hand_keypoint_ids) == self.left_hand_num
+ assert len(self.right_hand_keypoint_ids) == self.right_hand_num
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_body',
+ sigmas[self.body_keypoint_ids],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_foot',
+ sigmas[self.foot_keypoint_ids],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_face',
+ sigmas[self.face_keypoint_ids],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_lefthand',
+ sigmas[self.left_hand_keypoint_ids],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_righthand',
+ sigmas[self.right_hand_keypoint_ids],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco, coco_det, 'keypoints_wholebody_goliath', sigmas, use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ stats_names = [
+ 'AP', 'AP .5', 'AP .75', 'AP (M)', 'AP (L)', 'AR', 'AR .5',
+ 'AR .75', 'AR (M)', 'AR (L)'
+ ]
+
+ info_str = list(zip(stats_names, coco_eval.stats))
+
+ return info_str
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/goliath_coco_wholebody_metric.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/goliath_coco_wholebody_metric.py
new file mode 100644
index 0000000000000000000000000000000000000000..8537457965a1daef67d5b69e23c7283f2ce6c86d
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/goliath_coco_wholebody_metric.py
@@ -0,0 +1,495 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import datetime
+from typing import Dict, Optional, Sequence
+import numpy as np
+import os
+from mmpose.registry import METRICS
+from .coco_metric import CocoMetric
+import os.path as osp
+import tempfile
+from collections import OrderedDict, defaultdict
+from mmengine.evaluator import BaseMetric
+from mmengine.fileio import dump, get_local_path, load
+from mmengine.logging import MMLogger
+from xtcocotools.coco import COCO
+from xtcocotools.cocoeval import COCOeval
+from ..functional import oks_nms, soft_oks_nms
+
+from .coco_wholebody_metric import CocoWholeBodyMetric
+from mmpose.datasets.datasets.utils import parse_pose_metainfo
+
+try:
+ from configs._base_.datasets.coco_wholebody import dataset_info as coco_wholebody_dataset_meta
+ coco_wholebody_dataset_meta = parse_pose_metainfo(coco_wholebody_dataset_meta)
+except Exception as e:
+ pass
+
+@METRICS.register_module()
+class GoliathCocoWholeBodyMetric(CocoMetric):
+ """
+ """
+ default_prefix: Optional[str] = 'goliath'
+ body_num = 17
+ foot_num = 6
+ face_num = 238
+ left_hand_num = 20
+ right_hand_num = 20
+ remaining_extra_num = 7 ## total to 308
+
+ def __init__(self,
+ ann_file: Optional[str] = None,
+ coco_wholebody_ann_file: Optional[str] = None,
+ use_area: bool = True,
+ iou_type: str = 'keypoints',
+ score_mode: str = 'bbox_keypoint',
+ keypoint_score_thr: float = 0.2,
+ nms_mode: str = 'oks_nms',
+ nms_thr: float = 0.9,
+ format_only: bool = False,
+ outfile_prefix: Optional[str] = None,
+ collect_device: str = 'cpu',
+ prefix: Optional[str] = None) -> None:
+
+ super().__init__(ann_file, use_area, iou_type, score_mode, keypoint_score_thr, nms_mode,\
+ nms_thr, format_only, outfile_prefix, collect_device, prefix)
+
+ self.coco_wholebody_metric = CocoWholeBodyMetric(coco_wholebody_ann_file, use_area, iou_type, score_mode, keypoint_score_thr, \
+ nms_mode, nms_thr, format_only, outfile_prefix, collect_device, 'coco-wholebody')
+
+ self.coco_wholebody_metric._dataset_meta = coco_wholebody_dataset_meta
+ self.coco_wholebody_num_keypoints = self.coco_wholebody_metric._dataset_meta['num_keypoints']
+
+ self.goliath_num_images = len(self.coco.getImgIds())
+ self.coco_wholebody_num_images = len(self.coco_wholebody_metric.coco.getImgIds())
+
+ ## uncomment to debug
+ # self.goliath_num_images = 16
+ # self.coco_wholebody_num_images = 16
+
+ return
+
+
+ def gt_to_coco_json(self, gt_dicts: Sequence[dict],
+ outfile_prefix: str) -> str:
+ """
+ """
+ image_infos = []
+ annotations = []
+ img_ids = []
+ ann_ids = []
+
+ for gt_dict in gt_dicts:
+ # filter duplicate image_info
+ if gt_dict['img_id'] not in img_ids:
+ image_info = dict(
+ id=gt_dict['img_id'],
+ width=gt_dict['width'],
+ height=gt_dict['height'],
+ )
+ if self.iou_type == 'keypoints_crowd':
+ image_info['crowdIndex'] = gt_dict['crowd_index']
+
+ image_infos.append(image_info)
+ img_ids.append(gt_dict['img_id'])
+
+ # filter duplicate annotations
+ for ann in gt_dict['raw_ann_info']:
+ annotation = dict(
+ id=ann['id'],
+ image_id=ann['image_id'],
+ category_id=ann['category_id'],
+ bbox=ann['bbox'],
+ keypoints=ann['keypoints'],
+ foot_kpts=ann['foot_kpts'],
+ face_kpts=ann['face_kpts'],
+ lefthand_kpts=ann['lefthand_kpts'],
+ righthand_kpts=ann['righthand_kpts'],
+ iscrowd=ann['iscrowd'],
+ )
+ if self.use_area:
+ assert 'area' in ann, \
+ '`area` is required when `self.use_area` is `True`'
+ annotation['area'] = ann['area']
+
+ annotations.append(annotation)
+ ann_ids.append(ann['id'])
+
+ info = dict(
+ date_created=str(datetime.datetime.now()),
+ description='Coco json file converted by mmpose CocoMetric.')
+ coco_json: dict = dict(
+ info=info,
+ images=image_infos,
+ categories=self.dataset_meta['CLASSES'],
+ licenses=None,
+ annotations=annotations,
+ )
+ converted_json_path = f'{outfile_prefix}.gt.json'
+ dump(coco_json, converted_json_path, sort_keys=True, indent=4)
+ return converted_json_path
+
+ def convert_results_goliath_to_coco_wholebody(self, results: list) -> list:
+ """Convert the results of Goliath to COCO-WholeBody format.
+
+ Args:
+ results (list): The processed results of each batch.
+
+ Returns:
+ list: The converted results.
+ """
+ # split prediction and gt list
+ preds, gts = zip(*results) ## gts are don't care here
+ coco_wholebody_to_goliath_mapping = self.dataset_meta['coco_wholebody_to_goliath_mapping'] ## coco_wholebody_index to goliath_index mapping
+ coco_wholebody_indexes, goliath_indexes = zip(*[(k, v) for k, v in coco_wholebody_to_goliath_mapping.items()])
+
+ for pred in preds:
+ goliath_keypoints = pred['keypoints'] ## 1 x 308 x 2
+ goliath_keypoint_scores = pred['keypoint_scores'] ## 1 x 308
+
+ num_detections = goliath_keypoints.shape[0]
+
+ coco_wholebody_keypoints = np.zeros((num_detections, self.coco_wholebody_num_keypoints, 2))
+ coco_wholebody_keypoint_scores = np.zeros((num_detections, self.coco_wholebody_num_keypoints))
+
+ coco_wholebody_keypoints[:, coco_wholebody_indexes, :] = goliath_keypoints[:, goliath_indexes, :]
+ coco_wholebody_keypoint_scores[:, coco_wholebody_indexes] = goliath_keypoint_scores[:, goliath_indexes]
+
+ pred['keypoints'] = coco_wholebody_keypoints
+ pred['keypoint_scores'] = coco_wholebody_keypoint_scores
+
+ # combine the predictions and ground truths
+ results = list(zip(preds, gts))
+
+ return results
+
+ def compute_metrics(self, results: list) -> Dict[str, float]:
+ """Compute the metrics from processed results.
+
+ Args:
+ results (list): The processed results of each batch.
+
+ Returns:
+ Dict[str, float]: The computed metrics. The keys are the names of
+ the metrics, and the values are corresponding results.
+ """
+ print(f'goliath num images:{self.goliath_num_images}, coco_wholebody num images:{self.coco_wholebody_num_images}, results length:{len(results)}')
+
+ assert len(results) > self.goliath_num_images
+
+ results_goliath = results[:self.goliath_num_images]
+ results_coco_wholebody = self.convert_results_goliath_to_coco_wholebody(results[self.goliath_num_images:])
+
+ # Print goliath metrics in orange
+ print('\033[38;5;208m' + '-----------------------------------start goliath eval------------------------------------------'+ '\033[0m')
+ goliath_metrics = self.compute_goliath_metrics(results_goliath)
+ print('\033[38;5;208m' + '-----------------------------------end goliath eval------------------------------------------' + '\033[0m')
+
+ # Print coco_wholebody metrics in green
+ print('\033[32m' + '-----------------------------------start coco_wholebody eval------------------------------------------'+ '\033[0m')
+ coco_wholebody_metrics = self.coco_wholebody_metric.compute_metrics(results_coco_wholebody)
+ print('\033[32m' + '-----------------------------------end coco_wholebody eval------------------------------------------' + '\033[0m')
+
+ metrics = goliath_metrics.copy()
+
+ for metric_name, metric_value in coco_wholebody_metrics.items():
+ metrics[f'coco_wholebody_{metric_name}'] = metric_value
+
+ return metrics
+
+ def compute_goliath_metrics(self, results: list) -> Dict[str, float]:
+ """Compute the metrics from processed results.
+
+ Args:
+ results (list): The processed results of each batch.
+
+ Returns:
+ Dict[str, float]: The computed metrics. The keys are the names of
+ the metrics, and the values are corresponding results.
+ """
+ logger: MMLogger = MMLogger.get_current_instance()
+
+ # split prediction and gt list
+ preds, gts = zip(*results)
+
+ tmp_dir = None
+ if self.outfile_prefix is None:
+ tmp_dir = tempfile.TemporaryDirectory()
+ outfile_prefix = osp.join(tmp_dir.name, 'results')
+ else:
+ outfile_prefix = self.outfile_prefix
+
+ if self.coco is None:
+ # use converted gt json file to initialize coco helper
+ logger.info('Converting ground truth to coco format...')
+ coco_json_path = self.gt_to_coco_json(
+ gt_dicts=gts, outfile_prefix=outfile_prefix)
+ self.coco = COCO(coco_json_path)
+
+ kpts = defaultdict(list)
+
+ # group the preds by img_id
+ for pred in preds:
+ img_id = pred['img_id']
+ assert pred['img_id'] == pred['id']
+ for idx in range(len(pred['keypoints'])):
+ instance = {
+ 'id': pred['id'],
+ 'img_id': pred['img_id'],
+ 'category_id': pred['category_id'],
+ 'keypoints': pred['keypoints'][idx],
+ 'keypoint_scores': pred['keypoint_scores'][idx],
+ 'bbox_score': pred['bbox_scores'][idx],
+ }
+
+ if 'areas' in pred:
+ instance['area'] = pred['areas'][idx]
+ else:
+ # use keypoint to calculate bbox and get area
+ keypoints = pred['keypoints'][idx]
+ area = (
+ np.max(keypoints[:, 0]) - np.min(keypoints[:, 0])) * (
+ np.max(keypoints[:, 1]) - np.min(keypoints[:, 1]))
+ instance['area'] = area
+
+ kpts[img_id].append(instance)
+
+ # sort keypoint results according to id and remove duplicate ones
+ kpts = self._sort_and_unique_bboxes(kpts, key='id')
+
+ # score the prediction results according to `score_mode`
+ # and perform NMS according to `nms_mode`
+ valid_kpts = defaultdict(list)
+ num_keypoints = self.dataset_meta['num_keypoints']
+ for img_id, instances in kpts.items():
+ for instance in instances:
+ # concatenate the keypoint coordinates and scores
+ instance['keypoints'] = np.concatenate([
+ instance['keypoints'], instance['keypoint_scores'][:, None]
+ ], axis=-1)
+ if self.score_mode == 'bbox':
+ instance['score'] = instance['bbox_score']
+ elif self.score_mode == 'keypoint':
+ instance['score'] = np.mean(instance['keypoint_scores'])
+ else:
+ bbox_score = instance['bbox_score']
+ if self.score_mode == 'bbox_rle':
+ keypoint_scores = instance['keypoint_scores']
+ instance['score'] = float(bbox_score +
+ np.mean(keypoint_scores) +
+ np.max(keypoint_scores))
+
+ else: # self.score_mode == 'bbox_keypoint':
+ mean_kpt_score = 0
+ valid_num = 0
+ for kpt_idx in range(num_keypoints):
+ kpt_score = instance['keypoint_scores'][kpt_idx]
+ if kpt_score > self.keypoint_score_thr:
+ mean_kpt_score += kpt_score
+ valid_num += 1
+ if valid_num != 0:
+ mean_kpt_score /= valid_num
+ instance['score'] = bbox_score * mean_kpt_score
+ # perform nms
+ if self.nms_mode == 'none':
+ valid_kpts[img_id] = instances
+ else:
+ nms = oks_nms if self.nms_mode == 'oks_nms' else soft_oks_nms
+ keep = nms(
+ instances,
+ self.nms_thr,
+ sigmas=self.dataset_meta['sigmas'])
+ valid_kpts[img_id] = [instances[_keep] for _keep in keep]
+
+ # convert results to coco style and dump into a json file
+ self.results2json(valid_kpts, outfile_prefix=outfile_prefix)
+
+ # only format the results without doing quantitative evaluation
+ if self.format_only:
+ logger.info('results are saved in '
+ f'{osp.dirname(outfile_prefix)}')
+ return {}
+
+ # evaluation results
+ eval_results = OrderedDict()
+ logger.info(f'Evaluating {self.__class__.__name__}...')
+ info_str = self._do_python_keypoint_eval(outfile_prefix)
+ name_value = OrderedDict(info_str)
+ eval_results.update(name_value)
+
+ if tmp_dir is not None:
+ tmp_dir.cleanup()
+ return eval_results
+
+ def results2json(self, keypoints: Dict[int, list],
+ outfile_prefix: str) -> str:
+ """Dump the keypoint detection results to a COCO style json file.
+
+ Args:
+ keypoints (Dict[int, list]): Keypoint detection results
+ of the dataset.
+ outfile_prefix (str): The filename prefix of the json files. If the
+ prefix is "somepath/xxx", the json files will be named
+ "somepath/xxx.keypoints.json",
+
+ Returns:
+ str: The json file name of keypoint results.
+ """
+ # the results with category_id
+ cat_id = 1
+ cat_results = []
+
+ self.goliath_info = self.coco.__dict__['dataset']['info']['goliath_info']
+ self.body_keypoint_ids = self.goliath_info['body_keypoint_ids']
+ self.foot_keypoint_ids = self.goliath_info['foot_keypoint_ids']
+ self.face_keypoint_ids = self.goliath_info['face_keypoint_ids']
+ self.left_hand_keypoint_ids = self.goliath_info['left_hand_keypoint_ids']
+ self.right_hand_keypoint_ids = self.goliath_info['right_hand_keypoint_ids']
+
+ assert len(self.body_keypoint_ids) == self.body_num
+ assert len(self.foot_keypoint_ids) == self.foot_num
+ assert len(self.face_keypoint_ids) == self.face_num
+ assert len(self.left_hand_keypoint_ids) == self.left_hand_num
+ assert len(self.right_hand_keypoint_ids) == self.right_hand_num
+
+ for _, img_kpts in keypoints.items():
+ _keypoints = np.array(
+ [img_kpt['keypoints'] for img_kpt in img_kpts])
+ num_keypoints = self.dataset_meta['num_keypoints']
+ # collect all the person keypoints in current image
+ _body_keypoints = _keypoints[:, self.body_keypoint_ids].copy() ## get only body keypoints
+ _foot_keypoints = _keypoints[:, self.foot_keypoint_ids].copy() ## get only foot keypoints
+ _face_keypoints = _keypoints[:, self.face_keypoint_ids].copy() ## get only face keypoints
+ _left_hand_keypoints = _keypoints[:, self.left_hand_keypoint_ids].copy() ## get only left hand keypoints
+ _right_hand_keypoints = _keypoints[:, self.right_hand_keypoint_ids].copy() ## get only right hand keypoints
+
+ _keypoints = _keypoints.reshape(-1, num_keypoints * 3) ## flatten
+ _body_keypoints = _body_keypoints.reshape(-1, self.body_num * 3) ## flatten
+ _foot_keypoints = _foot_keypoints.reshape(-1, self.foot_num * 3) ## flatten
+ _face_keypoints = _face_keypoints.reshape(-1, self.face_num * 3) ## flatten
+ _left_hand_keypoints = _left_hand_keypoints.reshape(-1, self.left_hand_num * 3) ## flatten
+ _right_hand_keypoints = _right_hand_keypoints.reshape(-1, self.right_hand_num * 3) ## flatten
+
+ result = [{
+ 'image_id': img_kpt['img_id'],
+ 'category_id': cat_id,
+ 'goliath_wholebody_kpts': _keypoint.tolist(), ## all keypoints. Modified in xtcocotools
+ 'keypoints': _body_keypoint.tolist(), ## xtcocotools treats this as body keypoints, 17 default
+ 'foot_kpts': _foot_keypoint.tolist(),
+ 'face_kpts': _face_keypoint.tolist(),
+ 'lefthand_kpts': _left_hand_keypoint.tolist(),
+ 'righthand_kpts': _right_hand_keypoint.tolist(),
+ 'score': float(img_kpt['score']),
+ } for img_kpt, _keypoint, _body_keypoint, _foot_keypoint, _face_keypoint, \
+ _left_hand_keypoint, _right_hand_keypoint in zip(img_kpts, _keypoints, \
+ _body_keypoints, _foot_keypoints, _face_keypoints, \
+ _left_hand_keypoints, _right_hand_keypoints)]
+
+ cat_results.extend(result)
+
+ res_file = f'{outfile_prefix}.keypoints.json'
+ dump(cat_results, res_file, sort_keys=True, indent=4)
+
+ def _do_python_keypoint_eval(self, outfile_prefix: str) -> list:
+ """Do keypoint evaluation using COCOAPI.
+
+ Args:
+ outfile_prefix (str): The filename prefix of the json files. If the
+ prefix is "somepath/xxx", the json files will be named
+ "somepath/xxx.keypoints.json",
+
+ Returns:
+ list: a list of tuples. Each tuple contains the evaluation stats
+ name and corresponding stats value.
+ """
+ res_file = f'{outfile_prefix}.keypoints.json'
+ coco_det = self.coco.loadRes(res_file)
+ sigmas = self.dataset_meta['sigmas']
+
+ self.goliath_info = self.coco.__dict__['dataset']['info']['goliath_info']
+ self.body_keypoint_ids = self.goliath_info['body_keypoint_ids']
+ self.foot_keypoint_ids = self.goliath_info['foot_keypoint_ids']
+ self.face_keypoint_ids = self.goliath_info['face_keypoint_ids']
+ self.left_hand_keypoint_ids = self.goliath_info['left_hand_keypoint_ids']
+ self.right_hand_keypoint_ids = self.goliath_info['right_hand_keypoint_ids']
+
+ assert len(self.body_keypoint_ids) == self.body_num
+ assert len(self.foot_keypoint_ids) == self.foot_num
+ assert len(self.face_keypoint_ids) == self.face_num
+ assert len(self.left_hand_keypoint_ids) == self.left_hand_num
+ assert len(self.right_hand_keypoint_ids) == self.right_hand_num
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_body',
+ sigmas[self.body_keypoint_ids],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_foot',
+ sigmas[self.foot_keypoint_ids],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_face',
+ sigmas[self.face_keypoint_ids],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_lefthand',
+ sigmas[self.left_hand_keypoint_ids],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_righthand',
+ sigmas[self.right_hand_keypoint_ids],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco, coco_det, 'keypoints_wholebody_goliath', sigmas, use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ stats_names = [
+ 'AP', 'AP .5', 'AP .75', 'AP (M)', 'AP (L)', 'AR', 'AR .5',
+ 'AR .75', 'AR (M)', 'AR (L)'
+ ]
+
+ info_str = list(zip(stats_names, coco_eval.stats))
+
+ return info_str
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/goliath_metric.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/goliath_metric.py
new file mode 100644
index 0000000000000000000000000000000000000000..fa24ba8822f90e62fea949507154c543ce29eb95
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/goliath_metric.py
@@ -0,0 +1,256 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import datetime
+from typing import Dict, Optional, Sequence
+
+import numpy as np
+from mmengine.fileio import dump
+from xtcocotools.cocoeval import COCOeval
+
+from mmpose.registry import METRICS
+from .coco_metric import CocoMetric
+
+
+@METRICS.register_module()
+class GoliathMetric(CocoMetric):
+ """
+ """
+ default_prefix: Optional[str] = 'goliath'
+ body_num = 17
+ foot_num = 6
+ face_num = 238
+ left_hand_num = 20
+ right_hand_num = 20
+ remaining_extra_num = 7 ## total to 308
+
+ def gt_to_coco_json(self, gt_dicts: Sequence[dict],
+ outfile_prefix: str) -> str:
+ """
+ """
+ image_infos = []
+ annotations = []
+ img_ids = []
+ ann_ids = []
+
+ for gt_dict in gt_dicts:
+ # filter duplicate image_info
+ if gt_dict['img_id'] not in img_ids:
+ image_info = dict(
+ id=gt_dict['img_id'],
+ width=gt_dict['width'],
+ height=gt_dict['height'],
+ )
+ if self.iou_type == 'keypoints_crowd':
+ image_info['crowdIndex'] = gt_dict['crowd_index']
+
+ image_infos.append(image_info)
+ img_ids.append(gt_dict['img_id'])
+
+ # filter duplicate annotations
+ for ann in gt_dict['raw_ann_info']:
+ annotation = dict(
+ id=ann['id'],
+ image_id=ann['image_id'],
+ category_id=ann['category_id'],
+ bbox=ann['bbox'],
+ keypoints=ann['keypoints'],
+ foot_kpts=ann['foot_kpts'],
+ face_kpts=ann['face_kpts'],
+ lefthand_kpts=ann['lefthand_kpts'],
+ righthand_kpts=ann['righthand_kpts'],
+ iscrowd=ann['iscrowd'],
+ )
+ if self.use_area:
+ assert 'area' in ann, \
+ '`area` is required when `self.use_area` is `True`'
+ annotation['area'] = ann['area']
+
+ annotations.append(annotation)
+ ann_ids.append(ann['id'])
+
+ info = dict(
+ date_created=str(datetime.datetime.now()),
+ description='Coco json file converted by mmpose CocoMetric.')
+ coco_json: dict = dict(
+ info=info,
+ images=image_infos,
+ categories=self.dataset_meta['CLASSES'],
+ licenses=None,
+ annotations=annotations,
+ )
+ converted_json_path = f'{outfile_prefix}.gt.json'
+ dump(coco_json, converted_json_path, sort_keys=True, indent=4)
+ return converted_json_path
+
+ def results2json(self, keypoints: Dict[int, list],
+ outfile_prefix: str) -> str:
+ """Dump the keypoint detection results to a COCO style json file.
+
+ Args:
+ keypoints (Dict[int, list]): Keypoint detection results
+ of the dataset.
+ outfile_prefix (str): The filename prefix of the json files. If the
+ prefix is "somepath/xxx", the json files will be named
+ "somepath/xxx.keypoints.json",
+
+ Returns:
+ str: The json file name of keypoint results.
+ """
+ # the results with category_id
+ cat_id = 1
+ cat_results = []
+
+ self.goliath_info = self.coco.__dict__['dataset']['info']['goliath_info']
+ self.body_keypoint_ids = self.goliath_info['body_keypoint_ids']
+ self.foot_keypoint_ids = self.goliath_info['foot_keypoint_ids']
+ self.face_keypoint_ids = self.goliath_info['face_keypoint_ids']
+ self.left_hand_keypoint_ids = self.goliath_info['left_hand_keypoint_ids']
+ self.right_hand_keypoint_ids = self.goliath_info['right_hand_keypoint_ids']
+
+ assert len(self.body_keypoint_ids) == self.body_num
+ assert len(self.foot_keypoint_ids) == self.foot_num
+ assert len(self.face_keypoint_ids) == self.face_num
+ assert len(self.left_hand_keypoint_ids) == self.left_hand_num
+ assert len(self.right_hand_keypoint_ids) == self.right_hand_num
+
+ for _, img_kpts in keypoints.items():
+ _keypoints = np.array(
+ [img_kpt['keypoints'] for img_kpt in img_kpts])
+ num_keypoints = self.dataset_meta['num_keypoints']
+ # collect all the person keypoints in current image
+ _body_keypoints = _keypoints[:, self.body_keypoint_ids].copy() ## get only body keypoints
+ _foot_keypoints = _keypoints[:, self.foot_keypoint_ids].copy() ## get only foot keypoints
+ _face_keypoints = _keypoints[:, self.face_keypoint_ids].copy() ## get only face keypoints
+ _left_hand_keypoints = _keypoints[:, self.left_hand_keypoint_ids].copy() ## get only left hand keypoints
+ _right_hand_keypoints = _keypoints[:, self.right_hand_keypoint_ids].copy() ## get only right hand keypoints
+
+ _keypoints = _keypoints.reshape(-1, num_keypoints * 3) ## flatten
+ _body_keypoints = _body_keypoints.reshape(-1, self.body_num * 3) ## flatten
+ _foot_keypoints = _foot_keypoints.reshape(-1, self.foot_num * 3) ## flatten
+ _face_keypoints = _face_keypoints.reshape(-1, self.face_num * 3) ## flatten
+ _left_hand_keypoints = _left_hand_keypoints.reshape(-1, self.left_hand_num * 3) ## flatten
+ _right_hand_keypoints = _right_hand_keypoints.reshape(-1, self.right_hand_num * 3) ## flatten
+
+ result = [{
+ 'image_id': img_kpt['img_id'],
+ 'category_id': cat_id,
+ 'goliath_wholebody_kpts': _keypoint.tolist(), ## all keypoints. Modified in xtcocotools
+ 'keypoints': _body_keypoint.tolist(), ## xtcocotools treats this as body keypoints, 17 default
+ 'foot_kpts': _foot_keypoint.tolist(),
+ 'face_kpts': _face_keypoint.tolist(),
+ 'lefthand_kpts': _left_hand_keypoint.tolist(),
+ 'righthand_kpts': _right_hand_keypoint.tolist(),
+ 'score': float(img_kpt['score']),
+ } for img_kpt, _keypoint, _body_keypoint, _foot_keypoint, _face_keypoint, \
+ _left_hand_keypoint, _right_hand_keypoint in zip(img_kpts, _keypoints, \
+ _body_keypoints, _foot_keypoints, _face_keypoints, \
+ _left_hand_keypoints, _right_hand_keypoints)]
+
+ cat_results.extend(result)
+
+ res_file = f'{outfile_prefix}.keypoints.json'
+ dump(cat_results, res_file, sort_keys=True, indent=4)
+
+ def _do_python_keypoint_eval(self, outfile_prefix: str) -> list:
+ """Do keypoint evaluation using COCOAPI.
+
+ Args:
+ outfile_prefix (str): The filename prefix of the json files. If the
+ prefix is "somepath/xxx", the json files will be named
+ "somepath/xxx.keypoints.json",
+
+ Returns:
+ list: a list of tuples. Each tuple contains the evaluation stats
+ name and corresponding stats value.
+ """
+ res_file = f'{outfile_prefix}.keypoints.json'
+ coco_det = self.coco.loadRes(res_file)
+ sigmas = self.dataset_meta['sigmas']
+
+ self.goliath_info = self.coco.__dict__['dataset']['info']['goliath_info']
+ self.body_keypoint_ids = self.goliath_info['body_keypoint_ids']
+ self.foot_keypoint_ids = self.goliath_info['foot_keypoint_ids']
+ self.face_keypoint_ids = self.goliath_info['face_keypoint_ids']
+ self.left_hand_keypoint_ids = self.goliath_info['left_hand_keypoint_ids']
+ self.right_hand_keypoint_ids = self.goliath_info['right_hand_keypoint_ids']
+
+ assert len(self.body_keypoint_ids) == self.body_num
+ assert len(self.foot_keypoint_ids) == self.foot_num
+ assert len(self.face_keypoint_ids) == self.face_num
+ assert len(self.left_hand_keypoint_ids) == self.left_hand_num
+ assert len(self.right_hand_keypoint_ids) == self.right_hand_num
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_body',
+ sigmas[self.body_keypoint_ids],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_foot',
+ sigmas[self.foot_keypoint_ids],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_face',
+ sigmas[self.face_keypoint_ids],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_lefthand',
+ sigmas[self.left_hand_keypoint_ids],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco,
+ coco_det,
+ 'keypoints_righthand',
+ sigmas[self.right_hand_keypoint_ids],
+ use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ coco_eval = COCOeval(
+ self.coco, coco_det, 'keypoints_wholebody_goliath', sigmas, use_area=True)
+ coco_eval.params.useSegm = None
+ coco_eval.evaluate()
+ coco_eval.accumulate()
+ coco_eval.summarize()
+
+ stats_names = [
+ 'AP', 'AP .5', 'AP .75', 'AP (M)', 'AP (L)', 'AR', 'AR .5',
+ 'AR .75', 'AR (M)', 'AR (L)'
+ ]
+
+ info_str = list(zip(stats_names, coco_eval.stats))
+
+ return info_str
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/keypoint_2d_metrics.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/keypoint_2d_metrics.py
new file mode 100644
index 0000000000000000000000000000000000000000..3e6e3d215816389ac690cdb7564414c4804e23fc
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/keypoint_2d_metrics.py
@@ -0,0 +1,917 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import warnings
+from typing import Dict, Optional, Sequence, Union
+
+import numpy as np
+from mmengine.evaluator import BaseMetric
+from mmengine.logging import MMLogger
+
+from mmpose.registry import METRICS
+from ..functional import (keypoint_auc, keypoint_epe, keypoint_nme,
+ keypoint_pck_accuracy)
+
+
+@METRICS.register_module()
+class PCKAccuracy(BaseMetric):
+ """PCK accuracy evaluation metric.
+ Calculate the pose accuracy of Percentage of Correct Keypoints (PCK) for
+ each individual keypoint and the averaged accuracy across all keypoints.
+ PCK metric measures accuracy of the localization of the body joints.
+ The distances between predicted positions and the ground-truth ones
+ are typically normalized by the person bounding box size.
+ The threshold (thr) of the normalized distance is commonly set
+ as 0.05, 0.1 or 0.2 etc.
+ Note:
+ - length of dataset: N
+ - num_keypoints: K
+ - number of keypoint dimensions: D (typically D = 2)
+ Args:
+ thr(float): Threshold of PCK calculation. Default: 0.05.
+ norm_item (str | Sequence[str]): The item used for normalization.
+ Valid items include 'bbox', 'head', 'torso', which correspond
+ to 'PCK', 'PCKh' and 'tPCK' respectively. Default: ``'bbox'``.
+ collect_device (str): Device name used for collecting results from
+ different ranks during distributed training. Must be ``'cpu'`` or
+ ``'gpu'``. Default: ``'cpu'``.
+ prefix (str, optional): The prefix that will be added in the metric
+ names to disambiguate homonymous metrics of different evaluators.
+ If prefix is not provided in the argument, ``self.default_prefix``
+ will be used instead. Default: ``None``.
+
+ Examples:
+
+ >>> from mmpose.evaluation.metrics import PCKAccuracy
+ >>> import numpy as np
+ >>> from mmengine.structures import InstanceData
+ >>> num_keypoints = 15
+ >>> keypoints = np.random.random((1, num_keypoints, 2)) * 10
+ >>> gt_instances = InstanceData()
+ >>> gt_instances.keypoints = keypoints
+ >>> gt_instances.keypoints_visible = np.ones(
+ ... (1, num_keypoints, 1)).astype(bool)
+ >>> gt_instances.bboxes = np.random.random((1, 4)) * 20
+ >>> pred_instances = InstanceData()
+ >>> pred_instances.keypoints = keypoints
+ >>> data_sample = {
+ ... 'gt_instances': gt_instances.to_dict(),
+ ... 'pred_instances': pred_instances.to_dict(),
+ ... }
+ >>> data_samples = [data_sample]
+ >>> data_batch = [{'inputs': None}]
+ >>> pck_metric = PCKAccuracy(thr=0.5, norm_item='bbox')
+ ...: UserWarning: The prefix is not set in metric class PCKAccuracy.
+ >>> pck_metric.process(data_batch, data_samples)
+ >>> pck_metric.evaluate(1)
+ 10/26 15:37:57 - mmengine - INFO - Evaluating PCKAccuracy (normalized by ``"bbox_size"``)... # noqa
+ {'PCK': 1.0}
+
+ """
+
+ def __init__(self,
+ thr: float = 0.05,
+ norm_item: Union[str, Sequence[str]] = 'bbox',
+ collect_device: str = 'cpu',
+ prefix: Optional[str] = None) -> None:
+ super().__init__(collect_device=collect_device, prefix=prefix)
+ self.thr = thr
+ self.norm_item = norm_item if isinstance(norm_item,
+ (tuple,
+ list)) else [norm_item]
+ allow_normalized_items = ['bbox', 'head', 'torso']
+ for item in self.norm_item:
+ if item not in allow_normalized_items:
+ raise KeyError(
+ f'The normalized item {item} is not supported by '
+ f"{self.__class__.__name__}. Should be one of 'bbox', "
+ f"'head', 'torso', but got {item}.")
+
+ def process(self, data_batch: Sequence[dict],
+ data_samples: Sequence[dict]) -> None:
+ """Process one batch of data samples and predictions.
+
+ The processed
+ results should be stored in ``self.results``, which will be used to
+ compute the metrics when all batches have been processed.
+ Args:
+ data_batch (Sequence[dict]): A batch of data
+ from the dataloader.
+ data_samples (Sequence[dict]): A batch of outputs from
+ the model.
+ """
+ for data_sample in data_samples:
+ # predicted keypoints coordinates, [1, K, D]
+ pred_coords = data_sample['pred_instances']['keypoints']
+ # ground truth data_info
+ gt = data_sample['gt_instances']
+ # ground truth keypoints coordinates, [1, K, D]
+ gt_coords = gt['keypoints']
+ # ground truth keypoints_visible, [1, K, 1]
+ mask = gt['keypoints_visible'].astype(bool).reshape(1, -1)
+
+ result = {
+ 'pred_coords': pred_coords,
+ 'gt_coords': gt_coords,
+ 'mask': mask,
+ }
+
+ if 'bbox' in self.norm_item:
+ assert 'bboxes' in gt, 'The ground truth data info do not ' \
+ 'have the expected normalized_item ``"bbox"``.'
+ # ground truth bboxes, [1, 4]
+ bbox_size_ = np.max(gt['bboxes'][0][2:] - gt['bboxes'][0][:2])
+ bbox_size = np.array([bbox_size_, bbox_size_]).reshape(-1, 2)
+ result['bbox_size'] = bbox_size
+
+ if 'head' in self.norm_item:
+ assert 'head_size' in gt, 'The ground truth data info do ' \
+ 'not have the expected normalized_item ``"head_size"``.'
+ # ground truth bboxes
+ head_size_ = gt['head_size']
+ head_size = np.array([head_size_, head_size_]).reshape(-1, 2)
+ result['head_size'] = head_size
+
+ if 'torso' in self.norm_item:
+ # used in JhmdbDataset
+ torso_size_ = np.linalg.norm(gt_coords[0][4] - gt_coords[0][5])
+ if torso_size_ < 1:
+ torso_size_ = np.linalg.norm(pred_coords[0][4] -
+ pred_coords[0][5])
+ warnings.warn('Ground truth torso size < 1. '
+ 'Use torso size from predicted '
+ 'keypoint results instead.')
+ torso_size = np.array([torso_size_,
+ torso_size_]).reshape(-1, 2)
+ result['torso_size'] = torso_size
+
+ self.results.append(result)
+
+ def compute_metrics(self, results: list) -> Dict[str, float]:
+ """Compute the metrics from processed results.
+
+ Args:
+ results (list): The processed results of each batch.
+ Returns:
+ Dict[str, float]: The computed metrics. The keys are the names of
+ the metrics, and the values are corresponding results.
+ The returned result dict may have the following keys:
+ - 'PCK': The pck accuracy normalized by `bbox_size`.
+ - 'PCKh': The pck accuracy normalized by `head_size`.
+ - 'tPCK': The pck accuracy normalized by `torso_size`.
+ """
+ logger: MMLogger = MMLogger.get_current_instance()
+
+ # pred_coords: [N, K, D]
+ pred_coords = np.concatenate(
+ [result['pred_coords'] for result in results])
+ # gt_coords: [N, K, D]
+ gt_coords = np.concatenate([result['gt_coords'] for result in results])
+ # mask: [N, K]
+ mask = np.concatenate([result['mask'] for result in results])
+
+ metrics = dict()
+ if 'bbox' in self.norm_item:
+ norm_size_bbox = np.concatenate(
+ [result['bbox_size'] for result in results])
+
+ logger.info(f'Evaluating {self.__class__.__name__} '
+ f'(normalized by ``"bbox_size"``)...')
+
+ _, pck, _ = keypoint_pck_accuracy(pred_coords, gt_coords, mask,
+ self.thr, norm_size_bbox)
+ metrics['PCK'] = pck
+
+ if 'head' in self.norm_item:
+ norm_size_head = np.concatenate(
+ [result['head_size'] for result in results])
+
+ logger.info(f'Evaluating {self.__class__.__name__} '
+ f'(normalized by ``"head_size"``)...')
+
+ _, pckh, _ = keypoint_pck_accuracy(pred_coords, gt_coords, mask,
+ self.thr, norm_size_head)
+ metrics['PCKh'] = pckh
+
+ if 'torso' in self.norm_item:
+ norm_size_torso = np.concatenate(
+ [result['torso_size'] for result in results])
+
+ logger.info(f'Evaluating {self.__class__.__name__} '
+ f'(normalized by ``"torso_size"``)...')
+
+ _, tpck, _ = keypoint_pck_accuracy(pred_coords, gt_coords, mask,
+ self.thr, norm_size_torso)
+ metrics['tPCK'] = tpck
+
+ return metrics
+
+
+@METRICS.register_module()
+class MpiiPCKAccuracy(PCKAccuracy):
+ """PCKh accuracy evaluation metric for MPII dataset.
+
+ Calculate the pose accuracy of Percentage of Correct Keypoints (PCK) for
+ each individual keypoint and the averaged accuracy across all keypoints.
+ PCK metric measures accuracy of the localization of the body joints.
+ The distances between predicted positions and the ground-truth ones
+ are typically normalized by the person bounding box size.
+ The threshold (thr) of the normalized distance is commonly set
+ as 0.05, 0.1 or 0.2 etc.
+
+ Note:
+ - length of dataset: N
+ - num_keypoints: K
+ - number of keypoint dimensions: D (typically D = 2)
+
+ Args:
+ thr(float): Threshold of PCK calculation. Default: 0.05.
+ norm_item (str | Sequence[str]): The item used for normalization.
+ Valid items include 'bbox', 'head', 'torso', which correspond
+ to 'PCK', 'PCKh' and 'tPCK' respectively. Default: ``'head'``.
+ collect_device (str): Device name used for collecting results from
+ different ranks during distributed training. Must be ``'cpu'`` or
+ ``'gpu'``. Default: ``'cpu'``.
+ prefix (str, optional): The prefix that will be added in the metric
+ names to disambiguate homonymous metrics of different evaluators.
+ If prefix is not provided in the argument, ``self.default_prefix``
+ will be used instead. Default: ``None``.
+
+ Examples:
+
+ >>> from mmpose.evaluation.metrics import MpiiPCKAccuracy
+ >>> import numpy as np
+ >>> from mmengine.structures import InstanceData
+ >>> num_keypoints = 16
+ >>> keypoints = np.random.random((1, num_keypoints, 2)) * 10
+ >>> gt_instances = InstanceData()
+ >>> gt_instances.keypoints = keypoints + 1.0
+ >>> gt_instances.keypoints_visible = np.ones(
+ ... (1, num_keypoints, 1)).astype(bool)
+ >>> gt_instances.head_size = np.random.random((1, 1)) * 10
+ >>> pred_instances = InstanceData()
+ >>> pred_instances.keypoints = keypoints
+ >>> data_sample = {
+ ... 'gt_instances': gt_instances.to_dict(),
+ ... 'pred_instances': pred_instances.to_dict(),
+ ... }
+ >>> data_samples = [data_sample]
+ >>> data_batch = [{'inputs': None}]
+ >>> mpii_pck_metric = MpiiPCKAccuracy(thr=0.3, norm_item='head')
+ ... UserWarning: The prefix is not set in metric class MpiiPCKAccuracy.
+ >>> mpii_pck_metric.process(data_batch, data_samples)
+ >>> mpii_pck_metric.evaluate(1)
+ 10/26 17:43:39 - mmengine - INFO - Evaluating MpiiPCKAccuracy (normalized by ``"head_size"``)... # noqa
+ {'Head PCK': 100.0, 'Shoulder PCK': 100.0, 'Elbow PCK': 100.0,
+ Wrist PCK': 100.0, 'Hip PCK': 100.0, 'Knee PCK': 100.0,
+ 'Ankle PCK': 100.0, 'PCK': 100.0, 'PCK@0.1': 100.0}
+ """
+
+ def __init__(self,
+ thr: float = 0.5,
+ norm_item: Union[str, Sequence[str]] = 'head',
+ collect_device: str = 'cpu',
+ prefix: Optional[str] = None) -> None:
+ super().__init__(
+ thr=thr,
+ norm_item=norm_item,
+ collect_device=collect_device,
+ prefix=prefix)
+
+ def compute_metrics(self, results: list) -> Dict[str, float]:
+ """Compute the metrics from processed results.
+
+ Args:
+ results (list): The processed results of each batch.
+
+ Returns:
+ Dict[str, float]: The computed metrics. The keys are the names of
+ the metrics, and the values are corresponding results.
+ If `'head'` in `self.norm_item`, the returned results are the pck
+ accuracy normalized by `head_size`, which have the following keys:
+ - 'Head PCK': The PCK of head
+ - 'Shoulder PCK': The PCK of shoulder
+ - 'Elbow PCK': The PCK of elbow
+ - 'Wrist PCK': The PCK of wrist
+ - 'Hip PCK': The PCK of hip
+ - 'Knee PCK': The PCK of knee
+ - 'Ankle PCK': The PCK of ankle
+ - 'PCK': The mean PCK over all keypoints
+ - 'PCK@0.1': The mean PCK at threshold 0.1
+ """
+ logger: MMLogger = MMLogger.get_current_instance()
+
+ # pred_coords: [N, K, D]
+ pred_coords = np.concatenate(
+ [result['pred_coords'] for result in results])
+ # gt_coords: [N, K, D]
+ gt_coords = np.concatenate([result['gt_coords'] for result in results])
+ # mask: [N, K]
+ mask = np.concatenate([result['mask'] for result in results])
+
+ # MPII uses matlab format, gt index is 1-based,
+ # convert 0-based index to 1-based index
+ pred_coords = pred_coords + 1.0
+
+ metrics = {}
+ if 'head' in self.norm_item:
+ norm_size_head = np.concatenate(
+ [result['head_size'] for result in results])
+
+ logger.info(f'Evaluating {self.__class__.__name__} '
+ f'(normalized by ``"head_size"``)...')
+
+ pck_p, _, _ = keypoint_pck_accuracy(pred_coords, gt_coords, mask,
+ self.thr, norm_size_head)
+
+ jnt_count = np.sum(mask, axis=0)
+ PCKh = 100. * pck_p
+
+ rng = np.arange(0, 0.5 + 0.01, 0.01)
+ pckAll = np.zeros((len(rng), 16), dtype=np.float32)
+
+ for r, threshold in enumerate(rng):
+ _pck, _, _ = keypoint_pck_accuracy(pred_coords, gt_coords,
+ mask, threshold,
+ norm_size_head)
+ pckAll[r, :] = 100. * _pck
+
+ PCKh = np.ma.array(PCKh, mask=False)
+ PCKh.mask[6:8] = True
+
+ jnt_count = np.ma.array(jnt_count, mask=False)
+ jnt_count.mask[6:8] = True
+ jnt_ratio = jnt_count / np.sum(jnt_count).astype(np.float64)
+
+ # dataset_joints_idx:
+ # head 9
+ # lsho 13 rsho 12
+ # lelb 14 relb 11
+ # lwri 15 rwri 10
+ # lhip 3 rhip 2
+ # lkne 4 rkne 1
+ # lank 5 rank 0
+ stats = {
+ 'Head PCK': PCKh[9],
+ 'Shoulder PCK': 0.5 * (PCKh[13] + PCKh[12]),
+ 'Elbow PCK': 0.5 * (PCKh[14] + PCKh[11]),
+ 'Wrist PCK': 0.5 * (PCKh[15] + PCKh[10]),
+ 'Hip PCK': 0.5 * (PCKh[3] + PCKh[2]),
+ 'Knee PCK': 0.5 * (PCKh[4] + PCKh[1]),
+ 'Ankle PCK': 0.5 * (PCKh[5] + PCKh[0]),
+ 'PCK': np.sum(PCKh * jnt_ratio),
+ 'PCK@0.1': np.sum(pckAll[10, :] * jnt_ratio)
+ }
+
+ for stats_name, stat in stats.items():
+ metrics[stats_name] = stat
+
+ return metrics
+
+
+@METRICS.register_module()
+class JhmdbPCKAccuracy(PCKAccuracy):
+ """PCK accuracy evaluation metric for Jhmdb dataset.
+
+ Calculate the pose accuracy of Percentage of Correct Keypoints (PCK) for
+ each individual keypoint and the averaged accuracy across all keypoints.
+ PCK metric measures accuracy of the localization of the body joints.
+ The distances between predicted positions and the ground-truth ones
+ are typically normalized by the person bounding box size.
+ The threshold (thr) of the normalized distance is commonly set
+ as 0.05, 0.1 or 0.2 etc.
+
+ Note:
+ - length of dataset: N
+ - num_keypoints: K
+ - number of keypoint dimensions: D (typically D = 2)
+
+ Args:
+ thr(float): Threshold of PCK calculation. Default: 0.05.
+ norm_item (str | Sequence[str]): The item used for normalization.
+ Valid items include 'bbox', 'head', 'torso', which correspond
+ to 'PCK', 'PCKh' and 'tPCK' respectively. Default: ``'bbox'``.
+ collect_device (str): Device name used for collecting results from
+ different ranks during distributed training. Must be ``'cpu'`` or
+ ``'gpu'``. Default: ``'cpu'``.
+ prefix (str, optional): The prefix that will be added in the metric
+ names to disambiguate homonymous metrics of different evaluators.
+ If prefix is not provided in the argument, ``self.default_prefix``
+ will be used instead. Default: ``None``.
+
+ Examples:
+
+ >>> from mmpose.evaluation.metrics import JhmdbPCKAccuracy
+ >>> import numpy as np
+ >>> from mmengine.structures import InstanceData
+ >>> num_keypoints = 15
+ >>> keypoints = np.random.random((1, num_keypoints, 2)) * 10
+ >>> gt_instances = InstanceData()
+ >>> gt_instances.keypoints = keypoints
+ >>> gt_instances.keypoints_visible = np.ones(
+ ... (1, num_keypoints, 1)).astype(bool)
+ >>> gt_instances.bboxes = np.random.random((1, 4)) * 20
+ >>> gt_instances.head_size = np.random.random((1, 1)) * 10
+ >>> pred_instances = InstanceData()
+ >>> pred_instances.keypoints = keypoints
+ >>> data_sample = {
+ ... 'gt_instances': gt_instances.to_dict(),
+ ... 'pred_instances': pred_instances.to_dict(),
+ ... }
+ >>> data_samples = [data_sample]
+ >>> data_batch = [{'inputs': None}]
+ >>> jhmdb_pck_metric = JhmdbPCKAccuracy(thr=0.2, norm_item=['bbox', 'torso'])
+ ... UserWarning: The prefix is not set in metric class JhmdbPCKAccuracy.
+ >>> jhmdb_pck_metric.process(data_batch, data_samples)
+ >>> jhmdb_pck_metric.evaluate(1)
+ 10/26 17:48:09 - mmengine - INFO - Evaluating JhmdbPCKAccuracy (normalized by ``"bbox_size"``)... # noqa
+ 10/26 17:48:09 - mmengine - INFO - Evaluating JhmdbPCKAccuracy (normalized by ``"torso_size"``)... # noqa
+ {'Head PCK': 1.0, 'Sho PCK': 1.0, 'Elb PCK': 1.0, 'Wri PCK': 1.0,
+ 'Hip PCK': 1.0, 'Knee PCK': 1.0, 'Ank PCK': 1.0, 'PCK': 1.0,
+ 'Head tPCK': 1.0, 'Sho tPCK': 1.0, 'Elb tPCK': 1.0, 'Wri tPCK': 1.0,
+ 'Hip tPCK': 1.0, 'Knee tPCK': 1.0, 'Ank tPCK': 1.0, 'tPCK': 1.0}
+ """
+
+ def __init__(self,
+ thr: float = 0.05,
+ norm_item: Union[str, Sequence[str]] = 'bbox',
+ collect_device: str = 'cpu',
+ prefix: Optional[str] = None) -> None:
+ super().__init__(
+ thr=thr,
+ norm_item=norm_item,
+ collect_device=collect_device,
+ prefix=prefix)
+
+ def compute_metrics(self, results: list) -> Dict[str, float]:
+ """Compute the metrics from processed results.
+
+ Args:
+ results (list): The processed results of each batch.
+
+ Returns:
+ Dict[str, float]: The computed metrics. The keys are the names of
+ the metrics, and the values are corresponding results.
+ If `'bbox'` in `self.norm_item`, the returned results are the pck
+ accuracy normalized by `bbox_size`, which have the following keys:
+ - 'Head PCK': The PCK of head
+ - 'Sho PCK': The PCK of shoulder
+ - 'Elb PCK': The PCK of elbow
+ - 'Wri PCK': The PCK of wrist
+ - 'Hip PCK': The PCK of hip
+ - 'Knee PCK': The PCK of knee
+ - 'Ank PCK': The PCK of ankle
+ - 'PCK': The mean PCK over all keypoints
+ If `'torso'` in `self.norm_item`, the returned results are the pck
+ accuracy normalized by `torso_size`, which have the following keys:
+ - 'Head tPCK': The PCK of head
+ - 'Sho tPCK': The PCK of shoulder
+ - 'Elb tPCK': The PCK of elbow
+ - 'Wri tPCK': The PCK of wrist
+ - 'Hip tPCK': The PCK of hip
+ - 'Knee tPCK': The PCK of knee
+ - 'Ank tPCK': The PCK of ankle
+ - 'tPCK': The mean PCK over all keypoints
+ """
+ logger: MMLogger = MMLogger.get_current_instance()
+
+ # pred_coords: [N, K, D]
+ pred_coords = np.concatenate(
+ [result['pred_coords'] for result in results])
+ # gt_coords: [N, K, D]
+ gt_coords = np.concatenate([result['gt_coords'] for result in results])
+ # mask: [N, K]
+ mask = np.concatenate([result['mask'] for result in results])
+
+ metrics = dict()
+ if 'bbox' in self.norm_item:
+ norm_size_bbox = np.concatenate(
+ [result['bbox_size'] for result in results])
+
+ logger.info(f'Evaluating {self.__class__.__name__} '
+ f'(normalized by ``"bbox_size"``)...')
+
+ pck_p, pck, _ = keypoint_pck_accuracy(pred_coords, gt_coords, mask,
+ self.thr, norm_size_bbox)
+ stats = {
+ 'Head PCK': pck_p[2],
+ 'Sho PCK': 0.5 * pck_p[3] + 0.5 * pck_p[4],
+ 'Elb PCK': 0.5 * pck_p[7] + 0.5 * pck_p[8],
+ 'Wri PCK': 0.5 * pck_p[11] + 0.5 * pck_p[12],
+ 'Hip PCK': 0.5 * pck_p[5] + 0.5 * pck_p[6],
+ 'Knee PCK': 0.5 * pck_p[9] + 0.5 * pck_p[10],
+ 'Ank PCK': 0.5 * pck_p[13] + 0.5 * pck_p[14],
+ 'PCK': pck
+ }
+
+ for stats_name, stat in stats.items():
+ metrics[stats_name] = stat
+
+ if 'torso' in self.norm_item:
+ norm_size_torso = np.concatenate(
+ [result['torso_size'] for result in results])
+
+ logger.info(f'Evaluating {self.__class__.__name__} '
+ f'(normalized by ``"torso_size"``)...')
+
+ pck_p, pck, _ = keypoint_pck_accuracy(pred_coords, gt_coords, mask,
+ self.thr, norm_size_torso)
+
+ stats = {
+ 'Head tPCK': pck_p[2],
+ 'Sho tPCK': 0.5 * pck_p[3] + 0.5 * pck_p[4],
+ 'Elb tPCK': 0.5 * pck_p[7] + 0.5 * pck_p[8],
+ 'Wri tPCK': 0.5 * pck_p[11] + 0.5 * pck_p[12],
+ 'Hip tPCK': 0.5 * pck_p[5] + 0.5 * pck_p[6],
+ 'Knee tPCK': 0.5 * pck_p[9] + 0.5 * pck_p[10],
+ 'Ank tPCK': 0.5 * pck_p[13] + 0.5 * pck_p[14],
+ 'tPCK': pck
+ }
+
+ for stats_name, stat in stats.items():
+ metrics[stats_name] = stat
+
+ return metrics
+
+
+@METRICS.register_module()
+class AUC(BaseMetric):
+ """AUC evaluation metric.
+
+ Calculate the Area Under Curve (AUC) of keypoint PCK accuracy.
+
+ By altering the threshold percentage in the calculation of PCK accuracy,
+ AUC can be generated to further evaluate the pose estimation algorithms.
+
+ Note:
+ - length of dataset: N
+ - num_keypoints: K
+ - number of keypoint dimensions: D (typically D = 2)
+
+ Args:
+ norm_factor (float): AUC normalization factor, Default: 30 (pixels).
+ num_thrs (int): number of thresholds to calculate auc. Default: 20.
+ collect_device (str): Device name used for collecting results from
+ different ranks during distributed training. Must be ``'cpu'`` or
+ ``'gpu'``. Default: ``'cpu'``.
+ prefix (str, optional): The prefix that will be added in the metric
+ names to disambiguate homonymous metrics of different evaluators.
+ If prefix is not provided in the argument, ``self.default_prefix``
+ will be used instead. Default: ``None``.
+ """
+
+ def __init__(self,
+ norm_factor: float = 30,
+ num_thrs: int = 20,
+ collect_device: str = 'cpu',
+ prefix: Optional[str] = None) -> None:
+ super().__init__(collect_device=collect_device, prefix=prefix)
+ self.norm_factor = norm_factor
+ self.num_thrs = num_thrs
+
+ def process(self, data_batch: Sequence[dict],
+ data_samples: Sequence[dict]) -> None:
+ """Process one batch of data samples and predictions. The processed
+ results should be stored in ``self.results``, which will be used to
+ compute the metrics when all batches have been processed.
+
+ Args:
+ data_batch (Sequence[dict]): A batch of data
+ from the dataloader.
+ data_sample (Sequence[dict]): A batch of outputs from
+ the model.
+ """
+ for data_sample in data_samples:
+ # predicted keypoints coordinates, [1, K, D]
+ pred_coords = data_sample['pred_instances']['keypoints']
+ # ground truth data_info
+ gt = data_sample['gt_instances']
+ # ground truth keypoints coordinates, [1, K, D]
+ gt_coords = gt['keypoints']
+ # ground truth keypoints_visible, [1, K, 1]
+ mask = gt['keypoints_visible'].astype(bool).reshape(1, -1)
+
+ result = {
+ 'pred_coords': pred_coords,
+ 'gt_coords': gt_coords,
+ 'mask': mask,
+ }
+
+ self.results.append(result)
+
+ def compute_metrics(self, results: list) -> Dict[str, float]:
+ """Compute the metrics from processed results.
+
+ Args:
+ results (list): The processed results of each batch.
+
+ Returns:
+ Dict[str, float]: The computed metrics. The keys are the names of
+ the metrics, and the values are corresponding results.
+ """
+ logger: MMLogger = MMLogger.get_current_instance()
+
+ # pred_coords: [N, K, D]
+ pred_coords = np.concatenate(
+ [result['pred_coords'] for result in results])
+ # gt_coords: [N, K, D]
+ gt_coords = np.concatenate([result['gt_coords'] for result in results])
+ # mask: [N, K]
+ mask = np.concatenate([result['mask'] for result in results])
+
+ logger.info(f'Evaluating {self.__class__.__name__}...')
+
+ auc = keypoint_auc(pred_coords, gt_coords, mask, self.norm_factor,
+ self.num_thrs)
+
+ metrics = dict()
+ metrics['AUC'] = auc
+
+ return metrics
+
+
+@METRICS.register_module()
+class EPE(BaseMetric):
+ """EPE evaluation metric.
+
+ Calculate the end-point error (EPE) of keypoints.
+
+ Note:
+ - length of dataset: N
+ - num_keypoints: K
+ - number of keypoint dimensions: D (typically D = 2)
+
+ Args:
+ collect_device (str): Device name used for collecting results from
+ different ranks during distributed training. Must be ``'cpu'`` or
+ ``'gpu'``. Default: ``'cpu'``.
+ prefix (str, optional): The prefix that will be added in the metric
+ names to disambiguate homonymous metrics of different evaluators.
+ If prefix is not provided in the argument, ``self.default_prefix``
+ will be used instead. Default: ``None``.
+ """
+
+ def process(self, data_batch: Sequence[dict],
+ data_samples: Sequence[dict]) -> None:
+ """Process one batch of data samples and predictions. The processed
+ results should be stored in ``self.results``, which will be used to
+ compute the metrics when all batches have been processed.
+
+ Args:
+ data_batch (Sequence[dict]): A batch of data
+ from the dataloader.
+ data_samples (Sequence[dict]): A batch of outputs from
+ the model.
+ """
+ for data_sample in data_samples:
+ # predicted keypoints coordinates, [1, K, D]
+ pred_coords = data_sample['pred_instances']['keypoints']
+ # ground truth data_info
+ gt = data_sample['gt_instances']
+ # ground truth keypoints coordinates, [1, K, D]
+ gt_coords = gt['keypoints']
+ # ground truth keypoints_visible, [1, K, 1]
+ mask = gt['keypoints_visible'].astype(bool).reshape(1, -1)
+
+ result = {
+ 'pred_coords': pred_coords,
+ 'gt_coords': gt_coords,
+ 'mask': mask,
+ }
+
+ self.results.append(result)
+
+ def compute_metrics(self, results: list) -> Dict[str, float]:
+ """Compute the metrics from processed results.
+
+ Args:
+ results (list): The processed results of each batch.
+
+ Returns:
+ Dict[str, float]: The computed metrics. The keys are the names of
+ the metrics, and the values are corresponding results.
+ """
+ logger: MMLogger = MMLogger.get_current_instance()
+
+ # pred_coords: [N, K, D]
+ pred_coords = np.concatenate(
+ [result['pred_coords'] for result in results])
+ # gt_coords: [N, K, D]
+ gt_coords = np.concatenate([result['gt_coords'] for result in results])
+ # mask: [N, K]
+ mask = np.concatenate([result['mask'] for result in results])
+
+ logger.info(f'Evaluating {self.__class__.__name__}...')
+
+ epe = keypoint_epe(pred_coords, gt_coords, mask)
+
+ metrics = dict()
+ metrics['EPE'] = epe
+
+ return metrics
+
+
+@METRICS.register_module()
+class NME(BaseMetric):
+ """NME evaluation metric.
+
+ Calculate the normalized mean error (NME) of keypoints.
+
+ Note:
+ - length of dataset: N
+ - num_keypoints: K
+ - number of keypoint dimensions: D (typically D = 2)
+
+ Args:
+ norm_mode (str): The normalization mode. There are two valid modes:
+ `'use_norm_item'` and `'keypoint_distance'`.
+ When set as `'use_norm_item'`, should specify the argument
+ `norm_item`, which represents the item in the datainfo that
+ will be used as the normalization factor.
+ When set as `'keypoint_distance'`, should specify the argument
+ `keypoint_indices` that are used to calculate the keypoint
+ distance as the normalization factor.
+ norm_item (str, optional): The item used as the normalization factor.
+ For example, `'bbox_size'` in `'AFLWDataset'`. Only valid when
+ ``norm_mode`` is ``use_norm_item``.
+ Default: ``None``.
+ keypoint_indices (Sequence[int], optional): The keypoint indices used
+ to calculate the keypoint distance as the normalization factor.
+ Only valid when ``norm_mode`` is ``keypoint_distance``.
+ If set as None, will use the default ``keypoint_indices`` in
+ `DEFAULT_KEYPOINT_INDICES` for specific datasets, else use the
+ given ``keypoint_indices`` of the dataset. Default: ``None``.
+ collect_device (str): Device name used for collecting results from
+ different ranks during distributed training. Must be ``'cpu'`` or
+ ``'gpu'``. Default: ``'cpu'``.
+ prefix (str, optional): The prefix that will be added in the metric
+ names to disambiguate homonymous metrics of different evaluators.
+ If prefix is not provided in the argument, ``self.default_prefix``
+ will be used instead. Default: ``None``.
+ """
+
+ DEFAULT_KEYPOINT_INDICES = {
+ # horse10: corresponding to `nose` and `eye` keypoints
+ 'horse10': [0, 1],
+ # 300w: corresponding to `right-most` and `left-most` eye keypoints
+ '300w': [36, 45],
+ # coco_wholebody_face corresponding to `right-most` and `left-most`
+ # eye keypoints
+ 'coco_wholebody_face': [36, 45],
+ # cofw: corresponding to `right-most` and `left-most` eye keypoints
+ 'cofw': [8, 9],
+ # wflw: corresponding to `right-most` and `left-most` eye keypoints
+ 'wflw': [60, 72],
+ # lapa: corresponding to `right-most` and `left-most` eye keypoints
+ 'lapa': [66, 79],
+ }
+
+ def __init__(self,
+ norm_mode: str,
+ norm_item: Optional[str] = None,
+ keypoint_indices: Optional[Sequence[int]] = None,
+ collect_device: str = 'cpu',
+ prefix: Optional[str] = None) -> None:
+ super().__init__(collect_device=collect_device, prefix=prefix)
+ allowed_norm_modes = ['use_norm_item', 'keypoint_distance']
+ if norm_mode not in allowed_norm_modes:
+ raise KeyError("`norm_mode` should be 'use_norm_item' or "
+ f"'keypoint_distance', but got {norm_mode}.")
+
+ self.norm_mode = norm_mode
+ if self.norm_mode == 'use_norm_item':
+ if not norm_item:
+ raise KeyError('`norm_mode` is set to `"use_norm_item"`, '
+ 'please specify the `norm_item` in the '
+ 'datainfo used as the normalization factor.')
+ self.norm_item = norm_item
+ self.keypoint_indices = keypoint_indices
+
+ def process(self, data_batch: Sequence[dict],
+ data_samples: Sequence[dict]) -> None:
+ """Process one batch of data samples and predictions. The processed
+ results should be stored in ``self.results``, which will be used to
+ compute the metrics when all batches have been processed.
+
+ Args:
+ data_batch (Sequence[dict]): A batch of data
+ from the dataloader.
+ data_samples (Sequence[dict]): A batch of outputs from
+ the model.
+ """
+ for data_sample in data_samples:
+ # predicted keypoints coordinates, [1, K, D]
+ pred_coords = data_sample['pred_instances']['keypoints']
+ # ground truth data_info
+ gt = data_sample['gt_instances']
+ # ground truth keypoints coordinates, [1, K, D]
+ gt_coords = gt['keypoints']
+ # ground truth keypoints_visible, [1, K, 1]
+ mask = gt['keypoints_visible'].astype(bool).reshape(1, -1)
+
+ result = {
+ 'pred_coords': pred_coords,
+ 'gt_coords': gt_coords,
+ 'mask': mask,
+ }
+
+ if self.norm_item:
+ if self.norm_item == 'bbox_size':
+ assert 'bboxes' in gt, 'The ground truth data info do ' \
+ 'not have the item ``bboxes`` for expected ' \
+ 'normalized_item ``"bbox_size"``.'
+ # ground truth bboxes, [1, 4]
+ bbox_size = np.max(gt['bboxes'][0][2:] -
+ gt['bboxes'][0][:2])
+ result['bbox_size'] = np.array([bbox_size]).reshape(-1, 1)
+ else:
+ assert self.norm_item in gt, f'The ground truth data ' \
+ f'info do not have the expected normalized factor ' \
+ f'"{self.norm_item}"'
+ # ground truth norm_item
+ result[self.norm_item] = np.array(
+ gt[self.norm_item]).reshape([-1, 1])
+
+ self.results.append(result)
+
+ def compute_metrics(self, results: list) -> Dict[str, float]:
+ """Compute the metrics from processed results.
+
+ Args:
+ results (list): The processed results of each batch.
+
+ Returns:
+ Dict[str, float]: The computed metrics. The keys are the names of
+ the metrics, and the values are corresponding results.
+ """
+ logger: MMLogger = MMLogger.get_current_instance()
+
+ # pred_coords: [N, K, D]
+ pred_coords = np.concatenate(
+ [result['pred_coords'] for result in results])
+ # gt_coords: [N, K, D]
+ gt_coords = np.concatenate([result['gt_coords'] for result in results])
+ # mask: [N, K]
+ mask = np.concatenate([result['mask'] for result in results])
+
+ logger.info(f'Evaluating {self.__class__.__name__}...')
+ metrics = dict()
+
+ if self.norm_mode == 'use_norm_item':
+ normalize_factor_ = np.concatenate(
+ [result[self.norm_item] for result in results])
+ # normalize_factor: [N, 2]
+ normalize_factor = np.tile(normalize_factor_, [1, 2])
+ nme = keypoint_nme(pred_coords, gt_coords, mask, normalize_factor)
+ metrics['NME'] = nme
+
+ else:
+ if self.keypoint_indices is None:
+ # use default keypoint_indices in some datasets
+ dataset_name = self.dataset_meta['dataset_name']
+ if dataset_name not in self.DEFAULT_KEYPOINT_INDICES:
+ raise KeyError(
+ '`norm_mode` is set to `keypoint_distance`, and the '
+ 'keypoint_indices is set to None, can not find the '
+ 'keypoint_indices in `DEFAULT_KEYPOINT_INDICES`, '
+ 'please specify `keypoint_indices` appropriately.')
+ self.keypoint_indices = self.DEFAULT_KEYPOINT_INDICES[
+ dataset_name]
+ else:
+ assert len(self.keypoint_indices) == 2, 'The keypoint '\
+ 'indices used for normalization should be a pair.'
+ keypoint_id2name = self.dataset_meta['keypoint_id2name']
+ dataset_name = self.dataset_meta['dataset_name']
+ for idx in self.keypoint_indices:
+ assert idx in keypoint_id2name, f'The {dataset_name} '\
+ f'dataset does not contain the required '\
+ f'{idx}-th keypoint.'
+ # normalize_factor: [N, 2]
+ normalize_factor = self._get_normalize_factor(gt_coords=gt_coords)
+ nme = keypoint_nme(pred_coords, gt_coords, mask, normalize_factor)
+ metrics['NME'] = nme
+
+ return metrics
+
+ def _get_normalize_factor(self, gt_coords: np.ndarray) -> np.ndarray:
+ """Get the normalize factor. generally inter-ocular distance measured
+ as the Euclidean distance between the outer corners of the eyes is
+ used.
+
+ Args:
+ gt_coords (np.ndarray[N, K, 2]): Groundtruth keypoint coordinates.
+
+ Returns:
+ np.ndarray[N, 2]: normalized factor
+ """
+ idx1, idx2 = self.keypoint_indices
+
+ interocular = np.linalg.norm(
+ gt_coords[:, idx1, :] - gt_coords[:, idx2, :],
+ axis=1,
+ keepdims=True)
+
+ return np.tile(interocular, [1, 2])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/keypoint_3d_metrics.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/keypoint_3d_metrics.py
new file mode 100644
index 0000000000000000000000000000000000000000..9100f18181614ade41b7315c58c175575bd2774b
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/keypoint_3d_metrics.py
@@ -0,0 +1,136 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from collections import defaultdict
+from os import path as osp
+from typing import Dict, Optional, Sequence
+
+import numpy as np
+from mmengine.evaluator import BaseMetric
+from mmengine.logging import MMLogger
+
+from mmpose.registry import METRICS
+from ..functional import keypoint_mpjpe
+
+
+@METRICS.register_module()
+class MPJPE(BaseMetric):
+ """MPJPE evaluation metric.
+
+ Calculate the mean per-joint position error (MPJPE) of keypoints.
+
+ Note:
+ - length of dataset: N
+ - num_keypoints: K
+ - number of keypoint dimensions: D (typically D = 2)
+
+ Args:
+ mode (str): Method to align the prediction with the
+ ground truth. Supported options are:
+
+ - ``'mpjpe'``: no alignment will be applied
+ - ``'p-mpjpe'``: align in the least-square sense in scale
+ - ``'n-mpjpe'``: align in the least-square sense in
+ scale, rotation, and translation.
+
+ collect_device (str): Device name used for collecting results from
+ different ranks during distributed training. Must be ``'cpu'`` or
+ ``'gpu'``. Default: ``'cpu'``.
+ prefix (str, optional): The prefix that will be added in the metric
+ names to disambiguate homonymous metrics of different evaluators.
+ If prefix is not provided in the argument, ``self.default_prefix``
+ will be used instead. Default: ``None``.
+ """
+
+ ALIGNMENT = {'mpjpe': 'none', 'p-mpjpe': 'procrustes', 'n-mpjpe': 'scale'}
+
+ def __init__(self,
+ mode: str = 'mpjpe',
+ collect_device: str = 'cpu',
+ prefix: Optional[str] = None) -> None:
+ super().__init__(collect_device=collect_device, prefix=prefix)
+ allowed_modes = self.ALIGNMENT.keys()
+ if mode not in allowed_modes:
+ raise KeyError("`mode` should be 'mpjpe', 'p-mpjpe', or "
+ f"'n-mpjpe', but got '{mode}'.")
+
+ self.mode = mode
+
+ def process(self, data_batch: Sequence[dict],
+ data_samples: Sequence[dict]) -> None:
+ """Process one batch of data samples and predictions. The processed
+ results should be stored in ``self.results``, which will be used to
+ compute the metrics when all batches have been processed.
+
+ Args:
+ data_batch (Sequence[dict]): A batch of data
+ from the dataloader.
+ data_samples (Sequence[dict]): A batch of outputs from
+ the model.
+ """
+ for data_sample in data_samples:
+ # predicted keypoints coordinates, [1, K, D]
+ pred_coords = data_sample['pred_instances']['keypoints']
+ # ground truth data_info
+ gt = data_sample['gt_instances']
+ # ground truth keypoints coordinates, [1, K, D]
+ gt_coords = gt['lifting_target']
+ # ground truth keypoints_visible, [1, K, 1]
+ mask = gt['lifting_target_visible'].astype(bool).reshape(1, -1)
+ # instance action
+ img_path = data_sample['target_img_path']
+ _, rest = osp.basename(img_path).split('_', 1)
+ action, _ = rest.split('.', 1)
+
+ result = {
+ 'pred_coords': pred_coords,
+ 'gt_coords': gt_coords,
+ 'mask': mask,
+ 'action': action
+ }
+
+ self.results.append(result)
+
+ def compute_metrics(self, results: list) -> Dict[str, float]:
+ """Compute the metrics from processed results.
+
+ Args:
+ results (list): The processed results of each batch.
+
+ Returns:
+ Dict[str, float]: The computed metrics. The keys are the names of
+ the metrics, and the values are the corresponding results.
+ """
+ logger: MMLogger = MMLogger.get_current_instance()
+
+ # pred_coords: [N, K, D]
+ pred_coords = np.concatenate(
+ [result['pred_coords'] for result in results])
+ if pred_coords.ndim == 4 and pred_coords.shape[1] == 1:
+ pred_coords = np.squeeze(pred_coords, axis=1)
+ # gt_coords: [N, K, D]
+ gt_coords = np.stack([result['gt_coords'] for result in results])
+ # mask: [N, K]
+ mask = np.concatenate([result['mask'] for result in results])
+ # action_category_indices: Dict[List[int]]
+ action_category_indices = defaultdict(list)
+ for idx, result in enumerate(results):
+ action_category = result['action'].split('_')[0]
+ action_category_indices[action_category].append(idx)
+
+ error_name = self.mode.upper()
+
+ logger.info(f'Evaluating {self.mode.upper()}...')
+ metrics = dict()
+
+ metrics[error_name] = keypoint_mpjpe(pred_coords, gt_coords, mask,
+ self.ALIGNMENT[self.mode])
+
+ for action_category, indices in action_category_indices.items():
+ metrics[f'{error_name}_{action_category}'] = keypoint_mpjpe(
+ pred_coords[indices], gt_coords[indices], mask[indices])
+
+ return metrics
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/keypoint_partition_metric.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/keypoint_partition_metric.py
new file mode 100644
index 0000000000000000000000000000000000000000..9a3b8cae2bd123962e676637882a5301556824bb
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/keypoint_partition_metric.py
@@ -0,0 +1,208 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import warnings
+from collections import OrderedDict
+from copy import deepcopy
+from typing import Sequence
+
+import numpy as np
+from mmengine.evaluator import BaseMetric
+
+from mmpose.registry import METRICS
+
+
+@METRICS.register_module()
+class KeypointPartitionMetric(BaseMetric):
+ """Wrapper metric for evaluating pose metric on user-defined body parts.
+
+ Sometimes one may be interested in the performance of a pose model on
+ certain body parts rather than on all the keypoints. For example,
+ ``CocoWholeBodyMetric`` evaluates coco metric on body, foot, face,
+ lefthand and righthand. However, ``CocoWholeBodyMetric`` cannot be
+ applied to arbitrary custom datasets. This wrapper metric solves this
+ problem.
+
+ Supported metrics:
+ ``CocoMetric`` Note 1: all keypoint ground truth should be stored in
+ `keypoints` not other data fields. Note 2: `ann_file` is not
+ supported, it will be ignored. Note 3: `score_mode` other than
+ 'bbox' may produce results different from the
+ ``CocoWholebodyMetric``. Note 4: `nms_mode` other than 'none' may
+ produce results different from the ``CocoWholebodyMetric``.
+ ``PCKAccuracy`` Note 1: data fields required by ``PCKAccuracy`` should
+ be provided, such as bbox, head_size, etc. Note 2: In terms of
+ 'torso', since it is specifically designed for ``JhmdbDataset``, it is
+ not recommended to use it for other datasets.
+ ``AUC`` supported without limitations.
+ ``EPE`` supported without limitations.
+ ``NME`` only `norm_mode` = 'use_norm_item' is supported,
+ 'keypoint_distance' is incompatible with ``KeypointPartitionMetric``.
+
+ Incompatible metrics:
+ The following metrics are dataset specific metrics:
+ ``CocoWholeBodyMetric``
+ ``MpiiPCKAccuracy``
+ ``JhmdbPCKAccuracy``
+ ``PoseTrack18Metric``
+ Keypoint partitioning is included in these metrics.
+
+ Args:
+ metric (dict): arguments to instantiate a metric, please refer to the
+ arguments required by the metric of your choice.
+ partitions (dict): definition of body partitions. For example, if we
+ have 10 keypoints in total, the first 7 keypoints belong to body
+ and the last 3 keypoints belong to foot, this field can be like
+ this:
+ dict(
+ body=[0, 1, 2, 3, 4, 5, 6],
+ foot=[7, 8, 9],
+ all=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+ )
+ where the numbers are the indices of keypoints and they can be
+ discontinuous.
+ """
+
+ def __init__(
+ self,
+ metric: dict,
+ partitions: dict,
+ ) -> None:
+ super().__init__()
+ # check metric type
+ supported_metric_types = [
+ 'CocoMetric', 'PCKAccuracy', 'AUC', 'EPE', 'NME'
+ ]
+ if metric['type'] not in supported_metric_types:
+ raise ValueError(
+ 'Metrics supported by KeypointPartitionMetric are CocoMetric, '
+ 'PCKAccuracy, AUC, EPE and NME, '
+ f"but got {metric['type']}")
+
+ # check CocoMetric arguments
+ if metric['type'] == 'CocoMetric':
+ if 'ann_file' in metric:
+ warnings.warn(
+ 'KeypointPartitionMetric does not support the ann_file '
+ 'argument of CocoMetric, this argument will be ignored.')
+ metric['ann_file'] = None
+ score_mode = metric.get('score_mode', 'bbox_keypoint')
+ if score_mode != 'bbox':
+ warnings.warn(
+ 'When using KeypointPartitionMetric with CocoMetric, '
+ "if score_mode is not 'bbox', pose scores will be "
+ "calculated part by part rather than by 'wholebody'. "
+ 'Therefore, this may produce results different from the '
+ 'CocoWholebodyMetric.')
+ nms_mode = metric.get('nms_mode', 'oks_nms')
+ if nms_mode != 'none':
+ warnings.warn(
+ 'When using KeypointPartitionMetric with CocoMetric, '
+ 'oks_nms and soft_oks_nms will be calculated part by part '
+ "rather than by 'wholebody'. Therefore, this may produce "
+ 'results different from the CocoWholebodyMetric.')
+
+ # check PCKAccuracy arguments
+ if metric['type'] == 'PCKAccuracy':
+ norm_item = metric.get('norm_item', 'bbox')
+ if norm_item == 'torso' or 'torso' in norm_item:
+ warnings.warn(
+ 'norm_item torso is used in JhmdbDataset, it may not be '
+ 'compatible with other datasets, use at your own risk.')
+
+ # check NME arguments
+ if metric['type'] == 'NME':
+ assert 'norm_mode' in metric, \
+ 'Missing norm_mode required by the NME metric.'
+ if metric['norm_mode'] != 'use_norm_item':
+ raise ValueError(
+ "NME norm_mode 'keypoint_distance' is incompatible with "
+ 'KeypointPartitionMetric.')
+
+ # check partitions
+ assert len(partitions) > 0, 'There should be at least one partition.'
+ for partition_name, partition in partitions.items():
+ assert isinstance(partition, Sequence), \
+ 'Each partition should be a sequence.'
+ assert len(partition) > 0, \
+ 'Each partition should have at least one element.'
+ self.partitions = partitions
+
+ # instantiate metrics for each partition
+ self.metrics = {}
+ for partition_name in partitions.keys():
+ _metric = deepcopy(metric)
+ if 'outfile_prefix' in _metric:
+ _metric['outfile_prefix'] = _metric[
+ 'outfile_prefix'] + '.' + partition_name
+ self.metrics[partition_name] = METRICS.build(_metric)
+
+ @BaseMetric.dataset_meta.setter
+ def dataset_meta(self, dataset_meta: dict) -> None:
+ """Set the dataset meta info to the metric."""
+ self._dataset_meta = dataset_meta
+ # sigmas required by coco metric have to be split as well
+ for partition_name, keypoint_ids in self.partitions.items():
+ _dataset_meta = deepcopy(dataset_meta)
+ _dataset_meta['num_keypoints'] = len(keypoint_ids)
+ _dataset_meta['sigmas'] = _dataset_meta['sigmas'][keypoint_ids]
+ self.metrics[partition_name].dataset_meta = _dataset_meta
+
+ def process(self, data_batch: Sequence[dict],
+ data_samples: Sequence[dict]) -> None:
+ """Split data samples by partitions, then call metric.process part by
+ part."""
+ parted_data_samples = {
+ partition_name: []
+ for partition_name in self.partitions.keys()
+ }
+ for data_sample in data_samples:
+ for partition_name, keypoint_ids in self.partitions.items():
+ _data_sample = deepcopy(data_sample)
+ if 'keypoint_scores' in _data_sample['pred_instances']:
+ _data_sample['pred_instances'][
+ 'keypoint_scores'] = _data_sample['pred_instances'][
+ 'keypoint_scores'][:, keypoint_ids]
+ _data_sample['pred_instances']['keypoints'] = _data_sample[
+ 'pred_instances']['keypoints'][:, keypoint_ids]
+ _data_sample['gt_instances']['keypoints'] = _data_sample[
+ 'gt_instances']['keypoints'][:, keypoint_ids]
+ _data_sample['gt_instances'][
+ 'keypoints_visible'] = _data_sample['gt_instances'][
+ 'keypoints_visible'][:, keypoint_ids]
+
+ # for coco metric
+ if 'raw_ann_info' in _data_sample:
+ raw_ann_info = _data_sample['raw_ann_info']
+ anns = raw_ann_info if isinstance(
+ raw_ann_info, list) else [raw_ann_info]
+ for ann in anns:
+ if 'keypoints' in ann:
+ keypoints = np.array(ann['keypoints']).reshape(
+ -1, 3)
+ keypoints = keypoints[keypoint_ids]
+ num_keypoints = np.sum(keypoints[:, 2] > 0)
+ ann['keypoints'] = keypoints.flatten().tolist()
+ ann['num_keypoints'] = num_keypoints
+
+ parted_data_samples[partition_name].append(_data_sample)
+
+ for partition_name, metric in self.metrics.items():
+ metric.process(data_batch, parted_data_samples[partition_name])
+
+ def compute_metrics(self, results: list) -> dict:
+ pass
+
+ def evaluate(self, size: int) -> dict:
+ """Run evaluation for each partition."""
+ eval_results = OrderedDict()
+ for partition_name, metric in self.metrics.items():
+ _eval_results = metric.evaluate(size)
+ for key in list(_eval_results.keys()):
+ new_key = partition_name + '/' + key
+ _eval_results[new_key] = _eval_results.pop(key)
+ eval_results.update(_eval_results)
+ return eval_results
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/posetrack18_metric.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/posetrack18_metric.py
new file mode 100644
index 0000000000000000000000000000000000000000..38c1ea5873a3aef986af6c2777295b503a1b67e0
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/evaluation/metrics/posetrack18_metric.py
@@ -0,0 +1,225 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os
+import os.path as osp
+from typing import Dict, List, Optional
+
+import numpy as np
+from mmengine.fileio import dump, load
+from mmengine.logging import MMLogger
+
+from mmpose.registry import METRICS
+from .coco_metric import CocoMetric
+
+try:
+ from poseval import eval_helpers
+ from poseval.evaluateAP import evaluateAP
+ has_poseval = True
+except (ImportError, ModuleNotFoundError):
+ has_poseval = False
+
+
+@METRICS.register_module()
+class PoseTrack18Metric(CocoMetric):
+ """PoseTrack18 evaluation metric.
+
+ Evaluate AP, and mAP for keypoint detection tasks.
+ Support PoseTrack18 (video) dataset. Please refer to
+ ``__
+ for more details.
+
+ Args:
+ ann_file (str, optional): Path to the coco format annotation file.
+ If not specified, ground truth annotations from the dataset will
+ be converted to coco format. Defaults to None
+ score_mode (str): The mode to score the prediction results which
+ should be one of the following options:
+
+ - ``'bbox'``: Take the score of bbox as the score of the
+ prediction results.
+ - ``'bbox_keypoint'``: Use keypoint score to rescore the
+ prediction results.
+
+ Defaults to ``'bbox_keypoint'`
+ keypoint_score_thr (float): The threshold of keypoint score. The
+ keypoints with score lower than it will not be included to
+ rescore the prediction results. Valid only when ``score_mode`` is
+ ``bbox_keypoint``. Defaults to ``0.2``
+ nms_mode (str): The mode to perform Non-Maximum Suppression (NMS),
+ which should be one of the following options:
+
+ - ``'oks_nms'``: Use Object Keypoint Similarity (OKS) to
+ perform NMS.
+ - ``'soft_oks_nms'``: Use Object Keypoint Similarity (OKS)
+ to perform soft NMS.
+ - ``'none'``: Do not perform NMS. Typically for bottomup mode
+ output.
+
+ Defaults to ``'oks_nms'`
+ nms_thr (float): The Object Keypoint Similarity (OKS) threshold
+ used in NMS when ``nms_mode`` is ``'oks_nms'`` or
+ ``'soft_oks_nms'``. Will retain the prediction results with OKS
+ lower than ``nms_thr``. Defaults to ``0.9``
+ format_only (bool): Whether only format the output results without
+ doing quantitative evaluation. This is designed for the need of
+ test submission when the ground truth annotations are absent. If
+ set to ``True``, ``outfile_prefix`` should specify the path to
+ store the output results. Defaults to ``False``
+ outfile_prefix (str | None): The prefix of json files. It includes
+ the file path and the prefix of filename, e.g., ``'a/b/prefix'``.
+ If not specified, a temp file will be created. Defaults to ``None``
+ **kwargs: Keyword parameters passed to :class:`mmeval.BaseMetric`
+ """
+ default_prefix: Optional[str] = 'posetrack18'
+
+ def __init__(self,
+ ann_file: Optional[str] = None,
+ score_mode: str = 'bbox_keypoint',
+ keypoint_score_thr: float = 0.2,
+ nms_mode: str = 'oks_nms',
+ nms_thr: float = 0.9,
+ format_only: bool = False,
+ outfile_prefix: Optional[str] = None,
+ collect_device: str = 'cpu',
+ prefix: Optional[str] = None) -> None:
+ # raise an error to avoid long time running without getting results
+ if not has_poseval:
+ raise ImportError('Please install ``poseval`` package for '
+ 'evaluation on PoseTrack dataset '
+ '(see `requirements/optional.txt`)')
+ super().__init__(
+ ann_file=ann_file,
+ score_mode=score_mode,
+ keypoint_score_thr=keypoint_score_thr,
+ nms_mode=nms_mode,
+ nms_thr=nms_thr,
+ format_only=format_only,
+ outfile_prefix=outfile_prefix,
+ collect_device=collect_device,
+ prefix=prefix)
+
+ def results2json(self, keypoints: Dict[int, list],
+ outfile_prefix: str) -> str:
+ """Dump the keypoint detection results into a json file.
+
+ Args:
+ keypoints (Dict[int, list]): Keypoint detection results
+ of the dataset.
+ outfile_prefix (str): The filename prefix of the json files.
+ If the prefix is "somepath/xxx", the json files will be named
+ "somepath/xxx.keypoints.json".
+
+ Returns:
+ str: The json file name of keypoint results.
+ """
+ categories = []
+
+ cat = {}
+ cat['supercategory'] = 'person'
+ cat['id'] = 1
+ cat['name'] = 'person'
+ cat['keypoints'] = [
+ 'nose', 'head_bottom', 'head_top', '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'
+ ]
+ cat['skeleton'] = [[16, 14], [14, 12], [17, 15], [15, 13], [12, 13],
+ [6, 12], [7, 13], [6, 7], [6, 8], [7, 9], [8, 10],
+ [9, 11], [2, 3], [1, 2], [1, 3], [2, 4], [3, 5],
+ [4, 6], [5, 7]]
+ categories.append(cat)
+
+ # path of directory for official gt files
+ gt_folder = osp.join(
+ osp.dirname(self.ann_file),
+ osp.splitext(self.ann_file.split('_')[-1])[0])
+ # the json file for each video sequence
+ json_files = [
+ pos for pos in os.listdir(gt_folder) if pos.endswith('.json')
+ ]
+
+ for json_file in json_files:
+ gt = load(osp.join(gt_folder, json_file))
+ annotations = []
+ images = []
+
+ for image in gt['images']:
+ img = {}
+ img['id'] = image['id']
+ img['file_name'] = image['file_name']
+ images.append(img)
+
+ img_kpts = keypoints[img['id']]
+
+ for track_id, img_kpt in enumerate(img_kpts):
+ ann = {}
+ ann['image_id'] = img_kpt['img_id']
+ ann['keypoints'] = np.array(
+ img_kpt['keypoints']).reshape(-1).tolist()
+ ann['scores'] = np.array(ann['keypoints']).reshape(
+ [-1, 3])[:, 2].tolist()
+ ann['score'] = float(img_kpt['score'])
+ ann['track_id'] = track_id
+ annotations.append(ann)
+
+ pred_file = osp.join(osp.dirname(outfile_prefix), json_file)
+ info = {}
+ info['images'] = images
+ info['categories'] = categories
+ info['annotations'] = annotations
+
+ dump(info, pred_file, sort_keys=True, indent=4)
+
+ def _do_python_keypoint_eval(self, outfile_prefix: str) -> List[tuple]:
+ """Do keypoint evaluation using `poseval` package.
+
+ Args:
+ outfile_prefix (str): The filename prefix of the json files.
+ If the prefix is "somepath/xxx", the json files will be named
+ "somepath/xxx.keypoints.json".
+
+ Returns:
+ list: a list of tuples. Each tuple contains the evaluation stats
+ name and corresponding stats value.
+ """
+ logger: MMLogger = MMLogger.get_current_instance()
+
+ # path of directory for official gt files
+ # 'xxx/posetrack18_train.json' -> 'xxx/train/'
+ gt_folder = osp.join(
+ osp.dirname(self.ann_file),
+ osp.splitext(self.ann_file.split('_')[-1])[0])
+ pred_folder = osp.dirname(outfile_prefix)
+
+ argv = ['', gt_folder + '/', pred_folder + '/']
+
+ logger.info('Loading data')
+ gtFramesAll, prFramesAll = eval_helpers.load_data_dir(argv)
+
+ logger.info(f'# gt frames : {len(gtFramesAll)}')
+ logger.info(f'# pred frames: {len(prFramesAll)}')
+
+ # evaluate per-frame multi-person pose estimation (AP)
+ # compute AP
+ logger.info('Evaluation of per-frame multi-person pose estimation')
+ apAll, _, _ = evaluateAP(gtFramesAll, prFramesAll, None, False, False)
+
+ # print AP
+ logger.info('Average Precision (AP) metric:')
+ eval_helpers.printTable(apAll)
+
+ stats = eval_helpers.getCum(apAll)
+
+ stats_names = [
+ 'Head AP', 'Shou AP', 'Elb AP', 'Wri AP', 'Hip AP', 'Knee AP',
+ 'Ankl AP', 'AP'
+ ]
+
+ info_str = list(zip(stats_names, stats))
+
+ return info_str
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..821eeb8017a1cd96a3a332377d0a692b741305f7
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/__init__.py
@@ -0,0 +1,20 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .backbones import * # noqa
+from .builder import (BACKBONES, HEADS, LOSSES, NECKS, build_backbone,
+ build_head, build_loss, build_neck, build_pose_estimator,
+ build_posenet)
+from .data_preprocessors import * # noqa
+from .heads import * # noqa
+from .losses import * # noqa
+from .necks import * # noqa
+from .pose_estimators import * # noqa
+
+__all__ = [
+ 'BACKBONES', 'HEADS', 'NECKS', 'LOSSES', 'build_backbone', 'build_head',
+ 'build_loss', 'build_posenet', 'build_neck', 'build_pose_estimator'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2beabbc496a41eace66e13f0803be1abc5a48d55
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/__pycache__/builder.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/__pycache__/builder.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..97990e3a4c0478549b875b8fa5dfa8f5e48da1e2
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/__pycache__/builder.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..7b0cae413ccd4e98adc86690a2672f19ccdf8041
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__init__.py
@@ -0,0 +1,42 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .alexnet import AlexNet
+from .cpm import CPM
+from .hourglass import HourglassNet
+from .hourglass_ae import HourglassAENet
+from .hrformer import HRFormer
+from .hrnet import HRNet
+from .litehrnet import LiteHRNet
+from .mobilenet_v2 import MobileNetV2
+from .mobilenet_v3 import MobileNetV3
+from .mspn import MSPN
+from .pvt import PyramidVisionTransformer, PyramidVisionTransformerV2
+from .regnet import RegNet
+from .resnest import ResNeSt
+from .resnet import ResNet, ResNetV1d
+from .resnext import ResNeXt
+from .rsn import RSN
+from .scnet import SCNet
+from .seresnet import SEResNet
+from .seresnext import SEResNeXt
+from .shufflenet_v1 import ShuffleNetV1
+from .shufflenet_v2 import ShuffleNetV2
+from .swin import SwinTransformer
+from .tcn import TCN
+from .v2v_net import V2VNet
+from .vgg import VGG
+from .vipnas_mbv3 import ViPNAS_MobileNetV3
+from .vipnas_resnet import ViPNAS_ResNet
+
+__all__ = [
+ 'AlexNet', 'HourglassNet', 'HourglassAENet', 'HRNet', 'MobileNetV2',
+ 'MobileNetV3', 'RegNet', 'ResNet', 'ResNetV1d', 'ResNeXt', 'SCNet',
+ 'SEResNet', 'SEResNeXt', 'ShuffleNetV1', 'ShuffleNetV2', 'CPM', 'RSN',
+ 'MSPN', 'ResNeSt', 'VGG', 'TCN', 'ViPNAS_ResNet', 'ViPNAS_MobileNetV3',
+ 'LiteHRNet', 'V2VNet', 'HRFormer', 'PyramidVisionTransformer',
+ 'PyramidVisionTransformerV2', 'SwinTransformer'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b6b034bd6e7bbe74e704fb19553638781bd62fc4
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/alexnet.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/alexnet.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7071e9cc363321a974ac56b0f67efd2a1a90df87
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/alexnet.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/base_backbone.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/base_backbone.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..359b51b4c5656d8020bdd37df1908e028c812537
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/base_backbone.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/cpm.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/cpm.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0b633badab14a1f25db83e9c576edf723ee86696
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/cpm.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/hourglass.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/hourglass.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..612b69fe6cfcbe82d4ab625a15820251164016ef
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/hourglass.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/hourglass_ae.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/hourglass_ae.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..583017777376e4377d04d2e3b3dfc10cd92810ff
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/hourglass_ae.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/hrformer.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/hrformer.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e952ae16ebda8a937adfcbc992a61e649e36fd5b
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/hrformer.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/hrnet.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/hrnet.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7afb91209ae1a9f78f7738051462b285d538ca22
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/hrnet.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/litehrnet.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/litehrnet.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5cac01b213c2036c5989c0566bacae30ade3db55
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/litehrnet.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/mobilenet_v2.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/mobilenet_v2.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3d4fec2215243d743e237408fd422c3d304da835
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/mobilenet_v2.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/mobilenet_v3.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/mobilenet_v3.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..562a3d779cdac2a69b3eb4dcc7beba430ba3517d
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/mobilenet_v3.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/mspn.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/mspn.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..18972d392a1e63a5055690763772965cd2052e75
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/mspn.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/pvt.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/pvt.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f336826d859df344d5c52470ec6d6d185d5cc87b
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/pvt.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/regnet.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/regnet.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..eadcc9098cc8235ebd311f3309e6b5a5c32029e6
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/regnet.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/resnest.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/resnest.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0544b713eb8b6142f695e367fb4db09ccf7dc3d7
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/resnest.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/resnet.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/resnet.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e5aa2807f24a34da4249aef8d1b8348f7365fe47
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/resnet.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/resnext.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/resnext.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..435eff8903c698b48e17b3c8d09552570eb99c85
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/resnext.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/rsn.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/rsn.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f36325771a0d84c738a0edbd5c3ca4ba2b707fee
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/rsn.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/scnet.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/scnet.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0fea56b9c772e3d7aca26f7e50813c051380ff90
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/scnet.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/seresnet.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/seresnet.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3a3d91d2bc95400ac3746c4d487bef2c9433a5e5
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/seresnet.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/seresnext.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/seresnext.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..230d08b234c13ef5800c11da2e6d3666b904d577
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/seresnext.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/shufflenet_v1.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/shufflenet_v1.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..06c8fe2b49178e10ef0bb0e61fedf5e69c6ce724
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/shufflenet_v1.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/shufflenet_v2.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/shufflenet_v2.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e8037204487af64a455bf886c6c9af942e26709d
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/shufflenet_v2.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/swin.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/swin.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3e072e94513468e12507cc3d457e11b9488c4ebe
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/swin.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/tcn.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/tcn.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f66511bf2ebb88fcbda110e54a4e4a918af11e14
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/tcn.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/v2v_net.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/v2v_net.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..481e1648de9771a2c60a82397c5216287a81fb7f
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/v2v_net.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/vgg.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/vgg.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6caafe4e310788b16a6889d9748b8e21565e0467
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/vgg.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/vipnas_mbv3.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/vipnas_mbv3.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b0d4cb7a5157a044649e555394fdc9294fd6bb76
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/vipnas_mbv3.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/vipnas_resnet.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/vipnas_resnet.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4f4c7c273379ccf10910a451b435befbada50c1c
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/__pycache__/vipnas_resnet.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/alexnet.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/alexnet.py
new file mode 100644
index 0000000000000000000000000000000000000000..06ad4c20d0ae83116bd88566c5fef8001b83dfa0
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/alexnet.py
@@ -0,0 +1,63 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import torch.nn as nn
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+
+
+@MODELS.register_module()
+class AlexNet(BaseBackbone):
+ """`AlexNet `__ backbone.
+
+ The input for AlexNet is a 224x224 RGB image.
+
+ Args:
+ num_classes (int): number of classes for classification.
+ The default value is -1, which uses the backbone as
+ a feature extractor without the top classifier.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self, num_classes=-1, init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+ self.num_classes = num_classes
+ self.features = nn.Sequential(
+ nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
+ nn.ReLU(inplace=True),
+ nn.MaxPool2d(kernel_size=3, stride=2),
+ nn.Conv2d(64, 192, kernel_size=5, padding=2),
+ nn.ReLU(inplace=True),
+ nn.MaxPool2d(kernel_size=3, stride=2),
+ nn.Conv2d(192, 384, kernel_size=3, padding=1),
+ nn.ReLU(inplace=True),
+ nn.Conv2d(384, 256, kernel_size=3, padding=1),
+ nn.ReLU(inplace=True),
+ nn.Conv2d(256, 256, kernel_size=3, padding=1),
+ nn.ReLU(inplace=True),
+ nn.MaxPool2d(kernel_size=3, stride=2),
+ )
+ if self.num_classes > 0:
+ self.classifier = nn.Sequential(
+ nn.Dropout(),
+ nn.Linear(256 * 6 * 6, 4096),
+ nn.ReLU(inplace=True),
+ nn.Dropout(),
+ nn.Linear(4096, 4096),
+ nn.ReLU(inplace=True),
+ nn.Linear(4096, num_classes),
+ )
+
+ def forward(self, x):
+
+ x = self.features(x)
+ if self.num_classes > 0:
+ x = x.view(x.size(0), 256 * 6 * 6)
+ x = self.classifier(x)
+
+ return (x, )
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/base_backbone.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/base_backbone.py
new file mode 100644
index 0000000000000000000000000000000000000000..ca5ff49c734e98f3c93456b5f9a4a3ed3fef1171
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/base_backbone.py
@@ -0,0 +1,34 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from abc import ABCMeta, abstractmethod
+
+from mmengine.model import BaseModule
+
+
+class BaseBackbone(BaseModule, metaclass=ABCMeta):
+ """Base backbone.
+
+ This class defines the basic functions of a backbone. Any backbone that
+ inherits this class should at least define its own `forward` function.
+ """
+
+ @abstractmethod
+ def forward(self, x):
+ """Forward function.
+
+ Args:
+ x (Tensor | tuple[Tensor]): x could be a torch.Tensor or a tuple of
+ torch.Tensor, containing input data for forward computation.
+ """
+
+ def train(self, mode=True):
+ """Set module status before forward computation.
+
+ Args:
+ mode (bool): Whether it is train_mode or test_mode
+ """
+ super(BaseBackbone, self).train(mode)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/cpm.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/cpm.py
new file mode 100644
index 0000000000000000000000000000000000000000..a691a5b1d6f1f261608a458026b2ef348cff071f
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/cpm.py
@@ -0,0 +1,188 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+
+import torch
+import torch.nn as nn
+from mmcv.cnn import ConvModule
+from mmengine.model import BaseModule
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+
+
+class CpmBlock(BaseModule):
+ """CpmBlock for Convolutional Pose Machine.
+
+ Args:
+ in_channels (int): Input channels of this block.
+ channels (list): Output channels of each conv module.
+ kernels (list): Kernel sizes of each conv module.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ channels=(128, 128, 128),
+ kernels=(11, 11, 11),
+ norm_cfg=None,
+ init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+
+ assert len(channels) == len(kernels)
+ layers = []
+ for i in range(len(channels)):
+ if i == 0:
+ input_channels = in_channels
+ else:
+ input_channels = channels[i - 1]
+ layers.append(
+ ConvModule(
+ input_channels,
+ channels[i],
+ kernels[i],
+ padding=(kernels[i] - 1) // 2,
+ norm_cfg=norm_cfg))
+ self.model = nn.Sequential(*layers)
+
+ def forward(self, x):
+ """Model forward function."""
+ out = self.model(x)
+ return out
+
+
+@MODELS.register_module()
+class CPM(BaseBackbone):
+ """CPM backbone.
+
+ Convolutional Pose Machines.
+ More details can be found in the `paper
+ `__ .
+
+ Args:
+ in_channels (int): The input channels of the CPM.
+ out_channels (int): The output channels of the CPM.
+ feat_channels (int): Feature channel of each CPM stage.
+ middle_channels (int): Feature channel of conv after the middle stage.
+ num_stages (int): Number of stages.
+ norm_cfg (dict): Dictionary to construct and config norm layer.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+
+ Example:
+ >>> from mmpose.models import CPM
+ >>> import torch
+ >>> self = CPM(3, 17)
+ >>> self.eval()
+ >>> inputs = torch.rand(1, 3, 368, 368)
+ >>> level_outputs = self.forward(inputs)
+ >>> for level_output in level_outputs:
+ ... print(tuple(level_output.shape))
+ (1, 17, 46, 46)
+ (1, 17, 46, 46)
+ (1, 17, 46, 46)
+ (1, 17, 46, 46)
+ (1, 17, 46, 46)
+ (1, 17, 46, 46)
+ """
+
+ def __init__(
+ self,
+ in_channels,
+ out_channels,
+ feat_channels=128,
+ middle_channels=32,
+ num_stages=6,
+ norm_cfg=dict(type='BN', requires_grad=True),
+ init_cfg=[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(type='Constant', val=1, layer=['_BatchNorm', 'GroupNorm'])
+ ],
+ ):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+
+ assert in_channels == 3
+
+ self.num_stages = num_stages
+ assert self.num_stages >= 1
+
+ self.stem = nn.Sequential(
+ ConvModule(in_channels, 128, 9, padding=4, norm_cfg=norm_cfg),
+ nn.MaxPool2d(kernel_size=3, stride=2, padding=1),
+ ConvModule(128, 128, 9, padding=4, norm_cfg=norm_cfg),
+ nn.MaxPool2d(kernel_size=3, stride=2, padding=1),
+ ConvModule(128, 128, 9, padding=4, norm_cfg=norm_cfg),
+ nn.MaxPool2d(kernel_size=3, stride=2, padding=1),
+ ConvModule(128, 32, 5, padding=2, norm_cfg=norm_cfg),
+ ConvModule(32, 512, 9, padding=4, norm_cfg=norm_cfg),
+ ConvModule(512, 512, 1, padding=0, norm_cfg=norm_cfg),
+ ConvModule(512, out_channels, 1, padding=0, act_cfg=None))
+
+ self.middle = nn.Sequential(
+ ConvModule(in_channels, 128, 9, padding=4, norm_cfg=norm_cfg),
+ nn.MaxPool2d(kernel_size=3, stride=2, padding=1),
+ ConvModule(128, 128, 9, padding=4, norm_cfg=norm_cfg),
+ nn.MaxPool2d(kernel_size=3, stride=2, padding=1),
+ ConvModule(128, 128, 9, padding=4, norm_cfg=norm_cfg),
+ nn.MaxPool2d(kernel_size=3, stride=2, padding=1))
+
+ self.cpm_stages = nn.ModuleList([
+ CpmBlock(
+ middle_channels + out_channels,
+ channels=[feat_channels, feat_channels, feat_channels],
+ kernels=[11, 11, 11],
+ norm_cfg=norm_cfg) for _ in range(num_stages - 1)
+ ])
+
+ self.middle_conv = nn.ModuleList([
+ nn.Sequential(
+ ConvModule(
+ 128, middle_channels, 5, padding=2, norm_cfg=norm_cfg))
+ for _ in range(num_stages - 1)
+ ])
+
+ self.out_convs = nn.ModuleList([
+ nn.Sequential(
+ ConvModule(
+ feat_channels,
+ feat_channels,
+ 1,
+ padding=0,
+ norm_cfg=norm_cfg),
+ ConvModule(feat_channels, out_channels, 1, act_cfg=None))
+ for _ in range(num_stages - 1)
+ ])
+
+ def forward(self, x):
+ """Model forward function."""
+ stage1_out = self.stem(x)
+ middle_out = self.middle(x)
+ out_feats = []
+
+ out_feats.append(stage1_out)
+
+ for ind in range(self.num_stages - 1):
+ single_stage = self.cpm_stages[ind]
+ out_conv = self.out_convs[ind]
+
+ inp_feat = torch.cat(
+ [out_feats[-1], self.middle_conv[ind](middle_out)], 1)
+ cpm_feat = single_stage(inp_feat)
+ out_feat = out_conv(cpm_feat)
+ out_feats.append(out_feat)
+
+ return out_feats
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/hourglass.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/hourglass.py
new file mode 100644
index 0000000000000000000000000000000000000000..47da94f371be28f4c5a7b872b8af141ab3b10735
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/hourglass.py
@@ -0,0 +1,214 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+
+import torch.nn as nn
+from mmcv.cnn import ConvModule
+from mmengine.model import BaseModule
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+from .resnet import BasicBlock, ResLayer
+
+
+class HourglassModule(BaseModule):
+ """Hourglass Module for HourglassNet backbone.
+
+ Generate module recursively and use BasicBlock as the base unit.
+
+ Args:
+ depth (int): Depth of current HourglassModule.
+ stage_channels (list[int]): Feature channels of sub-modules in current
+ and follow-up HourglassModule.
+ stage_blocks (list[int]): Number of sub-modules stacked in current and
+ follow-up HourglassModule.
+ norm_cfg (dict): Dictionary to construct and config norm layer.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ depth,
+ stage_channels,
+ stage_blocks,
+ norm_cfg=dict(type='BN', requires_grad=True),
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+
+ self.depth = depth
+
+ cur_block = stage_blocks[0]
+ next_block = stage_blocks[1]
+
+ cur_channel = stage_channels[0]
+ next_channel = stage_channels[1]
+
+ self.up1 = ResLayer(
+ BasicBlock, cur_block, cur_channel, cur_channel, norm_cfg=norm_cfg)
+
+ self.low1 = ResLayer(
+ BasicBlock,
+ cur_block,
+ cur_channel,
+ next_channel,
+ stride=2,
+ norm_cfg=norm_cfg)
+
+ if self.depth > 1:
+ self.low2 = HourglassModule(depth - 1, stage_channels[1:],
+ stage_blocks[1:])
+ else:
+ self.low2 = ResLayer(
+ BasicBlock,
+ next_block,
+ next_channel,
+ next_channel,
+ norm_cfg=norm_cfg)
+
+ self.low3 = ResLayer(
+ BasicBlock,
+ cur_block,
+ next_channel,
+ cur_channel,
+ norm_cfg=norm_cfg,
+ downsample_first=False)
+
+ self.up2 = nn.Upsample(scale_factor=2)
+
+ def forward(self, x):
+ """Model forward function."""
+ up1 = self.up1(x)
+ low1 = self.low1(x)
+ low2 = self.low2(low1)
+ low3 = self.low3(low2)
+ up2 = self.up2(low3)
+ return up1 + up2
+
+
+@MODELS.register_module()
+class HourglassNet(BaseBackbone):
+ """HourglassNet backbone.
+
+ Stacked Hourglass Networks for Human Pose Estimation.
+ More details can be found in the `paper
+ `__ .
+
+ Args:
+ downsample_times (int): Downsample times in a HourglassModule.
+ num_stacks (int): Number of HourglassModule modules stacked,
+ 1 for Hourglass-52, 2 for Hourglass-104.
+ stage_channels (list[int]): Feature channel of each sub-module in a
+ HourglassModule.
+ stage_blocks (list[int]): Number of sub-modules stacked in a
+ HourglassModule.
+ feat_channel (int): Feature channel of conv after a HourglassModule.
+ norm_cfg (dict): Dictionary to construct and config norm layer.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+
+ Example:
+ >>> from mmpose.models import HourglassNet
+ >>> import torch
+ >>> self = HourglassNet()
+ >>> self.eval()
+ >>> inputs = torch.rand(1, 3, 511, 511)
+ >>> level_outputs = self.forward(inputs)
+ >>> for level_output in level_outputs:
+ ... print(tuple(level_output.shape))
+ (1, 256, 128, 128)
+ (1, 256, 128, 128)
+ """
+
+ def __init__(
+ self,
+ downsample_times=5,
+ num_stacks=2,
+ stage_channels=(256, 256, 384, 384, 384, 512),
+ stage_blocks=(2, 2, 2, 2, 2, 4),
+ feat_channel=256,
+ norm_cfg=dict(type='BN', requires_grad=True),
+ init_cfg=[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(type='Constant', val=1, layer=['_BatchNorm', 'GroupNorm'])
+ ],
+ ):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+
+ self.num_stacks = num_stacks
+ assert self.num_stacks >= 1
+ assert len(stage_channels) == len(stage_blocks)
+ assert len(stage_channels) > downsample_times
+
+ cur_channel = stage_channels[0]
+
+ self.stem = nn.Sequential(
+ ConvModule(3, 128, 7, padding=3, stride=2, norm_cfg=norm_cfg),
+ ResLayer(BasicBlock, 1, 128, 256, stride=2, norm_cfg=norm_cfg))
+
+ self.hourglass_modules = nn.ModuleList([
+ HourglassModule(downsample_times, stage_channels, stage_blocks)
+ for _ in range(num_stacks)
+ ])
+
+ self.inters = ResLayer(
+ BasicBlock,
+ num_stacks - 1,
+ cur_channel,
+ cur_channel,
+ norm_cfg=norm_cfg)
+
+ self.conv1x1s = nn.ModuleList([
+ ConvModule(
+ cur_channel, cur_channel, 1, norm_cfg=norm_cfg, act_cfg=None)
+ for _ in range(num_stacks - 1)
+ ])
+
+ self.out_convs = nn.ModuleList([
+ ConvModule(
+ cur_channel, feat_channel, 3, padding=1, norm_cfg=norm_cfg)
+ for _ in range(num_stacks)
+ ])
+
+ self.remap_convs = nn.ModuleList([
+ ConvModule(
+ feat_channel, cur_channel, 1, norm_cfg=norm_cfg, act_cfg=None)
+ for _ in range(num_stacks - 1)
+ ])
+
+ self.relu = nn.ReLU(inplace=True)
+
+ def forward(self, x):
+ """Model forward function."""
+ inter_feat = self.stem(x)
+ out_feats = []
+
+ for ind in range(self.num_stacks):
+ single_hourglass = self.hourglass_modules[ind]
+ out_conv = self.out_convs[ind]
+
+ hourglass_feat = single_hourglass(inter_feat)
+ out_feat = out_conv(hourglass_feat)
+ out_feats.append(out_feat)
+
+ if ind < self.num_stacks - 1:
+ inter_feat = self.conv1x1s[ind](
+ inter_feat) + self.remap_convs[ind](
+ out_feat)
+ inter_feat = self.inters[ind](self.relu(inter_feat))
+
+ return out_feats
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/hourglass_ae.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/hourglass_ae.py
new file mode 100644
index 0000000000000000000000000000000000000000..bb8e291ab61bf5f768b001eff3dcb96d3782fdcd
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/hourglass_ae.py
@@ -0,0 +1,214 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+
+import torch.nn as nn
+from mmcv.cnn import ConvModule, MaxPool2d
+from mmengine.model import BaseModule
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+
+
+class HourglassAEModule(BaseModule):
+ """Modified Hourglass Module for HourglassNet_AE backbone.
+
+ Generate module recursively and use BasicBlock as the base unit.
+
+ Args:
+ depth (int): Depth of current HourglassModule.
+ stage_channels (list[int]): Feature channels of sub-modules in current
+ and follow-up HourglassModule.
+ norm_cfg (dict): Dictionary to construct and config norm layer.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ depth,
+ stage_channels,
+ norm_cfg=dict(type='BN', requires_grad=True),
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+
+ self.depth = depth
+
+ cur_channel = stage_channels[0]
+ next_channel = stage_channels[1]
+
+ self.up1 = ConvModule(
+ cur_channel, cur_channel, 3, padding=1, norm_cfg=norm_cfg)
+
+ self.pool1 = MaxPool2d(2, 2)
+
+ self.low1 = ConvModule(
+ cur_channel, next_channel, 3, padding=1, norm_cfg=norm_cfg)
+
+ if self.depth > 1:
+ self.low2 = HourglassAEModule(depth - 1, stage_channels[1:])
+ else:
+ self.low2 = ConvModule(
+ next_channel, next_channel, 3, padding=1, norm_cfg=norm_cfg)
+
+ self.low3 = ConvModule(
+ next_channel, cur_channel, 3, padding=1, norm_cfg=norm_cfg)
+
+ self.up2 = nn.UpsamplingNearest2d(scale_factor=2)
+
+ def forward(self, x):
+ """Model forward function."""
+ up1 = self.up1(x)
+ pool1 = self.pool1(x)
+ low1 = self.low1(pool1)
+ low2 = self.low2(low1)
+ low3 = self.low3(low2)
+ up2 = self.up2(low3)
+ return up1 + up2
+
+
+@MODELS.register_module()
+class HourglassAENet(BaseBackbone):
+ """Hourglass-AE Network proposed by Newell et al.
+
+ Associative Embedding: End-to-End Learning for Joint
+ Detection and Grouping.
+
+ More details can be found in the `paper
+ `__ .
+
+ Args:
+ downsample_times (int): Downsample times in a HourglassModule.
+ num_stacks (int): Number of HourglassModule modules stacked,
+ 1 for Hourglass-52, 2 for Hourglass-104.
+ stage_channels (list[int]): Feature channel of each sub-module in a
+ HourglassModule.
+ stage_blocks (list[int]): Number of sub-modules stacked in a
+ HourglassModule.
+ feat_channels (int): Feature channel of conv after a HourglassModule.
+ norm_cfg (dict): Dictionary to construct and config norm layer.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+
+ Example:
+ >>> from mmpose.models import HourglassAENet
+ >>> import torch
+ >>> self = HourglassAENet()
+ >>> self.eval()
+ >>> inputs = torch.rand(1, 3, 512, 512)
+ >>> level_outputs = self.forward(inputs)
+ >>> for level_output in level_outputs:
+ ... print(tuple(level_output.shape))
+ (1, 34, 128, 128)
+ """
+
+ def __init__(
+ self,
+ downsample_times=4,
+ num_stacks=1,
+ out_channels=34,
+ stage_channels=(256, 384, 512, 640, 768),
+ feat_channels=256,
+ norm_cfg=dict(type='BN', requires_grad=True),
+ init_cfg=[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(type='Constant', val=1, layer=['_BatchNorm', 'GroupNorm'])
+ ],
+ ):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+
+ self.num_stacks = num_stacks
+ assert self.num_stacks >= 1
+ assert len(stage_channels) > downsample_times
+
+ cur_channels = stage_channels[0]
+
+ self.stem = nn.Sequential(
+ ConvModule(3, 64, 7, padding=3, stride=2, norm_cfg=norm_cfg),
+ ConvModule(64, 128, 3, padding=1, norm_cfg=norm_cfg),
+ MaxPool2d(2, 2),
+ ConvModule(128, 128, 3, padding=1, norm_cfg=norm_cfg),
+ ConvModule(128, feat_channels, 3, padding=1, norm_cfg=norm_cfg),
+ )
+
+ self.hourglass_modules = nn.ModuleList([
+ nn.Sequential(
+ HourglassAEModule(
+ downsample_times, stage_channels, norm_cfg=norm_cfg),
+ ConvModule(
+ feat_channels,
+ feat_channels,
+ 3,
+ padding=1,
+ norm_cfg=norm_cfg),
+ ConvModule(
+ feat_channels,
+ feat_channels,
+ 3,
+ padding=1,
+ norm_cfg=norm_cfg)) for _ in range(num_stacks)
+ ])
+
+ self.out_convs = nn.ModuleList([
+ ConvModule(
+ cur_channels,
+ out_channels,
+ 1,
+ padding=0,
+ norm_cfg=None,
+ act_cfg=None) for _ in range(num_stacks)
+ ])
+
+ self.remap_out_convs = nn.ModuleList([
+ ConvModule(
+ out_channels,
+ feat_channels,
+ 1,
+ norm_cfg=norm_cfg,
+ act_cfg=None) for _ in range(num_stacks - 1)
+ ])
+
+ self.remap_feature_convs = nn.ModuleList([
+ ConvModule(
+ feat_channels,
+ feat_channels,
+ 1,
+ norm_cfg=norm_cfg,
+ act_cfg=None) for _ in range(num_stacks - 1)
+ ])
+
+ self.relu = nn.ReLU(inplace=True)
+
+ def forward(self, x):
+ """Model forward function."""
+ inter_feat = self.stem(x)
+ out_feats = []
+
+ for ind in range(self.num_stacks):
+ single_hourglass = self.hourglass_modules[ind]
+ out_conv = self.out_convs[ind]
+
+ hourglass_feat = single_hourglass(inter_feat)
+ out_feat = out_conv(hourglass_feat)
+ out_feats.append(out_feat)
+
+ if ind < self.num_stacks - 1:
+ inter_feat = inter_feat + self.remap_out_convs[ind](
+ out_feat) + self.remap_feature_convs[ind](
+ hourglass_feat)
+
+ return out_feats
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/hrformer.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/hrformer.py
new file mode 100644
index 0000000000000000000000000000000000000000..8a97a05283b2fafa2b6982d916cb6dd780b87b25
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/hrformer.py
@@ -0,0 +1,763 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+
+import math
+
+import torch
+import torch.nn as nn
+from mmcv.cnn import build_activation_layer, build_conv_layer, build_norm_layer
+from mmcv.cnn.bricks.transformer import build_dropout
+from mmengine.model import BaseModule, trunc_normal_init
+from torch.nn.functional import pad
+
+from mmpose.registry import MODELS
+from .hrnet import Bottleneck, HRModule, HRNet
+
+
+def nlc_to_nchw(x, hw_shape):
+ """Convert [N, L, C] shape tensor to [N, C, H, W] shape tensor.
+
+ Args:
+ x (Tensor): The input tensor of shape [N, L, C] before conversion.
+ hw_shape (Sequence[int]): The height and width of output feature map.
+
+ Returns:
+ Tensor: The output tensor of shape [N, C, H, W] after conversion.
+ """
+ H, W = hw_shape
+ assert len(x.shape) == 3
+ B, L, C = x.shape
+ assert L == H * W, 'The seq_len doesn\'t match H, W'
+ return x.transpose(1, 2).reshape(B, C, H, W)
+
+
+def nchw_to_nlc(x):
+ """Flatten [N, C, H, W] shape tensor to [N, L, C] shape tensor.
+
+ Args:
+ x (Tensor): The input tensor of shape [N, C, H, W] before conversion.
+
+ Returns:
+ Tensor: The output tensor of shape [N, L, C] after conversion.
+ """
+ assert len(x.shape) == 4
+ return x.flatten(2).transpose(1, 2).contiguous()
+
+
+def build_drop_path(drop_path_rate):
+ """Build drop path layer."""
+ return build_dropout(dict(type='DropPath', drop_prob=drop_path_rate))
+
+
+class WindowMSA(BaseModule):
+ """Window based multi-head self-attention (W-MSA) module with relative
+ position bias.
+
+ Args:
+ embed_dims (int): Number of input channels.
+ num_heads (int): Number of attention heads.
+ window_size (tuple[int]): The height and width of the window.
+ qkv_bias (bool, optional): If True, add a learnable bias to q, k, v.
+ Default: True.
+ qk_scale (float | None, optional): Override default qk scale of
+ head_dim ** -0.5 if set. Default: None.
+ attn_drop_rate (float, optional): Dropout ratio of attention weight.
+ Default: 0.0
+ proj_drop_rate (float, optional): Dropout ratio of output. Default: 0.
+ with_rpe (bool, optional): If True, use relative position bias.
+ Default: True.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None.
+ """
+
+ def __init__(self,
+ embed_dims,
+ num_heads,
+ window_size,
+ qkv_bias=True,
+ qk_scale=None,
+ attn_drop_rate=0.,
+ proj_drop_rate=0.,
+ with_rpe=True,
+ init_cfg=None):
+
+ super().__init__(init_cfg=init_cfg)
+ self.embed_dims = embed_dims
+ self.window_size = window_size # Wh, Ww
+ self.num_heads = num_heads
+ head_embed_dims = embed_dims // num_heads
+ self.scale = qk_scale or head_embed_dims**-0.5
+
+ self.with_rpe = with_rpe
+ if self.with_rpe:
+ # define a parameter table of relative position bias
+ self.relative_position_bias_table = nn.Parameter(
+ torch.zeros(
+ (2 * window_size[0] - 1) * (2 * window_size[1] - 1),
+ num_heads)) # 2*Wh-1 * 2*Ww-1, nH
+
+ Wh, Ww = self.window_size
+ rel_index_coords = self.double_step_seq(2 * Ww - 1, Wh, 1, Ww)
+ rel_position_index = rel_index_coords + rel_index_coords.T
+ rel_position_index = rel_position_index.flip(1).contiguous()
+ self.register_buffer('relative_position_index', rel_position_index)
+
+ self.qkv = nn.Linear(embed_dims, embed_dims * 3, bias=qkv_bias)
+ self.attn_drop = nn.Dropout(attn_drop_rate)
+ self.proj = nn.Linear(embed_dims, embed_dims)
+ self.proj_drop = nn.Dropout(proj_drop_rate)
+
+ self.softmax = nn.Softmax(dim=-1)
+
+ def init_weights(self):
+ trunc_normal_init(self.relative_position_bias_table, std=0.02)
+
+ def forward(self, x, mask=None):
+ """
+ Args:
+
+ x (tensor): input features with shape of (B*num_windows, N, C)
+ mask (tensor | None, Optional): mask with shape of (num_windows,
+ Wh*Ww, Wh*Ww), value should be between (-inf, 0].
+ """
+ B, N, C = x.shape
+ qkv = self.qkv(x).reshape(B, N, 3, self.num_heads,
+ C // self.num_heads).permute(2, 0, 3, 1, 4)
+ q, k, v = qkv[0], qkv[1], qkv[2]
+
+ q = q * self.scale
+ attn = (q @ k.transpose(-2, -1))
+
+ if self.with_rpe:
+ relative_position_bias = self.relative_position_bias_table[
+ self.relative_position_index.view(-1)].view(
+ self.window_size[0] * self.window_size[1],
+ self.window_size[0] * self.window_size[1],
+ -1) # Wh*Ww,Wh*Ww,nH
+ relative_position_bias = relative_position_bias.permute(
+ 2, 0, 1).contiguous() # nH, Wh*Ww, Wh*Ww
+ attn = attn + relative_position_bias.unsqueeze(0)
+
+ if mask is not None:
+ nW = mask.shape[0]
+ attn = attn.view(B // nW, nW, self.num_heads, N,
+ N) + mask.unsqueeze(1).unsqueeze(0)
+ attn = attn.view(-1, self.num_heads, N, N)
+ attn = self.softmax(attn)
+
+ attn = self.attn_drop(attn)
+
+ x = (attn @ v).transpose(1, 2).reshape(B, N, C)
+ x = self.proj(x)
+ x = self.proj_drop(x)
+ return x
+
+ @staticmethod
+ def double_step_seq(step1, len1, step2, len2):
+ seq1 = torch.arange(0, step1 * len1, step1)
+ seq2 = torch.arange(0, step2 * len2, step2)
+ return (seq1[:, None] + seq2[None, :]).reshape(1, -1)
+
+
+class LocalWindowSelfAttention(BaseModule):
+ r""" Local-window Self Attention (LSA) module with relative position bias.
+
+ This module is the short-range self-attention module in the
+ Interlaced Sparse Self-Attention `_.
+
+ Args:
+ embed_dims (int): Number of input channels.
+ num_heads (int): Number of attention heads.
+ window_size (tuple[int] | int): The height and width of the window.
+ qkv_bias (bool, optional): If True, add a learnable bias to q, k, v.
+ Default: True.
+ qk_scale (float | None, optional): Override default qk scale of
+ head_dim ** -0.5 if set. Default: None.
+ attn_drop_rate (float, optional): Dropout ratio of attention weight.
+ Default: 0.0
+ proj_drop_rate (float, optional): Dropout ratio of output. Default: 0.
+ with_rpe (bool, optional): If True, use relative position bias.
+ Default: True.
+ with_pad_mask (bool, optional): If True, mask out the padded tokens in
+ the attention process. Default: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None.
+ """
+
+ def __init__(self,
+ embed_dims,
+ num_heads,
+ window_size,
+ qkv_bias=True,
+ qk_scale=None,
+ attn_drop_rate=0.,
+ proj_drop_rate=0.,
+ with_rpe=True,
+ with_pad_mask=False,
+ init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+ if isinstance(window_size, int):
+ window_size = (window_size, window_size)
+ self.window_size = window_size
+ self.with_pad_mask = with_pad_mask
+ self.attn = WindowMSA(
+ embed_dims=embed_dims,
+ num_heads=num_heads,
+ window_size=window_size,
+ qkv_bias=qkv_bias,
+ qk_scale=qk_scale,
+ attn_drop_rate=attn_drop_rate,
+ proj_drop_rate=proj_drop_rate,
+ with_rpe=with_rpe,
+ init_cfg=init_cfg)
+
+ def forward(self, x, H, W, **kwargs):
+ """Forward function."""
+ B, N, C = x.shape
+ x = x.view(B, H, W, C)
+ Wh, Ww = self.window_size
+
+ # center-pad the feature on H and W axes
+ pad_h = math.ceil(H / Wh) * Wh - H
+ pad_w = math.ceil(W / Ww) * Ww - W
+ x = pad(x, (0, 0, pad_w // 2, pad_w - pad_w // 2, pad_h // 2,
+ pad_h - pad_h // 2))
+
+ # permute
+ x = x.view(B, math.ceil(H / Wh), Wh, math.ceil(W / Ww), Ww, C)
+ x = x.permute(0, 1, 3, 2, 4, 5)
+ x = x.reshape(-1, Wh * Ww, C) # (B*num_window, Wh*Ww, C)
+
+ # attention
+ if self.with_pad_mask and pad_h > 0 and pad_w > 0:
+ pad_mask = x.new_zeros(1, H, W, 1)
+ pad_mask = pad(
+ pad_mask, [
+ 0, 0, pad_w // 2, pad_w - pad_w // 2, pad_h // 2,
+ pad_h - pad_h // 2
+ ],
+ value=-float('inf'))
+ pad_mask = pad_mask.view(1, math.ceil(H / Wh), Wh,
+ math.ceil(W / Ww), Ww, 1)
+ pad_mask = pad_mask.permute(1, 3, 0, 2, 4, 5)
+ pad_mask = pad_mask.reshape(-1, Wh * Ww)
+ pad_mask = pad_mask[:, None, :].expand([-1, Wh * Ww, -1])
+ out = self.attn(x, pad_mask, **kwargs)
+ else:
+ out = self.attn(x, **kwargs)
+
+ # reverse permutation
+ out = out.reshape(B, math.ceil(H / Wh), math.ceil(W / Ww), Wh, Ww, C)
+ out = out.permute(0, 1, 3, 2, 4, 5)
+ out = out.reshape(B, H + pad_h, W + pad_w, C)
+
+ # de-pad
+ out = out[:, pad_h // 2:H + pad_h // 2, pad_w // 2:W + pad_w // 2]
+ return out.reshape(B, N, C)
+
+
+class CrossFFN(BaseModule):
+ r"""FFN with Depthwise Conv of HRFormer.
+
+ Args:
+ in_features (int): The feature dimension.
+ hidden_features (int, optional): The hidden dimension of FFNs.
+ Defaults: The same as in_features.
+ act_cfg (dict, optional): Config of activation layer.
+ Default: dict(type='GELU').
+ dw_act_cfg (dict, optional): Config of activation layer appended
+ right after DW Conv. Default: dict(type='GELU').
+ norm_cfg (dict, optional): Config of norm layer.
+ Default: dict(type='SyncBN').
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None.
+ """
+
+ def __init__(self,
+ in_features,
+ hidden_features=None,
+ out_features=None,
+ act_cfg=dict(type='GELU'),
+ dw_act_cfg=dict(type='GELU'),
+ norm_cfg=dict(type='SyncBN'),
+ init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+ out_features = out_features or in_features
+ hidden_features = hidden_features or in_features
+ self.fc1 = nn.Conv2d(in_features, hidden_features, kernel_size=1)
+ self.act1 = build_activation_layer(act_cfg)
+ self.norm1 = build_norm_layer(norm_cfg, hidden_features)[1]
+ self.dw3x3 = nn.Conv2d(
+ hidden_features,
+ hidden_features,
+ kernel_size=3,
+ stride=1,
+ groups=hidden_features,
+ padding=1)
+ self.act2 = build_activation_layer(dw_act_cfg)
+ self.norm2 = build_norm_layer(norm_cfg, hidden_features)[1]
+ self.fc2 = nn.Conv2d(hidden_features, out_features, kernel_size=1)
+ self.act3 = build_activation_layer(act_cfg)
+ self.norm3 = build_norm_layer(norm_cfg, out_features)[1]
+
+ def forward(self, x, H, W):
+ """Forward function."""
+ x = nlc_to_nchw(x, (H, W))
+ x = self.act1(self.norm1(self.fc1(x)))
+ x = self.act2(self.norm2(self.dw3x3(x)))
+ x = self.act3(self.norm3(self.fc2(x)))
+ x = nchw_to_nlc(x)
+ return x
+
+
+class HRFormerBlock(BaseModule):
+ """High-Resolution Block for HRFormer.
+
+ Args:
+ in_features (int): The input dimension.
+ out_features (int): The output dimension.
+ num_heads (int): The number of head within each LSA.
+ window_size (int, optional): The window size for the LSA.
+ Default: 7
+ mlp_ratio (int, optional): The expansion ration of FFN.
+ Default: 4
+ act_cfg (dict, optional): Config of activation layer.
+ Default: dict(type='GELU').
+ norm_cfg (dict, optional): Config of norm layer.
+ Default: dict(type='SyncBN').
+ transformer_norm_cfg (dict, optional): Config of transformer norm
+ layer. Default: dict(type='LN', eps=1e-6).
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None.
+ """
+
+ expansion = 1
+
+ def __init__(self,
+ in_features,
+ out_features,
+ num_heads,
+ window_size=7,
+ mlp_ratio=4.0,
+ drop_path=0.0,
+ act_cfg=dict(type='GELU'),
+ norm_cfg=dict(type='SyncBN'),
+ transformer_norm_cfg=dict(type='LN', eps=1e-6),
+ init_cfg=None,
+ **kwargs):
+ super(HRFormerBlock, self).__init__(init_cfg=init_cfg)
+ self.num_heads = num_heads
+ self.window_size = window_size
+ self.mlp_ratio = mlp_ratio
+
+ self.norm1 = build_norm_layer(transformer_norm_cfg, in_features)[1]
+ self.attn = LocalWindowSelfAttention(
+ in_features,
+ num_heads=num_heads,
+ window_size=window_size,
+ init_cfg=None,
+ **kwargs)
+
+ self.norm2 = build_norm_layer(transformer_norm_cfg, out_features)[1]
+ self.ffn = CrossFFN(
+ in_features=in_features,
+ hidden_features=int(in_features * mlp_ratio),
+ out_features=out_features,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg,
+ dw_act_cfg=act_cfg,
+ init_cfg=None)
+
+ self.drop_path = build_drop_path(
+ drop_path) if drop_path > 0.0 else nn.Identity()
+
+ def forward(self, x):
+ """Forward function."""
+ B, C, H, W = x.size()
+ # Attention
+ x = x.view(B, C, -1).permute(0, 2, 1)
+ x = x + self.drop_path(self.attn(self.norm1(x), H, W))
+ # FFN
+ x = x + self.drop_path(self.ffn(self.norm2(x), H, W))
+ x = x.permute(0, 2, 1).view(B, C, H, W)
+ return x
+
+ def extra_repr(self):
+ """(Optional) Set the extra information about this module."""
+ return 'num_heads={}, window_size={}, mlp_ratio={}'.format(
+ self.num_heads, self.window_size, self.mlp_ratio)
+
+
+class HRFomerModule(HRModule):
+ """High-Resolution Module for HRFormer.
+
+ Args:
+ num_branches (int): The number of branches in the HRFormerModule.
+ block (nn.Module): The building block of HRFormer.
+ The block should be the HRFormerBlock.
+ num_blocks (tuple): The number of blocks in each branch.
+ The length must be equal to num_branches.
+ num_inchannels (tuple): The number of input channels in each branch.
+ The length must be equal to num_branches.
+ num_channels (tuple): The number of channels in each branch.
+ The length must be equal to num_branches.
+ num_heads (tuple): The number of heads within the LSAs.
+ num_window_sizes (tuple): The window size for the LSAs.
+ num_mlp_ratios (tuple): The expansion ratio for the FFNs.
+ drop_path (int, optional): The drop path rate of HRFomer.
+ Default: 0.0
+ multiscale_output (bool, optional): Whether to output multi-level
+ features produced by multiple branches. If False, only the first
+ level feature will be output. Default: True.
+ conv_cfg (dict, optional): Config of the conv layers.
+ Default: None.
+ norm_cfg (dict, optional): Config of the norm layers appended
+ right after conv. Default: dict(type='SyncBN', requires_grad=True)
+ transformer_norm_cfg (dict, optional): Config of the norm layers.
+ Default: dict(type='LN', eps=1e-6)
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False
+ upsample_cfg(dict, optional): The config of upsample layers in fuse
+ layers. Default: dict(mode='bilinear', align_corners=False)
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None.
+ """
+
+ def __init__(self,
+ num_branches,
+ block,
+ num_blocks,
+ num_inchannels,
+ num_channels,
+ num_heads,
+ num_window_sizes,
+ num_mlp_ratios,
+ multiscale_output=True,
+ drop_paths=0.0,
+ with_rpe=True,
+ with_pad_mask=False,
+ conv_cfg=None,
+ norm_cfg=dict(type='SyncBN', requires_grad=True),
+ transformer_norm_cfg=dict(type='LN', eps=1e-6),
+ with_cp=False,
+ upsample_cfg=dict(mode='bilinear', align_corners=False),
+ **kwargs):
+
+ self.transformer_norm_cfg = transformer_norm_cfg
+ self.drop_paths = drop_paths
+ self.num_heads = num_heads
+ self.num_window_sizes = num_window_sizes
+ self.num_mlp_ratios = num_mlp_ratios
+ self.with_rpe = with_rpe
+ self.with_pad_mask = with_pad_mask
+
+ super().__init__(num_branches, block, num_blocks, num_inchannels,
+ num_channels, multiscale_output, with_cp, conv_cfg,
+ norm_cfg, upsample_cfg, **kwargs)
+
+ def _make_one_branch(self,
+ branch_index,
+ block,
+ num_blocks,
+ num_channels,
+ stride=1):
+ """Build one branch."""
+ # HRFormerBlock does not support down sample layer yet.
+ assert stride == 1 and self.in_channels[branch_index] == num_channels[
+ branch_index]
+ layers = []
+ layers.append(
+ block(
+ self.in_channels[branch_index],
+ num_channels[branch_index],
+ num_heads=self.num_heads[branch_index],
+ window_size=self.num_window_sizes[branch_index],
+ mlp_ratio=self.num_mlp_ratios[branch_index],
+ drop_path=self.drop_paths[0],
+ norm_cfg=self.norm_cfg,
+ transformer_norm_cfg=self.transformer_norm_cfg,
+ init_cfg=None,
+ with_rpe=self.with_rpe,
+ with_pad_mask=self.with_pad_mask))
+
+ self.in_channels[
+ branch_index] = self.in_channels[branch_index] * block.expansion
+ for i in range(1, num_blocks[branch_index]):
+ layers.append(
+ block(
+ self.in_channels[branch_index],
+ num_channels[branch_index],
+ num_heads=self.num_heads[branch_index],
+ window_size=self.num_window_sizes[branch_index],
+ mlp_ratio=self.num_mlp_ratios[branch_index],
+ drop_path=self.drop_paths[i],
+ norm_cfg=self.norm_cfg,
+ transformer_norm_cfg=self.transformer_norm_cfg,
+ init_cfg=None,
+ with_rpe=self.with_rpe,
+ with_pad_mask=self.with_pad_mask))
+ return nn.Sequential(*layers)
+
+ def _make_fuse_layers(self):
+ """Build fuse layers."""
+ if self.num_branches == 1:
+ return None
+ num_branches = self.num_branches
+ num_inchannels = self.in_channels
+ fuse_layers = []
+ for i in range(num_branches if self.multiscale_output else 1):
+ fuse_layer = []
+ for j in range(num_branches):
+ if j > i:
+ fuse_layer.append(
+ nn.Sequential(
+ build_conv_layer(
+ self.conv_cfg,
+ num_inchannels[j],
+ num_inchannels[i],
+ kernel_size=1,
+ stride=1,
+ bias=False),
+ build_norm_layer(self.norm_cfg,
+ num_inchannels[i])[1],
+ nn.Upsample(
+ scale_factor=2**(j - i),
+ mode=self.upsample_cfg['mode'],
+ align_corners=self.
+ upsample_cfg['align_corners'])))
+ elif j == i:
+ fuse_layer.append(None)
+ else:
+ conv3x3s = []
+ for k in range(i - j):
+ if k == i - j - 1:
+ num_outchannels_conv3x3 = num_inchannels[i]
+ with_out_act = False
+ else:
+ num_outchannels_conv3x3 = num_inchannels[j]
+ with_out_act = True
+ sub_modules = [
+ build_conv_layer(
+ self.conv_cfg,
+ num_inchannels[j],
+ num_inchannels[j],
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ groups=num_inchannels[j],
+ bias=False,
+ ),
+ build_norm_layer(self.norm_cfg,
+ num_inchannels[j])[1],
+ build_conv_layer(
+ self.conv_cfg,
+ num_inchannels[j],
+ num_outchannels_conv3x3,
+ kernel_size=1,
+ stride=1,
+ bias=False,
+ ),
+ build_norm_layer(self.norm_cfg,
+ num_outchannels_conv3x3)[1]
+ ]
+ if with_out_act:
+ sub_modules.append(nn.ReLU(False))
+ conv3x3s.append(nn.Sequential(*sub_modules))
+ fuse_layer.append(nn.Sequential(*conv3x3s))
+ fuse_layers.append(nn.ModuleList(fuse_layer))
+
+ return nn.ModuleList(fuse_layers)
+
+ def get_num_inchannels(self):
+ """Return the number of input channels."""
+ return self.in_channels
+
+
+@MODELS.register_module()
+class HRFormer(HRNet):
+ """HRFormer backbone.
+
+ This backbone is the implementation of `HRFormer: High-Resolution
+ Transformer for Dense Prediction `_.
+
+ Args:
+ extra (dict): Detailed configuration for each stage of HRNet.
+ There must be 4 stages, the configuration for each stage must have
+ 5 keys:
+
+ - num_modules (int): The number of HRModule in this stage.
+ - num_branches (int): The number of branches in the HRModule.
+ - block (str): The type of block.
+ - num_blocks (tuple): The number of blocks in each branch.
+ The length must be equal to num_branches.
+ - num_channels (tuple): The number of channels in each branch.
+ The length must be equal to num_branches.
+ in_channels (int): Number of input image channels. Normally 3.
+ conv_cfg (dict): Dictionary to construct and config conv layer.
+ Default: None.
+ norm_cfg (dict): Config of norm layer.
+ Use `SyncBN` by default.
+ transformer_norm_cfg (dict): Config of transformer norm layer.
+ Use `LN` by default.
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False.
+ zero_init_residual (bool): Whether to use zero init for last norm layer
+ in resblocks to let them behave as identity. Default: False.
+ frozen_stages (int): Stages to be frozen (stop grad and set eval mode).
+ -1 means not freezing any parameters. Default: -1.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+
+ Example:
+ >>> from mmpose.models import HRFormer
+ >>> import torch
+ >>> extra = dict(
+ >>> stage1=dict(
+ >>> num_modules=1,
+ >>> num_branches=1,
+ >>> block='BOTTLENECK',
+ >>> num_blocks=(2, ),
+ >>> num_channels=(64, )),
+ >>> stage2=dict(
+ >>> num_modules=1,
+ >>> num_branches=2,
+ >>> block='HRFORMER',
+ >>> window_sizes=(7, 7),
+ >>> num_heads=(1, 2),
+ >>> mlp_ratios=(4, 4),
+ >>> num_blocks=(2, 2),
+ >>> num_channels=(32, 64)),
+ >>> stage3=dict(
+ >>> num_modules=4,
+ >>> num_branches=3,
+ >>> block='HRFORMER',
+ >>> window_sizes=(7, 7, 7),
+ >>> num_heads=(1, 2, 4),
+ >>> mlp_ratios=(4, 4, 4),
+ >>> num_blocks=(2, 2, 2),
+ >>> num_channels=(32, 64, 128)),
+ >>> stage4=dict(
+ >>> num_modules=2,
+ >>> num_branches=4,
+ >>> block='HRFORMER',
+ >>> window_sizes=(7, 7, 7, 7),
+ >>> num_heads=(1, 2, 4, 8),
+ >>> mlp_ratios=(4, 4, 4, 4),
+ >>> num_blocks=(2, 2, 2, 2),
+ >>> num_channels=(32, 64, 128, 256)))
+ >>> self = HRFormer(extra, in_channels=1)
+ >>> self.eval()
+ >>> inputs = torch.rand(1, 1, 32, 32)
+ >>> level_outputs = self.forward(inputs)
+ >>> for level_out in level_outputs:
+ ... print(tuple(level_out.shape))
+ (1, 32, 8, 8)
+ (1, 64, 4, 4)
+ (1, 128, 2, 2)
+ (1, 256, 1, 1)
+ """
+
+ blocks_dict = {'BOTTLENECK': Bottleneck, 'HRFORMERBLOCK': HRFormerBlock}
+
+ def __init__(
+ self,
+ extra,
+ in_channels=3,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN', requires_grad=True),
+ transformer_norm_cfg=dict(type='LN', eps=1e-6),
+ norm_eval=False,
+ with_cp=False,
+ zero_init_residual=False,
+ frozen_stages=-1,
+ init_cfg=[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(type='Constant', val=1, layer=['_BatchNorm', 'GroupNorm'])
+ ],
+ ):
+
+ # stochastic depth
+ depths = [
+ extra[stage]['num_blocks'][0] * extra[stage]['num_modules']
+ for stage in ['stage2', 'stage3', 'stage4']
+ ]
+ depth_s2, depth_s3, _ = depths
+ drop_path_rate = extra['drop_path_rate']
+ dpr = [
+ x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))
+ ]
+ extra['stage2']['drop_path_rates'] = dpr[0:depth_s2]
+ extra['stage3']['drop_path_rates'] = dpr[depth_s2:depth_s2 + depth_s3]
+ extra['stage4']['drop_path_rates'] = dpr[depth_s2 + depth_s3:]
+
+ # HRFormer use bilinear upsample as default
+ upsample_cfg = extra.get('upsample', {
+ 'mode': 'bilinear',
+ 'align_corners': False
+ })
+ extra['upsample'] = upsample_cfg
+ self.transformer_norm_cfg = transformer_norm_cfg
+ self.with_rpe = extra.get('with_rpe', True)
+ self.with_pad_mask = extra.get('with_pad_mask', False)
+
+ super().__init__(extra, in_channels, conv_cfg, norm_cfg, norm_eval,
+ with_cp, zero_init_residual, frozen_stages, init_cfg)
+
+ def _make_stage(self,
+ layer_config,
+ num_inchannels,
+ multiscale_output=True):
+ """Make each stage."""
+ num_modules = layer_config['num_modules']
+ num_branches = layer_config['num_branches']
+ num_blocks = layer_config['num_blocks']
+ num_channels = layer_config['num_channels']
+ block = self.blocks_dict[layer_config['block']]
+ num_heads = layer_config['num_heads']
+ num_window_sizes = layer_config['window_sizes']
+ num_mlp_ratios = layer_config['mlp_ratios']
+ drop_path_rates = layer_config['drop_path_rates']
+
+ modules = []
+ for i in range(num_modules):
+ # multiscale_output is only used at the last module
+ if not multiscale_output and i == num_modules - 1:
+ reset_multiscale_output = False
+ else:
+ reset_multiscale_output = True
+
+ modules.append(
+ HRFomerModule(
+ num_branches,
+ block,
+ num_blocks,
+ num_inchannels,
+ num_channels,
+ num_heads,
+ num_window_sizes,
+ num_mlp_ratios,
+ reset_multiscale_output,
+ drop_paths=drop_path_rates[num_blocks[0] *
+ i:num_blocks[0] * (i + 1)],
+ with_rpe=self.with_rpe,
+ with_pad_mask=self.with_pad_mask,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ transformer_norm_cfg=self.transformer_norm_cfg,
+ with_cp=self.with_cp,
+ upsample_cfg=self.upsample_cfg))
+ num_inchannels = modules[-1].get_num_inchannels()
+
+ return nn.Sequential(*modules), num_inchannels
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/hrnet.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/hrnet.py
new file mode 100644
index 0000000000000000000000000000000000000000..262df65cc3059bcac761e6e9a466ff4e8a40ea02
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/hrnet.py
@@ -0,0 +1,615 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+
+import torch.nn as nn
+from mmcv.cnn import build_conv_layer, build_norm_layer
+from mmengine.model import BaseModule, constant_init
+from torch.nn.modules.batchnorm import _BatchNorm
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+from .resnet import BasicBlock, Bottleneck, get_expansion
+
+
+class HRModule(BaseModule):
+ """High-Resolution Module for HRNet.
+
+ In this module, every branch has 4 BasicBlocks/Bottlenecks. Fusion/Exchange
+ is in this module.
+ """
+
+ def __init__(self,
+ num_branches,
+ blocks,
+ num_blocks,
+ in_channels,
+ num_channels,
+ multiscale_output=False,
+ with_cp=False,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ upsample_cfg=dict(mode='nearest', align_corners=None),
+ init_cfg=None):
+
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self._check_branches(num_branches, num_blocks, in_channels,
+ num_channels)
+
+ self.in_channels = in_channels
+ self.num_branches = num_branches
+
+ self.multiscale_output = multiscale_output
+ self.norm_cfg = norm_cfg
+ self.conv_cfg = conv_cfg
+ self.upsample_cfg = upsample_cfg
+ self.with_cp = with_cp
+ self.branches = self._make_branches(num_branches, blocks, num_blocks,
+ num_channels)
+ self.fuse_layers = self._make_fuse_layers()
+ self.relu = nn.ReLU(inplace=True)
+
+ @staticmethod
+ def _check_branches(num_branches, num_blocks, in_channels, num_channels):
+ """Check input to avoid ValueError."""
+ if num_branches != len(num_blocks):
+ error_msg = f'NUM_BRANCHES({num_branches}) ' \
+ f'!= NUM_BLOCKS({len(num_blocks)})'
+ raise ValueError(error_msg)
+
+ if num_branches != len(num_channels):
+ error_msg = f'NUM_BRANCHES({num_branches}) ' \
+ f'!= NUM_CHANNELS({len(num_channels)})'
+ raise ValueError(error_msg)
+
+ if num_branches != len(in_channels):
+ error_msg = f'NUM_BRANCHES({num_branches}) ' \
+ f'!= NUM_INCHANNELS({len(in_channels)})'
+ raise ValueError(error_msg)
+
+ def _make_one_branch(self,
+ branch_index,
+ block,
+ num_blocks,
+ num_channels,
+ stride=1):
+ """Make one branch."""
+ downsample = None
+ if stride != 1 or \
+ self.in_channels[branch_index] != \
+ num_channels[branch_index] * get_expansion(block):
+ downsample = nn.Sequential(
+ build_conv_layer(
+ self.conv_cfg,
+ self.in_channels[branch_index],
+ num_channels[branch_index] * get_expansion(block),
+ kernel_size=1,
+ stride=stride,
+ bias=False),
+ build_norm_layer(
+ self.norm_cfg,
+ num_channels[branch_index] * get_expansion(block))[1])
+
+ layers = []
+ layers.append(
+ block(
+ self.in_channels[branch_index],
+ num_channels[branch_index] * get_expansion(block),
+ stride=stride,
+ downsample=downsample,
+ with_cp=self.with_cp,
+ norm_cfg=self.norm_cfg,
+ conv_cfg=self.conv_cfg))
+ self.in_channels[branch_index] = \
+ num_channels[branch_index] * get_expansion(block)
+ for _ in range(1, num_blocks[branch_index]):
+ layers.append(
+ block(
+ self.in_channels[branch_index],
+ num_channels[branch_index] * get_expansion(block),
+ with_cp=self.with_cp,
+ norm_cfg=self.norm_cfg,
+ conv_cfg=self.conv_cfg))
+
+ return nn.Sequential(*layers)
+
+ def _make_branches(self, num_branches, block, num_blocks, num_channels):
+ """Make branches."""
+ branches = []
+
+ for i in range(num_branches):
+ branches.append(
+ self._make_one_branch(i, block, num_blocks, num_channels))
+
+ return nn.ModuleList(branches)
+
+ def _make_fuse_layers(self):
+ """Make fuse layer."""
+ if self.num_branches == 1:
+ return None
+
+ num_branches = self.num_branches
+ in_channels = self.in_channels
+ fuse_layers = []
+ num_out_branches = num_branches if self.multiscale_output else 1
+
+ for i in range(num_out_branches):
+ fuse_layer = []
+ for j in range(num_branches):
+ if j > i:
+ fuse_layer.append(
+ nn.Sequential(
+ build_conv_layer(
+ self.conv_cfg,
+ in_channels[j],
+ in_channels[i],
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ bias=False),
+ build_norm_layer(self.norm_cfg, in_channels[i])[1],
+ nn.Upsample(
+ scale_factor=2**(j - i),
+ mode=self.upsample_cfg['mode'],
+ align_corners=self.
+ upsample_cfg['align_corners'])))
+ elif j == i:
+ fuse_layer.append(None)
+ else:
+ conv_downsamples = []
+ for k in range(i - j):
+ if k == i - j - 1:
+ conv_downsamples.append(
+ nn.Sequential(
+ build_conv_layer(
+ self.conv_cfg,
+ in_channels[j],
+ in_channels[i],
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ bias=False),
+ build_norm_layer(self.norm_cfg,
+ in_channels[i])[1]))
+ else:
+ conv_downsamples.append(
+ nn.Sequential(
+ build_conv_layer(
+ self.conv_cfg,
+ in_channels[j],
+ in_channels[j],
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ bias=False),
+ build_norm_layer(self.norm_cfg,
+ in_channels[j])[1],
+ nn.ReLU(inplace=True)))
+ fuse_layer.append(nn.Sequential(*conv_downsamples))
+ fuse_layers.append(nn.ModuleList(fuse_layer))
+
+ return nn.ModuleList(fuse_layers)
+
+ def forward(self, x):
+ """Forward function."""
+ if self.num_branches == 1:
+ return [self.branches[0](x[0])]
+
+ for i in range(self.num_branches):
+ x[i] = self.branches[i](x[i])
+
+ x_fuse = []
+ for i in range(len(self.fuse_layers)):
+ y = 0
+ for j in range(self.num_branches):
+ if i == j:
+ y += x[j]
+ else:
+ y += self.fuse_layers[i][j](x[j])
+ x_fuse.append(self.relu(y))
+ return x_fuse
+
+
+@MODELS.register_module()
+class HRNet(BaseBackbone):
+ """HRNet backbone.
+
+ `High-Resolution Representations for Labeling Pixels and Regions
+ `__
+
+ Args:
+ extra (dict): detailed configuration for each stage of HRNet.
+ in_channels (int): Number of input image channels. Default: 3.
+ conv_cfg (dict): dictionary to construct and config conv layer.
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed.
+ zero_init_residual (bool): whether to use zero init for last norm layer
+ in resblocks to let them behave as identity.
+ frozen_stages (int): Stages to be frozen (stop grad and set eval mode).
+ -1 means not freezing any parameters. Default: -1.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+
+ Example:
+ >>> from mmpose.models import HRNet
+ >>> import torch
+ >>> extra = dict(
+ >>> stage1=dict(
+ >>> num_modules=1,
+ >>> num_branches=1,
+ >>> block='BOTTLENECK',
+ >>> num_blocks=(4, ),
+ >>> num_channels=(64, )),
+ >>> stage2=dict(
+ >>> num_modules=1,
+ >>> num_branches=2,
+ >>> block='BASIC',
+ >>> num_blocks=(4, 4),
+ >>> num_channels=(32, 64)),
+ >>> stage3=dict(
+ >>> num_modules=4,
+ >>> num_branches=3,
+ >>> block='BASIC',
+ >>> num_blocks=(4, 4, 4),
+ >>> num_channels=(32, 64, 128)),
+ >>> stage4=dict(
+ >>> num_modules=3,
+ >>> num_branches=4,
+ >>> block='BASIC',
+ >>> num_blocks=(4, 4, 4, 4),
+ >>> num_channels=(32, 64, 128, 256)))
+ >>> self = HRNet(extra, in_channels=1)
+ >>> self.eval()
+ >>> inputs = torch.rand(1, 1, 32, 32)
+ >>> level_outputs = self.forward(inputs)
+ >>> for level_out in level_outputs:
+ ... print(tuple(level_out.shape))
+ (1, 32, 8, 8)
+ """
+
+ blocks_dict = {'BASIC': BasicBlock, 'BOTTLENECK': Bottleneck}
+
+ def __init__(
+ self,
+ extra,
+ in_channels=3,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ norm_eval=False,
+ with_cp=False,
+ zero_init_residual=False,
+ frozen_stages=-1,
+ init_cfg=[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(type='Constant', val=1, layer=['_BatchNorm', 'GroupNorm'])
+ ],
+ ):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.extra = extra
+ self.conv_cfg = conv_cfg
+ self.norm_cfg = norm_cfg
+ self.init_cfg = init_cfg
+ self.norm_eval = norm_eval
+ self.with_cp = with_cp
+ self.zero_init_residual = zero_init_residual
+ self.frozen_stages = frozen_stages
+
+ # stem net
+ self.norm1_name, norm1 = build_norm_layer(self.norm_cfg, 64, postfix=1)
+ self.norm2_name, norm2 = build_norm_layer(self.norm_cfg, 64, postfix=2)
+
+ self.conv1 = build_conv_layer(
+ self.conv_cfg,
+ in_channels,
+ 64,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ bias=False)
+
+ self.add_module(self.norm1_name, norm1)
+ self.conv2 = build_conv_layer(
+ self.conv_cfg,
+ 64,
+ 64,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ bias=False)
+
+ self.add_module(self.norm2_name, norm2)
+ self.relu = nn.ReLU(inplace=True)
+
+ self.upsample_cfg = self.extra.get('upsample', {
+ 'mode': 'nearest',
+ 'align_corners': None
+ })
+
+ # stage 1
+ self.stage1_cfg = self.extra['stage1']
+ num_channels = self.stage1_cfg['num_channels'][0]
+ block_type = self.stage1_cfg['block']
+ num_blocks = self.stage1_cfg['num_blocks'][0]
+
+ block = self.blocks_dict[block_type]
+ stage1_out_channels = num_channels * get_expansion(block)
+ self.layer1 = self._make_layer(block, 64, stage1_out_channels,
+ num_blocks)
+
+ # stage 2
+ self.stage2_cfg = self.extra['stage2']
+ num_channels = self.stage2_cfg['num_channels']
+ block_type = self.stage2_cfg['block']
+
+ block = self.blocks_dict[block_type]
+ num_channels = [
+ channel * get_expansion(block) for channel in num_channels
+ ]
+ self.transition1 = self._make_transition_layer([stage1_out_channels],
+ num_channels)
+ self.stage2, pre_stage_channels = self._make_stage(
+ self.stage2_cfg, num_channels)
+
+ # stage 3
+ self.stage3_cfg = self.extra['stage3']
+ num_channels = self.stage3_cfg['num_channels']
+ block_type = self.stage3_cfg['block']
+
+ block = self.blocks_dict[block_type]
+ num_channels = [
+ channel * get_expansion(block) for channel in num_channels
+ ]
+ self.transition2 = self._make_transition_layer(pre_stage_channels,
+ num_channels)
+ self.stage3, pre_stage_channels = self._make_stage(
+ self.stage3_cfg, num_channels)
+
+ # stage 4
+ self.stage4_cfg = self.extra['stage4']
+ num_channels = self.stage4_cfg['num_channels']
+ block_type = self.stage4_cfg['block']
+
+ block = self.blocks_dict[block_type]
+ num_channels = [
+ channel * get_expansion(block) for channel in num_channels
+ ]
+ self.transition3 = self._make_transition_layer(pre_stage_channels,
+ num_channels)
+
+ self.stage4, pre_stage_channels = self._make_stage(
+ self.stage4_cfg,
+ num_channels,
+ multiscale_output=self.stage4_cfg.get('multiscale_output', False))
+
+ self._freeze_stages()
+
+ @property
+ def norm1(self):
+ """nn.Module: the normalization layer named "norm1" """
+ return getattr(self, self.norm1_name)
+
+ @property
+ def norm2(self):
+ """nn.Module: the normalization layer named "norm2" """
+ return getattr(self, self.norm2_name)
+
+ def _make_transition_layer(self, num_channels_pre_layer,
+ num_channels_cur_layer):
+ """Make transition layer."""
+ num_branches_cur = len(num_channels_cur_layer)
+ num_branches_pre = len(num_channels_pre_layer)
+
+ transition_layers = []
+ for i in range(num_branches_cur):
+ if i < num_branches_pre:
+ if num_channels_cur_layer[i] != num_channels_pre_layer[i]:
+ transition_layers.append(
+ nn.Sequential(
+ build_conv_layer(
+ self.conv_cfg,
+ num_channels_pre_layer[i],
+ num_channels_cur_layer[i],
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ bias=False),
+ build_norm_layer(self.norm_cfg,
+ num_channels_cur_layer[i])[1],
+ nn.ReLU(inplace=True)))
+ else:
+ transition_layers.append(None)
+ else:
+ conv_downsamples = []
+ for j in range(i + 1 - num_branches_pre):
+ in_channels = num_channels_pre_layer[-1]
+ out_channels = num_channels_cur_layer[i] \
+ if j == i - num_branches_pre else in_channels
+ conv_downsamples.append(
+ nn.Sequential(
+ build_conv_layer(
+ self.conv_cfg,
+ in_channels,
+ out_channels,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ bias=False),
+ build_norm_layer(self.norm_cfg, out_channels)[1],
+ nn.ReLU(inplace=True)))
+ transition_layers.append(nn.Sequential(*conv_downsamples))
+
+ return nn.ModuleList(transition_layers)
+
+ def _make_layer(self, block, in_channels, out_channels, blocks, stride=1):
+ """Make layer."""
+ downsample = None
+ if stride != 1 or in_channels != out_channels:
+ downsample = nn.Sequential(
+ build_conv_layer(
+ self.conv_cfg,
+ in_channels,
+ out_channels,
+ kernel_size=1,
+ stride=stride,
+ bias=False),
+ build_norm_layer(self.norm_cfg, out_channels)[1])
+
+ layers = []
+ layers.append(
+ block(
+ in_channels,
+ out_channels,
+ stride=stride,
+ downsample=downsample,
+ with_cp=self.with_cp,
+ norm_cfg=self.norm_cfg,
+ conv_cfg=self.conv_cfg))
+ for _ in range(1, blocks):
+ layers.append(
+ block(
+ out_channels,
+ out_channels,
+ with_cp=self.with_cp,
+ norm_cfg=self.norm_cfg,
+ conv_cfg=self.conv_cfg))
+
+ return nn.Sequential(*layers)
+
+ def _make_stage(self, layer_config, in_channels, multiscale_output=True):
+ """Make stage."""
+ num_modules = layer_config['num_modules']
+ num_branches = layer_config['num_branches']
+ num_blocks = layer_config['num_blocks']
+ num_channels = layer_config['num_channels']
+ block = self.blocks_dict[layer_config['block']]
+
+ hr_modules = []
+ for i in range(num_modules):
+ # multi_scale_output is only used for the last module
+ if not multiscale_output and i == num_modules - 1:
+ reset_multiscale_output = False
+ else:
+ reset_multiscale_output = True
+
+ hr_modules.append(
+ HRModule(
+ num_branches,
+ block,
+ num_blocks,
+ in_channels,
+ num_channels,
+ reset_multiscale_output,
+ with_cp=self.with_cp,
+ norm_cfg=self.norm_cfg,
+ conv_cfg=self.conv_cfg,
+ upsample_cfg=self.upsample_cfg))
+
+ in_channels = hr_modules[-1].in_channels
+
+ return nn.Sequential(*hr_modules), in_channels
+
+ def _freeze_stages(self):
+ """Freeze parameters."""
+ if self.frozen_stages >= 0:
+ self.norm1.eval()
+ self.norm2.eval()
+
+ for m in [self.conv1, self.norm1, self.conv2, self.norm2]:
+ for param in m.parameters():
+ param.requires_grad = False
+
+ for i in range(1, self.frozen_stages + 1):
+ if i == 1:
+ m = getattr(self, 'layer1')
+ else:
+ m = getattr(self, f'stage{i}')
+
+ m.eval()
+ for param in m.parameters():
+ param.requires_grad = False
+
+ if i < 4:
+ m = getattr(self, f'transition{i}')
+ m.eval()
+ for param in m.parameters():
+ param.requires_grad = False
+
+ def init_weights(self):
+ """Initialize the weights in backbone."""
+ super(HRNet, self).init_weights()
+
+ if (isinstance(self.init_cfg, dict)
+ and self.init_cfg['type'] == 'Pretrained'):
+ # Suppress zero_init_residual if use pretrained model.
+ return
+
+ if self.zero_init_residual:
+ for m in self.modules():
+ if isinstance(m, Bottleneck):
+ constant_init(m.norm3, 0)
+ elif isinstance(m, BasicBlock):
+ constant_init(m.norm2, 0)
+
+ def forward(self, x):
+ """Forward function."""
+ x = self.conv1(x)
+ x = self.norm1(x)
+ x = self.relu(x)
+ x = self.conv2(x)
+ x = self.norm2(x)
+ x = self.relu(x)
+ x = self.layer1(x)
+
+ x_list = []
+ for i in range(self.stage2_cfg['num_branches']):
+ if self.transition1[i] is not None:
+ x_list.append(self.transition1[i](x))
+ else:
+ x_list.append(x)
+ y_list = self.stage2(x_list)
+
+ x_list = []
+ for i in range(self.stage3_cfg['num_branches']):
+ if self.transition2[i] is not None:
+ x_list.append(self.transition2[i](y_list[-1]))
+ else:
+ x_list.append(y_list[i])
+ y_list = self.stage3(x_list)
+
+ x_list = []
+ for i in range(self.stage4_cfg['num_branches']):
+ if self.transition3[i] is not None:
+ x_list.append(self.transition3[i](y_list[-1]))
+ else:
+ x_list.append(y_list[i])
+ y_list = self.stage4(x_list)
+
+ return tuple(y_list)
+
+ def train(self, mode=True):
+ """Convert the model into training mode."""
+ super().train(mode)
+ self._freeze_stages()
+ if mode and self.norm_eval:
+ for m in self.modules():
+ if isinstance(m, _BatchNorm):
+ m.eval()
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/litehrnet.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/litehrnet.py
new file mode 100644
index 0000000000000000000000000000000000000000..8c07268272245f7b88bfeff573a4d0a788902fae
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/litehrnet.py
@@ -0,0 +1,1005 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+# ------------------------------------------------------------------------------
+# Adapted from https://github.com/HRNet/Lite-HRNet
+# Original licence: Apache License 2.0.
+# ------------------------------------------------------------------------------
+
+import mmengine
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch.utils.checkpoint as cp
+from mmcv.cnn import (ConvModule, DepthwiseSeparableConvModule,
+ build_conv_layer, build_norm_layer)
+from mmengine.model import BaseModule
+from torch.nn.modules.batchnorm import _BatchNorm
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+from .utils import channel_shuffle
+
+
+class SpatialWeighting(BaseModule):
+ """Spatial weighting module.
+
+ Args:
+ channels (int): The channels of the module.
+ ratio (int): channel reduction ratio.
+ conv_cfg (dict): Config dict for convolution layer.
+ Default: None, which means using conv2d.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: None.
+ act_cfg (dict): Config dict for activation layer.
+ Default: (dict(type='ReLU'), dict(type='Sigmoid')).
+ The last ConvModule uses Sigmoid by default.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ channels,
+ ratio=16,
+ conv_cfg=None,
+ norm_cfg=None,
+ act_cfg=(dict(type='ReLU'), dict(type='Sigmoid')),
+ init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+ if isinstance(act_cfg, dict):
+ act_cfg = (act_cfg, act_cfg)
+ assert len(act_cfg) == 2
+ assert mmengine.is_tuple_of(act_cfg, dict)
+ self.global_avgpool = nn.AdaptiveAvgPool2d(1)
+ self.conv1 = ConvModule(
+ in_channels=channels,
+ out_channels=int(channels / ratio),
+ kernel_size=1,
+ stride=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg[0])
+ self.conv2 = ConvModule(
+ in_channels=int(channels / ratio),
+ out_channels=channels,
+ kernel_size=1,
+ stride=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg[1])
+
+ def forward(self, x):
+ out = self.global_avgpool(x)
+ out = self.conv1(out)
+ out = self.conv2(out)
+ return x * out
+
+
+class CrossResolutionWeighting(BaseModule):
+ """Cross-resolution channel weighting module.
+
+ Args:
+ channels (int): The channels of the module.
+ ratio (int): channel reduction ratio.
+ conv_cfg (dict): Config dict for convolution layer.
+ Default: None, which means using conv2d.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: None.
+ act_cfg (dict): Config dict for activation layer.
+ Default: (dict(type='ReLU'), dict(type='Sigmoid')).
+ The last ConvModule uses Sigmoid by default.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ channels,
+ ratio=16,
+ conv_cfg=None,
+ norm_cfg=None,
+ act_cfg=(dict(type='ReLU'), dict(type='Sigmoid')),
+ init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+ if isinstance(act_cfg, dict):
+ act_cfg = (act_cfg, act_cfg)
+ assert len(act_cfg) == 2
+ assert mmengine.is_tuple_of(act_cfg, dict)
+ self.channels = channels
+ total_channel = sum(channels)
+ self.conv1 = ConvModule(
+ in_channels=total_channel,
+ out_channels=int(total_channel / ratio),
+ kernel_size=1,
+ stride=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg[0])
+ self.conv2 = ConvModule(
+ in_channels=int(total_channel / ratio),
+ out_channels=total_channel,
+ kernel_size=1,
+ stride=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg[1])
+
+ def forward(self, x):
+ mini_size = x[-1].size()[-2:]
+ out = [F.adaptive_avg_pool2d(s, mini_size) for s in x[:-1]] + [x[-1]]
+ out = torch.cat(out, dim=1)
+ out = self.conv1(out)
+ out = self.conv2(out)
+ out = torch.split(out, self.channels, dim=1)
+ out = [
+ s * F.interpolate(a, size=s.size()[-2:], mode='nearest')
+ for s, a in zip(x, out)
+ ]
+ return out
+
+
+class ConditionalChannelWeighting(BaseModule):
+ """Conditional channel weighting block.
+
+ Args:
+ in_channels (int): The input channels of the block.
+ stride (int): Stride of the 3x3 convolution layer.
+ reduce_ratio (int): channel reduction ratio.
+ conv_cfg (dict): Config dict for convolution layer.
+ Default: None, which means using conv2d.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='BN').
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ stride,
+ reduce_ratio,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ with_cp=False,
+ init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+ self.with_cp = with_cp
+ self.stride = stride
+ assert stride in [1, 2]
+
+ branch_channels = [channel // 2 for channel in in_channels]
+
+ self.cross_resolution_weighting = CrossResolutionWeighting(
+ branch_channels,
+ ratio=reduce_ratio,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg)
+
+ self.depthwise_convs = nn.ModuleList([
+ ConvModule(
+ channel,
+ channel,
+ kernel_size=3,
+ stride=self.stride,
+ padding=1,
+ groups=channel,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=None) for channel in branch_channels
+ ])
+
+ self.spatial_weighting = nn.ModuleList([
+ SpatialWeighting(channels=channel, ratio=4)
+ for channel in branch_channels
+ ])
+
+ def forward(self, x):
+
+ def _inner_forward(x):
+ x = [s.chunk(2, dim=1) for s in x]
+ x1 = [s[0] for s in x]
+ x2 = [s[1] for s in x]
+
+ x2 = self.cross_resolution_weighting(x2)
+ x2 = [dw(s) for s, dw in zip(x2, self.depthwise_convs)]
+ x2 = [sw(s) for s, sw in zip(x2, self.spatial_weighting)]
+
+ out = [torch.cat([s1, s2], dim=1) for s1, s2 in zip(x1, x2)]
+ out = [channel_shuffle(s, 2) for s in out]
+
+ return out
+
+ if self.with_cp and x.requires_grad:
+ out = cp.checkpoint(_inner_forward, x)
+ else:
+ out = _inner_forward(x)
+
+ return out
+
+
+class Stem(BaseModule):
+ """Stem network block.
+
+ Args:
+ in_channels (int): The input channels of the block.
+ stem_channels (int): Output channels of the stem layer.
+ out_channels (int): The output channels of the block.
+ expand_ratio (int): adjusts number of channels of the hidden layer
+ in InvertedResidual by this amount.
+ conv_cfg (dict): Config dict for convolution layer.
+ Default: None, which means using conv2d.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='BN').
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ stem_channels,
+ out_channels,
+ expand_ratio,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ with_cp=False,
+ init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+ self.conv_cfg = conv_cfg
+ self.norm_cfg = norm_cfg
+ self.with_cp = with_cp
+
+ self.conv1 = ConvModule(
+ in_channels=in_channels,
+ out_channels=stem_channels,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ act_cfg=dict(type='ReLU'))
+
+ mid_channels = int(round(stem_channels * expand_ratio))
+ branch_channels = stem_channels // 2
+ if stem_channels == self.out_channels:
+ inc_channels = self.out_channels - branch_channels
+ else:
+ inc_channels = self.out_channels - stem_channels
+
+ self.branch1 = nn.Sequential(
+ ConvModule(
+ branch_channels,
+ branch_channels,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ groups=branch_channels,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=None),
+ ConvModule(
+ branch_channels,
+ inc_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=dict(type='ReLU')),
+ )
+
+ self.expand_conv = ConvModule(
+ branch_channels,
+ mid_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=dict(type='ReLU'))
+ self.depthwise_conv = ConvModule(
+ mid_channels,
+ mid_channels,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ groups=mid_channels,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=None)
+ self.linear_conv = ConvModule(
+ mid_channels,
+ branch_channels
+ if stem_channels == self.out_channels else stem_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=dict(type='ReLU'))
+
+ def forward(self, x):
+
+ def _inner_forward(x):
+ x = self.conv1(x)
+ x1, x2 = x.chunk(2, dim=1)
+
+ x2 = self.expand_conv(x2)
+ x2 = self.depthwise_conv(x2)
+ x2 = self.linear_conv(x2)
+
+ out = torch.cat((self.branch1(x1), x2), dim=1)
+
+ out = channel_shuffle(out, 2)
+
+ return out
+
+ if self.with_cp and x.requires_grad:
+ out = cp.checkpoint(_inner_forward, x)
+ else:
+ out = _inner_forward(x)
+
+ return out
+
+
+class IterativeHead(BaseModule):
+ """Extra iterative head for feature learning.
+
+ Args:
+ in_channels (int): The input channels of the block.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='BN').
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self, in_channels, norm_cfg=dict(type='BN'), init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+ projects = []
+ num_branchs = len(in_channels)
+ self.in_channels = in_channels[::-1]
+
+ for i in range(num_branchs):
+ if i != num_branchs - 1:
+ projects.append(
+ DepthwiseSeparableConvModule(
+ in_channels=self.in_channels[i],
+ out_channels=self.in_channels[i + 1],
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ norm_cfg=norm_cfg,
+ act_cfg=dict(type='ReLU'),
+ dw_act_cfg=None,
+ pw_act_cfg=dict(type='ReLU')))
+ else:
+ projects.append(
+ DepthwiseSeparableConvModule(
+ in_channels=self.in_channels[i],
+ out_channels=self.in_channels[i],
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ norm_cfg=norm_cfg,
+ act_cfg=dict(type='ReLU'),
+ dw_act_cfg=None,
+ pw_act_cfg=dict(type='ReLU')))
+ self.projects = nn.ModuleList(projects)
+
+ def forward(self, x):
+ x = x[::-1]
+
+ y = []
+ last_x = None
+ for i, s in enumerate(x):
+ if last_x is not None:
+ last_x = F.interpolate(
+ last_x,
+ size=s.size()[-2:],
+ mode='bilinear',
+ align_corners=True)
+ s = s + last_x
+ s = self.projects[i](s)
+ y.append(s)
+ last_x = s
+
+ return y[::-1]
+
+
+class ShuffleUnit(BaseModule):
+ """InvertedResidual block for ShuffleNetV2 backbone.
+
+ Args:
+ in_channels (int): The input channels of the block.
+ out_channels (int): The output channels of the block.
+ stride (int): Stride of the 3x3 convolution layer. Default: 1
+ conv_cfg (dict): Config dict for convolution layer.
+ Default: None, which means using conv2d.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='BN').
+ act_cfg (dict): Config dict for activation layer.
+ Default: dict(type='ReLU').
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ stride=1,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ act_cfg=dict(type='ReLU'),
+ with_cp=False,
+ init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+ self.stride = stride
+ self.with_cp = with_cp
+
+ branch_features = out_channels // 2
+ if self.stride == 1:
+ assert in_channels == branch_features * 2, (
+ f'in_channels ({in_channels}) should equal to '
+ f'branch_features * 2 ({branch_features * 2}) '
+ 'when stride is 1')
+
+ if in_channels != branch_features * 2:
+ assert self.stride != 1, (
+ f'stride ({self.stride}) should not equal 1 when '
+ f'in_channels != branch_features * 2')
+
+ if self.stride > 1:
+ self.branch1 = nn.Sequential(
+ ConvModule(
+ in_channels,
+ in_channels,
+ kernel_size=3,
+ stride=self.stride,
+ padding=1,
+ groups=in_channels,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=None),
+ ConvModule(
+ in_channels,
+ branch_features,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg),
+ )
+
+ self.branch2 = nn.Sequential(
+ ConvModule(
+ in_channels if (self.stride > 1) else branch_features,
+ branch_features,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg),
+ ConvModule(
+ branch_features,
+ branch_features,
+ kernel_size=3,
+ stride=self.stride,
+ padding=1,
+ groups=branch_features,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=None),
+ ConvModule(
+ branch_features,
+ branch_features,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg))
+
+ def forward(self, x):
+
+ def _inner_forward(x):
+ if self.stride > 1:
+ out = torch.cat((self.branch1(x), self.branch2(x)), dim=1)
+ else:
+ x1, x2 = x.chunk(2, dim=1)
+ out = torch.cat((x1, self.branch2(x2)), dim=1)
+
+ out = channel_shuffle(out, 2)
+
+ return out
+
+ if self.with_cp and x.requires_grad:
+ out = cp.checkpoint(_inner_forward, x)
+ else:
+ out = _inner_forward(x)
+
+ return out
+
+
+class LiteHRModule(BaseModule):
+ """High-Resolution Module for LiteHRNet.
+
+ It contains conditional channel weighting blocks and
+ shuffle blocks.
+
+
+ Args:
+ num_branches (int): Number of branches in the module.
+ num_blocks (int): Number of blocks in the module.
+ in_channels (list(int)): Number of input image channels.
+ reduce_ratio (int): Channel reduction ratio.
+ module_type (str): 'LITE' or 'NAIVE'
+ multiscale_output (bool): Whether to output multi-scale features.
+ with_fuse (bool): Whether to use fuse layers.
+ conv_cfg (dict): dictionary to construct and config conv layer.
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ num_branches,
+ num_blocks,
+ in_channels,
+ reduce_ratio,
+ module_type,
+ multiscale_output=False,
+ with_fuse=True,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ with_cp=False,
+ init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+ self._check_branches(num_branches, in_channels)
+
+ self.in_channels = in_channels
+ self.num_branches = num_branches
+
+ self.module_type = module_type
+ self.multiscale_output = multiscale_output
+ self.with_fuse = with_fuse
+ self.norm_cfg = norm_cfg
+ self.conv_cfg = conv_cfg
+ self.with_cp = with_cp
+
+ if self.module_type.upper() == 'LITE':
+ self.layers = self._make_weighting_blocks(num_blocks, reduce_ratio)
+ elif self.module_type.upper() == 'NAIVE':
+ self.layers = self._make_naive_branches(num_branches, num_blocks)
+ else:
+ raise ValueError("module_type should be either 'LITE' or 'NAIVE'.")
+ if self.with_fuse:
+ self.fuse_layers = self._make_fuse_layers()
+ self.relu = nn.ReLU()
+
+ def _check_branches(self, num_branches, in_channels):
+ """Check input to avoid ValueError."""
+ if num_branches != len(in_channels):
+ error_msg = f'NUM_BRANCHES({num_branches}) ' \
+ f'!= NUM_INCHANNELS({len(in_channels)})'
+ raise ValueError(error_msg)
+
+ def _make_weighting_blocks(self, num_blocks, reduce_ratio, stride=1):
+ """Make channel weighting blocks."""
+ layers = []
+ for i in range(num_blocks):
+ layers.append(
+ ConditionalChannelWeighting(
+ self.in_channels,
+ stride=stride,
+ reduce_ratio=reduce_ratio,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ with_cp=self.with_cp))
+
+ return nn.Sequential(*layers)
+
+ def _make_one_branch(self, branch_index, num_blocks, stride=1):
+ """Make one branch."""
+ layers = []
+ layers.append(
+ ShuffleUnit(
+ self.in_channels[branch_index],
+ self.in_channels[branch_index],
+ stride=stride,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ act_cfg=dict(type='ReLU'),
+ with_cp=self.with_cp))
+ for i in range(1, num_blocks):
+ layers.append(
+ ShuffleUnit(
+ self.in_channels[branch_index],
+ self.in_channels[branch_index],
+ stride=1,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ act_cfg=dict(type='ReLU'),
+ with_cp=self.with_cp))
+
+ return nn.Sequential(*layers)
+
+ def _make_naive_branches(self, num_branches, num_blocks):
+ """Make branches."""
+ branches = []
+
+ for i in range(num_branches):
+ branches.append(self._make_one_branch(i, num_blocks))
+
+ return nn.ModuleList(branches)
+
+ def _make_fuse_layers(self):
+ """Make fuse layer."""
+ if self.num_branches == 1:
+ return None
+
+ num_branches = self.num_branches
+ in_channels = self.in_channels
+ fuse_layers = []
+ num_out_branches = num_branches if self.multiscale_output else 1
+ for i in range(num_out_branches):
+ fuse_layer = []
+ for j in range(num_branches):
+ if j > i:
+ fuse_layer.append(
+ nn.Sequential(
+ build_conv_layer(
+ self.conv_cfg,
+ in_channels[j],
+ in_channels[i],
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ bias=False),
+ build_norm_layer(self.norm_cfg, in_channels[i])[1],
+ nn.Upsample(
+ scale_factor=2**(j - i), mode='nearest')))
+ elif j == i:
+ fuse_layer.append(None)
+ else:
+ conv_downsamples = []
+ for k in range(i - j):
+ if k == i - j - 1:
+ conv_downsamples.append(
+ nn.Sequential(
+ build_conv_layer(
+ self.conv_cfg,
+ in_channels[j],
+ in_channels[j],
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ groups=in_channels[j],
+ bias=False),
+ build_norm_layer(self.norm_cfg,
+ in_channels[j])[1],
+ build_conv_layer(
+ self.conv_cfg,
+ in_channels[j],
+ in_channels[i],
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ bias=False),
+ build_norm_layer(self.norm_cfg,
+ in_channels[i])[1]))
+ else:
+ conv_downsamples.append(
+ nn.Sequential(
+ build_conv_layer(
+ self.conv_cfg,
+ in_channels[j],
+ in_channels[j],
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ groups=in_channels[j],
+ bias=False),
+ build_norm_layer(self.norm_cfg,
+ in_channels[j])[1],
+ build_conv_layer(
+ self.conv_cfg,
+ in_channels[j],
+ in_channels[j],
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ bias=False),
+ build_norm_layer(self.norm_cfg,
+ in_channels[j])[1],
+ nn.ReLU(inplace=True)))
+ fuse_layer.append(nn.Sequential(*conv_downsamples))
+ fuse_layers.append(nn.ModuleList(fuse_layer))
+
+ return nn.ModuleList(fuse_layers)
+
+ def forward(self, x):
+ """Forward function."""
+ if self.num_branches == 1:
+ return [self.layers[0](x[0])]
+
+ if self.module_type.upper() == 'LITE':
+ out = self.layers(x)
+ elif self.module_type.upper() == 'NAIVE':
+ for i in range(self.num_branches):
+ x[i] = self.layers[i](x[i])
+ out = x
+
+ if self.with_fuse:
+ out_fuse = []
+ for i in range(len(self.fuse_layers)):
+ # `y = 0` will lead to decreased accuracy (0.5~1 mAP)
+ y = out[0] if i == 0 else self.fuse_layers[i][0](out[0])
+ for j in range(self.num_branches):
+ if i == j:
+ y += out[j]
+ else:
+ y += self.fuse_layers[i][j](out[j])
+ out_fuse.append(self.relu(y))
+ out = out_fuse
+ if not self.multiscale_output:
+ out = [out[0]]
+ return out
+
+
+@MODELS.register_module()
+class LiteHRNet(BaseBackbone):
+ """Lite-HRNet backbone.
+
+ `Lite-HRNet: A Lightweight High-Resolution Network
+ `_.
+
+ Code adapted from 'https://github.com/HRNet/Lite-HRNet'.
+
+ Args:
+ extra (dict): detailed configuration for each stage of HRNet.
+ in_channels (int): Number of input image channels. Default: 3.
+ conv_cfg (dict): dictionary to construct and config conv layer.
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+
+ Example:
+ >>> from mmpose.models import LiteHRNet
+ >>> import torch
+ >>> extra=dict(
+ >>> stem=dict(stem_channels=32, out_channels=32, expand_ratio=1),
+ >>> num_stages=3,
+ >>> stages_spec=dict(
+ >>> num_modules=(2, 4, 2),
+ >>> num_branches=(2, 3, 4),
+ >>> num_blocks=(2, 2, 2),
+ >>> module_type=('LITE', 'LITE', 'LITE'),
+ >>> with_fuse=(True, True, True),
+ >>> reduce_ratios=(8, 8, 8),
+ >>> num_channels=(
+ >>> (40, 80),
+ >>> (40, 80, 160),
+ >>> (40, 80, 160, 320),
+ >>> )),
+ >>> with_head=False)
+ >>> self = LiteHRNet(extra, in_channels=1)
+ >>> self.eval()
+ >>> inputs = torch.rand(1, 1, 32, 32)
+ >>> level_outputs = self.forward(inputs)
+ >>> for level_out in level_outputs:
+ ... print(tuple(level_out.shape))
+ (1, 40, 8, 8)
+ """
+
+ def __init__(self,
+ extra,
+ in_channels=3,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ norm_eval=False,
+ with_cp=False,
+ init_cfg=[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]):
+ super().__init__(init_cfg=init_cfg)
+ self.extra = extra
+ self.conv_cfg = conv_cfg
+ self.norm_cfg = norm_cfg
+ self.norm_eval = norm_eval
+ self.with_cp = with_cp
+
+ self.stem = Stem(
+ in_channels,
+ stem_channels=self.extra['stem']['stem_channels'],
+ out_channels=self.extra['stem']['out_channels'],
+ expand_ratio=self.extra['stem']['expand_ratio'],
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg)
+
+ self.num_stages = self.extra['num_stages']
+ self.stages_spec = self.extra['stages_spec']
+
+ num_channels_last = [
+ self.stem.out_channels,
+ ]
+ for i in range(self.num_stages):
+ num_channels = self.stages_spec['num_channels'][i]
+ num_channels = [num_channels[i] for i in range(len(num_channels))]
+ setattr(
+ self, f'transition{i}',
+ self._make_transition_layer(num_channels_last, num_channels))
+
+ stage, num_channels_last = self._make_stage(
+ self.stages_spec, i, num_channels, multiscale_output=True)
+ setattr(self, f'stage{i}', stage)
+
+ self.with_head = self.extra['with_head']
+ if self.with_head:
+ self.head_layer = IterativeHead(
+ in_channels=num_channels_last,
+ norm_cfg=self.norm_cfg,
+ )
+
+ def _make_transition_layer(self, num_channels_pre_layer,
+ num_channels_cur_layer):
+ """Make transition layer."""
+ num_branches_cur = len(num_channels_cur_layer)
+ num_branches_pre = len(num_channels_pre_layer)
+
+ transition_layers = []
+ for i in range(num_branches_cur):
+ if i < num_branches_pre:
+ if num_channels_cur_layer[i] != num_channels_pre_layer[i]:
+ transition_layers.append(
+ nn.Sequential(
+ build_conv_layer(
+ self.conv_cfg,
+ num_channels_pre_layer[i],
+ num_channels_pre_layer[i],
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ groups=num_channels_pre_layer[i],
+ bias=False),
+ build_norm_layer(self.norm_cfg,
+ num_channels_pre_layer[i])[1],
+ build_conv_layer(
+ self.conv_cfg,
+ num_channels_pre_layer[i],
+ num_channels_cur_layer[i],
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ bias=False),
+ build_norm_layer(self.norm_cfg,
+ num_channels_cur_layer[i])[1],
+ nn.ReLU()))
+ else:
+ transition_layers.append(None)
+ else:
+ conv_downsamples = []
+ for j in range(i + 1 - num_branches_pre):
+ in_channels = num_channels_pre_layer[-1]
+ out_channels = num_channels_cur_layer[i] \
+ if j == i - num_branches_pre else in_channels
+ conv_downsamples.append(
+ nn.Sequential(
+ build_conv_layer(
+ self.conv_cfg,
+ in_channels,
+ in_channels,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ groups=in_channels,
+ bias=False),
+ build_norm_layer(self.norm_cfg, in_channels)[1],
+ build_conv_layer(
+ self.conv_cfg,
+ in_channels,
+ out_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ bias=False),
+ build_norm_layer(self.norm_cfg, out_channels)[1],
+ nn.ReLU()))
+ transition_layers.append(nn.Sequential(*conv_downsamples))
+
+ return nn.ModuleList(transition_layers)
+
+ def _make_stage(self,
+ stages_spec,
+ stage_index,
+ in_channels,
+ multiscale_output=True):
+ num_modules = stages_spec['num_modules'][stage_index]
+ num_branches = stages_spec['num_branches'][stage_index]
+ num_blocks = stages_spec['num_blocks'][stage_index]
+ reduce_ratio = stages_spec['reduce_ratios'][stage_index]
+ with_fuse = stages_spec['with_fuse'][stage_index]
+ module_type = stages_spec['module_type'][stage_index]
+
+ modules = []
+ for i in range(num_modules):
+ # multi_scale_output is only used last module
+ if not multiscale_output and i == num_modules - 1:
+ reset_multiscale_output = False
+ else:
+ reset_multiscale_output = True
+
+ modules.append(
+ LiteHRModule(
+ num_branches,
+ num_blocks,
+ in_channels,
+ reduce_ratio,
+ module_type,
+ multiscale_output=reset_multiscale_output,
+ with_fuse=with_fuse,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ with_cp=self.with_cp))
+ in_channels = modules[-1].in_channels
+
+ return nn.Sequential(*modules), in_channels
+
+ def forward(self, x):
+ """Forward function."""
+ x = self.stem(x)
+
+ y_list = [x]
+ for i in range(self.num_stages):
+ x_list = []
+ transition = getattr(self, f'transition{i}')
+ for j in range(self.stages_spec['num_branches'][i]):
+ if transition[j]:
+ if j >= len(y_list):
+ x_list.append(transition[j](y_list[-1]))
+ else:
+ x_list.append(transition[j](y_list[j]))
+ else:
+ x_list.append(y_list[j])
+ y_list = getattr(self, f'stage{i}')(x_list)
+
+ x = y_list
+ if self.with_head:
+ x = self.head_layer(x)
+
+ return (x[0], )
+
+ def train(self, mode=True):
+ """Convert the model into training mode."""
+ super().train(mode)
+ if mode and self.norm_eval:
+ for m in self.modules():
+ if isinstance(m, _BatchNorm):
+ m.eval()
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/mobilenet_v2.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/mobilenet_v2.py
new file mode 100644
index 0000000000000000000000000000000000000000..fae9f1e293b9d357c57a9642686016342c813110
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/mobilenet_v2.py
@@ -0,0 +1,284 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+
+import torch.nn as nn
+import torch.utils.checkpoint as cp
+from mmcv.cnn import ConvModule
+from mmengine.model import BaseModule
+from torch.nn.modules.batchnorm import _BatchNorm
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+from .utils import make_divisible
+
+
+class InvertedResidual(BaseModule):
+ """InvertedResidual block for MobileNetV2.
+
+ Args:
+ in_channels (int): The input channels of the InvertedResidual block.
+ out_channels (int): The output channels of the InvertedResidual block.
+ stride (int): Stride of the middle (first) 3x3 convolution.
+ expand_ratio (int): adjusts number of channels of the hidden layer
+ in InvertedResidual by this amount.
+ conv_cfg (dict): Config dict for convolution layer.
+ Default: None, which means using conv2d.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='BN').
+ act_cfg (dict): Config dict for activation layer.
+ Default: dict(type='ReLU6').
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ stride,
+ expand_ratio,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ act_cfg=dict(type='ReLU6'),
+ with_cp=False,
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ act_cfg = copy.deepcopy(act_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.stride = stride
+ assert stride in [1, 2], f'stride must in [1, 2]. ' \
+ f'But received {stride}.'
+ self.with_cp = with_cp
+ self.use_res_connect = self.stride == 1 and in_channels == out_channels
+ hidden_dim = int(round(in_channels * expand_ratio))
+
+ layers = []
+ if expand_ratio != 1:
+ layers.append(
+ ConvModule(
+ in_channels=in_channels,
+ out_channels=hidden_dim,
+ kernel_size=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg))
+ layers.extend([
+ ConvModule(
+ in_channels=hidden_dim,
+ out_channels=hidden_dim,
+ kernel_size=3,
+ stride=stride,
+ padding=1,
+ groups=hidden_dim,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg),
+ ConvModule(
+ in_channels=hidden_dim,
+ out_channels=out_channels,
+ kernel_size=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=None)
+ ])
+ self.conv = nn.Sequential(*layers)
+
+ def forward(self, x):
+
+ def _inner_forward(x):
+ if self.use_res_connect:
+ return x + self.conv(x)
+ return self.conv(x)
+
+ if self.with_cp and x.requires_grad:
+ out = cp.checkpoint(_inner_forward, x)
+ else:
+ out = _inner_forward(x)
+
+ return out
+
+
+@MODELS.register_module()
+class MobileNetV2(BaseBackbone):
+ """MobileNetV2 backbone.
+
+ Args:
+ widen_factor (float): Width multiplier, multiply number of
+ channels in each layer by this amount. Default: 1.0.
+ out_indices (None or Sequence[int]): Output from which stages.
+ Default: (7, ).
+ frozen_stages (int): Stages to be frozen (all param fixed).
+ Default: -1, which means not freezing any parameters.
+ conv_cfg (dict): Config dict for convolution layer.
+ Default: None, which means using conv2d.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='BN').
+ act_cfg (dict): Config dict for activation layer.
+ Default: dict(type='ReLU6').
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False.
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+ """
+
+ # Parameters to build layers. 4 parameters are needed to construct a
+ # layer, from left to right: expand_ratio, channel, num_blocks, stride.
+ arch_settings = [[1, 16, 1, 1], [6, 24, 2, 2], [6, 32, 3, 2],
+ [6, 64, 4, 2], [6, 96, 3, 1], [6, 160, 3, 2],
+ [6, 320, 1, 1]]
+
+ def __init__(self,
+ widen_factor=1.,
+ out_indices=(7, ),
+ frozen_stages=-1,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ act_cfg=dict(type='ReLU6'),
+ norm_eval=False,
+ with_cp=False,
+ init_cfg=[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ act_cfg = copy.deepcopy(act_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.widen_factor = widen_factor
+ self.out_indices = out_indices
+ for index in out_indices:
+ if index not in range(0, 8):
+ raise ValueError('the item in out_indices must in '
+ f'range(0, 8). But received {index}')
+
+ if frozen_stages not in range(-1, 8):
+ raise ValueError('frozen_stages must be in range(-1, 8). '
+ f'But received {frozen_stages}')
+ self.out_indices = out_indices
+ self.frozen_stages = frozen_stages
+ self.conv_cfg = conv_cfg
+ self.norm_cfg = norm_cfg
+ self.act_cfg = act_cfg
+ self.norm_eval = norm_eval
+ self.with_cp = with_cp
+
+ self.in_channels = make_divisible(32 * widen_factor, 8)
+
+ self.conv1 = ConvModule(
+ in_channels=3,
+ out_channels=self.in_channels,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ act_cfg=self.act_cfg)
+
+ self.layers = []
+
+ for i, layer_cfg in enumerate(self.arch_settings):
+ expand_ratio, channel, num_blocks, stride = layer_cfg
+ out_channels = make_divisible(channel * widen_factor, 8)
+ inverted_res_layer = self.make_layer(
+ out_channels=out_channels,
+ num_blocks=num_blocks,
+ stride=stride,
+ expand_ratio=expand_ratio)
+ layer_name = f'layer{i + 1}'
+ self.add_module(layer_name, inverted_res_layer)
+ self.layers.append(layer_name)
+
+ if widen_factor > 1.0:
+ self.out_channel = int(1280 * widen_factor)
+ else:
+ self.out_channel = 1280
+
+ layer = ConvModule(
+ in_channels=self.in_channels,
+ out_channels=self.out_channel,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ act_cfg=self.act_cfg)
+ self.add_module('conv2', layer)
+ self.layers.append('conv2')
+
+ def make_layer(self, out_channels, num_blocks, stride, expand_ratio):
+ """Stack InvertedResidual blocks to build a layer for MobileNetV2.
+
+ Args:
+ out_channels (int): out_channels of block.
+ num_blocks (int): number of blocks.
+ stride (int): stride of the first block. Default: 1
+ expand_ratio (int): Expand the number of channels of the
+ hidden layer in InvertedResidual by this ratio. Default: 6.
+ """
+ layers = []
+ for i in range(num_blocks):
+ if i >= 1:
+ stride = 1
+ layers.append(
+ InvertedResidual(
+ self.in_channels,
+ out_channels,
+ stride,
+ expand_ratio=expand_ratio,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ act_cfg=self.act_cfg,
+ with_cp=self.with_cp))
+ self.in_channels = out_channels
+
+ return nn.Sequential(*layers)
+
+ def forward(self, x):
+ x = self.conv1(x)
+
+ outs = []
+ for i, layer_name in enumerate(self.layers):
+ layer = getattr(self, layer_name)
+ x = layer(x)
+ if i in self.out_indices:
+ outs.append(x)
+
+ return tuple(outs)
+
+ def _freeze_stages(self):
+ if self.frozen_stages >= 0:
+ for param in self.conv1.parameters():
+ param.requires_grad = False
+ for i in range(1, self.frozen_stages + 1):
+ layer = getattr(self, f'layer{i}')
+ layer.eval()
+ for param in layer.parameters():
+ param.requires_grad = False
+
+ def train(self, mode=True):
+ super().train(mode)
+ self._freeze_stages()
+ if mode and self.norm_eval:
+ for m in self.modules():
+ if isinstance(m, _BatchNorm):
+ m.eval()
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/mobilenet_v3.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/mobilenet_v3.py
new file mode 100644
index 0000000000000000000000000000000000000000..575cdcd1750714415835675160de345e8a0e3062
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/mobilenet_v3.py
@@ -0,0 +1,190 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+
+from mmcv.cnn import ConvModule
+from torch.nn.modules.batchnorm import _BatchNorm
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+from .utils import InvertedResidual
+
+
+@MODELS.register_module()
+class MobileNetV3(BaseBackbone):
+ """MobileNetV3 backbone.
+
+ Args:
+ arch (str): Architecture of mobilnetv3, from {small, big}.
+ Default: small.
+ conv_cfg (dict): Config dict for convolution layer.
+ Default: None, which means using conv2d.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='BN').
+ out_indices (None or Sequence[int]): Output from which stages.
+ Default: (-1, ), which means output tensors from final stage.
+ frozen_stages (int): Stages to be frozen (all param fixed).
+ Default: -1, which means not freezing any parameters.
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False.
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save
+ some memory while slowing down the training speed.
+ Default: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm'])
+ ]``
+ """
+ # Parameters to build each block:
+ # [kernel size, mid channels, out channels, with_se, act type, stride]
+ arch_settings = {
+ 'small': [[3, 16, 16, True, 'ReLU', 2],
+ [3, 72, 24, False, 'ReLU', 2],
+ [3, 88, 24, False, 'ReLU', 1],
+ [5, 96, 40, True, 'HSwish', 2],
+ [5, 240, 40, True, 'HSwish', 1],
+ [5, 240, 40, True, 'HSwish', 1],
+ [5, 120, 48, True, 'HSwish', 1],
+ [5, 144, 48, True, 'HSwish', 1],
+ [5, 288, 96, True, 'HSwish', 2],
+ [5, 576, 96, True, 'HSwish', 1],
+ [5, 576, 96, True, 'HSwish', 1]],
+ 'big': [[3, 16, 16, False, 'ReLU', 1],
+ [3, 64, 24, False, 'ReLU', 2],
+ [3, 72, 24, False, 'ReLU', 1],
+ [5, 72, 40, True, 'ReLU', 2],
+ [5, 120, 40, True, 'ReLU', 1],
+ [5, 120, 40, True, 'ReLU', 1],
+ [3, 240, 80, False, 'HSwish', 2],
+ [3, 200, 80, False, 'HSwish', 1],
+ [3, 184, 80, False, 'HSwish', 1],
+ [3, 184, 80, False, 'HSwish', 1],
+ [3, 480, 112, True, 'HSwish', 1],
+ [3, 672, 112, True, 'HSwish', 1],
+ [5, 672, 160, True, 'HSwish', 1],
+ [5, 672, 160, True, 'HSwish', 2],
+ [5, 960, 160, True, 'HSwish', 1]]
+ } # yapf: disable
+
+ def __init__(self,
+ arch='small',
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ out_indices=(-1, ),
+ frozen_stages=-1,
+ norm_eval=False,
+ with_cp=False,
+ init_cfg=[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(type='Constant', val=1, layer=['_BatchNorm'])
+ ]):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ assert arch in self.arch_settings
+ for index in out_indices:
+ if index not in range(-len(self.arch_settings[arch]),
+ len(self.arch_settings[arch])):
+ raise ValueError('the item in out_indices must in '
+ f'range(0, {len(self.arch_settings[arch])}). '
+ f'But received {index}')
+
+ if frozen_stages not in range(-1, len(self.arch_settings[arch])):
+ raise ValueError('frozen_stages must be in range(-1, '
+ f'{len(self.arch_settings[arch])}). '
+ f'But received {frozen_stages}')
+ self.arch = arch
+ self.conv_cfg = conv_cfg
+ self.norm_cfg = norm_cfg
+ self.out_indices = out_indices
+ self.frozen_stages = frozen_stages
+ self.norm_eval = norm_eval
+ self.with_cp = with_cp
+
+ self.in_channels = 16
+ self.conv1 = ConvModule(
+ in_channels=3,
+ out_channels=self.in_channels,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=dict(type='HSwish'))
+
+ self.layers = self._make_layer()
+ self.feat_dim = self.arch_settings[arch][-1][2]
+
+ def _make_layer(self):
+ layers = []
+ layer_setting = self.arch_settings[self.arch]
+ for i, params in enumerate(layer_setting):
+ (kernel_size, mid_channels, out_channels, with_se, act,
+ stride) = params
+ if with_se:
+ se_cfg = dict(
+ channels=mid_channels,
+ ratio=4,
+ act_cfg=(dict(type='ReLU'),
+ dict(type='HSigmoid', bias=1.0, divisor=2.0)))
+ else:
+ se_cfg = None
+
+ layer = InvertedResidual(
+ in_channels=self.in_channels,
+ out_channels=out_channels,
+ mid_channels=mid_channels,
+ kernel_size=kernel_size,
+ stride=stride,
+ se_cfg=se_cfg,
+ with_expand_conv=True,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ act_cfg=dict(type=act),
+ with_cp=self.with_cp)
+ self.in_channels = out_channels
+ layer_name = f'layer{i + 1}'
+ self.add_module(layer_name, layer)
+ layers.append(layer_name)
+ return layers
+
+ def forward(self, x):
+ x = self.conv1(x)
+
+ outs = []
+ for i, layer_name in enumerate(self.layers):
+ layer = getattr(self, layer_name)
+ x = layer(x)
+ if i in self.out_indices or \
+ i - len(self.layers) in self.out_indices:
+ outs.append(x)
+
+ return tuple(outs)
+
+ def _freeze_stages(self):
+ if self.frozen_stages >= 0:
+ for param in self.conv1.parameters():
+ param.requires_grad = False
+ for i in range(1, self.frozen_stages + 1):
+ layer = getattr(self, f'layer{i}')
+ layer.eval()
+ for param in layer.parameters():
+ param.requires_grad = False
+
+ def train(self, mode=True):
+ super().train(mode)
+ self._freeze_stages()
+ if mode and self.norm_eval:
+ for m in self.modules():
+ if isinstance(m, _BatchNorm):
+ m.eval()
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/mspn.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/mspn.py
new file mode 100644
index 0000000000000000000000000000000000000000..99e6c3dfd4d3e0500fbaedbd27c7c4f0b25d489d
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/mspn.py
@@ -0,0 +1,546 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy as cp
+from collections import OrderedDict
+
+import torch.nn as nn
+import torch.nn.functional as F
+from mmcv.cnn import ConvModule, MaxPool2d
+from mmengine.model import BaseModule
+from mmengine.runner import load_state_dict
+
+from mmpose.registry import MODELS
+from mmpose.utils import get_root_logger
+from .base_backbone import BaseBackbone
+from .resnet import Bottleneck as _Bottleneck
+from .utils import get_state_dict
+
+
+class Bottleneck(_Bottleneck):
+ expansion = 4
+ """Bottleneck block for MSPN.
+
+ Args:
+ in_channels (int): Input channels of this block.
+ out_channels (int): Output channels of this block.
+ stride (int): stride of the block. Default: 1
+ downsample (nn.Module): downsample operation on identity branch.
+ Default: None
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self, in_channels, out_channels, **kwargs):
+ super().__init__(in_channels, out_channels * 4, **kwargs)
+
+
+class DownsampleModule(BaseModule):
+ """Downsample module for MSPN.
+
+ Args:
+ block (nn.Module): Downsample block.
+ num_blocks (list): Number of blocks in each downsample unit.
+ num_units (int): Numbers of downsample units. Default: 4
+ has_skip (bool): Have skip connections from prior upsample
+ module or not. Default:False
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ in_channels (int): Number of channels of the input feature to
+ downsample module. Default: 64
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ block,
+ num_blocks,
+ num_units=4,
+ has_skip=False,
+ norm_cfg=dict(type='BN'),
+ in_channels=64,
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = cp.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.has_skip = has_skip
+ self.in_channels = in_channels
+ assert len(num_blocks) == num_units
+ self.num_blocks = num_blocks
+ self.num_units = num_units
+ self.norm_cfg = norm_cfg
+ self.layer1 = self._make_layer(block, in_channels, num_blocks[0])
+ for i in range(1, num_units):
+ module_name = f'layer{i + 1}'
+ self.add_module(
+ module_name,
+ self._make_layer(
+ block, in_channels * pow(2, i), num_blocks[i], stride=2))
+
+ def _make_layer(self, block, out_channels, blocks, stride=1):
+ downsample = None
+ if stride != 1 or self.in_channels != out_channels * block.expansion:
+ downsample = ConvModule(
+ self.in_channels,
+ out_channels * block.expansion,
+ kernel_size=1,
+ stride=stride,
+ padding=0,
+ norm_cfg=self.norm_cfg,
+ act_cfg=None,
+ inplace=True)
+
+ units = list()
+ units.append(
+ block(
+ self.in_channels,
+ out_channels,
+ stride=stride,
+ downsample=downsample,
+ norm_cfg=self.norm_cfg))
+ self.in_channels = out_channels * block.expansion
+ for _ in range(1, blocks):
+ units.append(block(self.in_channels, out_channels))
+
+ return nn.Sequential(*units)
+
+ def forward(self, x, skip1, skip2):
+ out = list()
+ for i in range(self.num_units):
+ module_name = f'layer{i + 1}'
+ module_i = getattr(self, module_name)
+ x = module_i(x)
+ if self.has_skip:
+ x = x + skip1[i] + skip2[i]
+ out.append(x)
+ out.reverse()
+
+ return tuple(out)
+
+
+class UpsampleUnit(BaseModule):
+ """Upsample unit for upsample module.
+
+ Args:
+ ind (int): Indicates whether to interpolate (>0) and whether to
+ generate feature map for the next hourglass-like module.
+ num_units (int): Number of units that form a upsample module. Along
+ with ind and gen_cross_conv, nm_units is used to decide whether
+ to generate feature map for the next hourglass-like module.
+ in_channels (int): Channel number of the skip-in feature maps from
+ the corresponding downsample unit.
+ unit_channels (int): Channel number in this unit. Default:256.
+ gen_skip: (bool): Whether or not to generate skips for the posterior
+ downsample module. Default:False
+ gen_cross_conv (bool): Whether to generate feature map for the next
+ hourglass-like module. Default:False
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ out_channels (int): Number of channels of feature output by upsample
+ module. Must equal to in_channels of downsample module. Default:64
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ ind,
+ num_units,
+ in_channels,
+ unit_channels=256,
+ gen_skip=False,
+ gen_cross_conv=False,
+ norm_cfg=dict(type='BN'),
+ out_channels=64,
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = cp.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.num_units = num_units
+ self.norm_cfg = norm_cfg
+ self.in_skip = ConvModule(
+ in_channels,
+ unit_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ norm_cfg=self.norm_cfg,
+ act_cfg=None,
+ inplace=True)
+ self.relu = nn.ReLU(inplace=True)
+
+ self.ind = ind
+ if self.ind > 0:
+ self.up_conv = ConvModule(
+ unit_channels,
+ unit_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ norm_cfg=self.norm_cfg,
+ act_cfg=None,
+ inplace=True)
+
+ self.gen_skip = gen_skip
+ if self.gen_skip:
+ self.out_skip1 = ConvModule(
+ in_channels,
+ in_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ norm_cfg=self.norm_cfg,
+ inplace=True)
+
+ self.out_skip2 = ConvModule(
+ unit_channels,
+ in_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ norm_cfg=self.norm_cfg,
+ inplace=True)
+
+ self.gen_cross_conv = gen_cross_conv
+ if self.ind == num_units - 1 and self.gen_cross_conv:
+ self.cross_conv = ConvModule(
+ unit_channels,
+ out_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ norm_cfg=self.norm_cfg,
+ inplace=True)
+
+ def forward(self, x, up_x):
+ out = self.in_skip(x)
+
+ if self.ind > 0:
+ up_x = F.interpolate(
+ up_x,
+ size=(x.size(2), x.size(3)),
+ mode='bilinear',
+ align_corners=True)
+ up_x = self.up_conv(up_x)
+ out = out + up_x
+ out = self.relu(out)
+
+ skip1 = None
+ skip2 = None
+ if self.gen_skip:
+ skip1 = self.out_skip1(x)
+ skip2 = self.out_skip2(out)
+
+ cross_conv = None
+ if self.ind == self.num_units - 1 and self.gen_cross_conv:
+ cross_conv = self.cross_conv(out)
+
+ return out, skip1, skip2, cross_conv
+
+
+class UpsampleModule(BaseModule):
+ """Upsample module for MSPN.
+
+ Args:
+ unit_channels (int): Channel number in the upsample units.
+ Default:256.
+ num_units (int): Numbers of upsample units. Default: 4
+ gen_skip (bool): Whether to generate skip for posterior downsample
+ module or not. Default:False
+ gen_cross_conv (bool): Whether to generate feature map for the next
+ hourglass-like module. Default:False
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ out_channels (int): Number of channels of feature output by upsample
+ module. Must equal to in_channels of downsample module. Default:64
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ unit_channels=256,
+ num_units=4,
+ gen_skip=False,
+ gen_cross_conv=False,
+ norm_cfg=dict(type='BN'),
+ out_channels=64,
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = cp.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.in_channels = list()
+ for i in range(num_units):
+ self.in_channels.append(Bottleneck.expansion * out_channels *
+ pow(2, i))
+ self.in_channels.reverse()
+ self.num_units = num_units
+ self.gen_skip = gen_skip
+ self.gen_cross_conv = gen_cross_conv
+ self.norm_cfg = norm_cfg
+ for i in range(num_units):
+ module_name = f'up{i + 1}'
+ self.add_module(
+ module_name,
+ UpsampleUnit(
+ i,
+ self.num_units,
+ self.in_channels[i],
+ unit_channels,
+ self.gen_skip,
+ self.gen_cross_conv,
+ norm_cfg=self.norm_cfg,
+ out_channels=64))
+
+ def forward(self, x):
+ out = list()
+ skip1 = list()
+ skip2 = list()
+ cross_conv = None
+ for i in range(self.num_units):
+ module_i = getattr(self, f'up{i + 1}')
+ if i == 0:
+ outi, skip1_i, skip2_i, _ = module_i(x[i], None)
+ elif i == self.num_units - 1:
+ outi, skip1_i, skip2_i, cross_conv = module_i(x[i], out[i - 1])
+ else:
+ outi, skip1_i, skip2_i, _ = module_i(x[i], out[i - 1])
+ out.append(outi)
+ skip1.append(skip1_i)
+ skip2.append(skip2_i)
+ skip1.reverse()
+ skip2.reverse()
+
+ return out, skip1, skip2, cross_conv
+
+
+class SingleStageNetwork(BaseModule):
+ """Single_stage Network.
+
+ Args:
+ unit_channels (int): Channel number in the upsample units. Default:256.
+ num_units (int): Numbers of downsample/upsample units. Default: 4
+ gen_skip (bool): Whether to generate skip for posterior downsample
+ module or not. Default:False
+ gen_cross_conv (bool): Whether to generate feature map for the next
+ hourglass-like module. Default:False
+ has_skip (bool): Have skip connections from prior upsample
+ module or not. Default:False
+ num_blocks (list): Number of blocks in each downsample unit.
+ Default: [2, 2, 2, 2] Note: Make sure num_units==len(num_blocks)
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ in_channels (int): Number of channels of the feature from ResNetTop.
+ Default: 64.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ has_skip=False,
+ gen_skip=False,
+ gen_cross_conv=False,
+ unit_channels=256,
+ num_units=4,
+ num_blocks=[2, 2, 2, 2],
+ norm_cfg=dict(type='BN'),
+ in_channels=64,
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = cp.deepcopy(norm_cfg)
+ num_blocks = cp.deepcopy(num_blocks)
+ super().__init__(init_cfg=init_cfg)
+ assert len(num_blocks) == num_units
+ self.has_skip = has_skip
+ self.gen_skip = gen_skip
+ self.gen_cross_conv = gen_cross_conv
+ self.num_units = num_units
+ self.unit_channels = unit_channels
+ self.num_blocks = num_blocks
+ self.norm_cfg = norm_cfg
+
+ self.downsample = DownsampleModule(Bottleneck, num_blocks, num_units,
+ has_skip, norm_cfg, in_channels)
+ self.upsample = UpsampleModule(unit_channels, num_units, gen_skip,
+ gen_cross_conv, norm_cfg, in_channels)
+
+ def forward(self, x, skip1, skip2):
+ mid = self.downsample(x, skip1, skip2)
+ out, skip1, skip2, cross_conv = self.upsample(mid)
+
+ return out, skip1, skip2, cross_conv
+
+
+class ResNetTop(BaseModule):
+ """ResNet top for MSPN.
+
+ Args:
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ channels (int): Number of channels of the feature output by ResNetTop.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self, norm_cfg=dict(type='BN'), channels=64, init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = cp.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.top = nn.Sequential(
+ ConvModule(
+ 3,
+ channels,
+ kernel_size=7,
+ stride=2,
+ padding=3,
+ norm_cfg=norm_cfg,
+ inplace=True), MaxPool2d(kernel_size=3, stride=2, padding=1))
+
+ def forward(self, img):
+ return self.top(img)
+
+
+@MODELS.register_module()
+class MSPN(BaseBackbone):
+ """MSPN backbone. Paper ref: Li et al. "Rethinking on Multi-Stage Networks
+ for Human Pose Estimation" (CVPR 2020).
+
+ Args:
+ unit_channels (int): Number of Channels in an upsample unit.
+ Default: 256
+ num_stages (int): Number of stages in a multi-stage MSPN. Default: 4
+ num_units (int): Number of downsample/upsample units in a single-stage
+ network. Default: 4
+ Note: Make sure num_units == len(self.num_blocks)
+ num_blocks (list): Number of bottlenecks in each
+ downsample unit. Default: [2, 2, 2, 2]
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ res_top_channels (int): Number of channels of feature from ResNetTop.
+ Default: 64.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm']),
+ dict(
+ type='Normal',
+ std=0.01,
+ layer=['Linear']),
+ ]``
+
+ Example:
+ >>> from mmpose.models import MSPN
+ >>> import torch
+ >>> self = MSPN(num_stages=2,num_units=2,num_blocks=[2,2])
+ >>> self.eval()
+ >>> inputs = torch.rand(1, 3, 511, 511)
+ >>> level_outputs = self.forward(inputs)
+ >>> for level_output in level_outputs:
+ ... for feature in level_output:
+ ... print(tuple(feature.shape))
+ ...
+ (1, 256, 64, 64)
+ (1, 256, 128, 128)
+ (1, 256, 64, 64)
+ (1, 256, 128, 128)
+ """
+
+ def __init__(self,
+ unit_channels=256,
+ num_stages=4,
+ num_units=4,
+ num_blocks=[2, 2, 2, 2],
+ norm_cfg=dict(type='BN'),
+ res_top_channels=64,
+ init_cfg=[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm']),
+ dict(type='Normal', std=0.01, layer=['Linear']),
+ ]):
+ # Protect mutable default arguments
+ norm_cfg = cp.deepcopy(norm_cfg)
+ num_blocks = cp.deepcopy(num_blocks)
+ super().__init__(init_cfg=init_cfg)
+ self.unit_channels = unit_channels
+ self.num_stages = num_stages
+ self.num_units = num_units
+ self.num_blocks = num_blocks
+ self.norm_cfg = norm_cfg
+
+ assert self.num_stages > 0
+ assert self.num_units > 1
+ assert self.num_units == len(self.num_blocks)
+ self.top = ResNetTop(norm_cfg=norm_cfg)
+ self.multi_stage_mspn = nn.ModuleList([])
+ for i in range(self.num_stages):
+ if i == 0:
+ has_skip = False
+ else:
+ has_skip = True
+ if i != self.num_stages - 1:
+ gen_skip = True
+ gen_cross_conv = True
+ else:
+ gen_skip = False
+ gen_cross_conv = False
+ self.multi_stage_mspn.append(
+ SingleStageNetwork(has_skip, gen_skip, gen_cross_conv,
+ unit_channels, num_units, num_blocks,
+ norm_cfg, res_top_channels))
+
+ def forward(self, x):
+ """Model forward function."""
+ out_feats = []
+ skip1 = None
+ skip2 = None
+ x = self.top(x)
+ for i in range(self.num_stages):
+ out, skip1, skip2, x = self.multi_stage_mspn[i](x, skip1, skip2)
+ out_feats.append(out)
+
+ return out_feats
+
+ def init_weights(self):
+ """Initialize model weights."""
+ if (isinstance(self.init_cfg, dict)
+ and self.init_cfg['type'] == 'Pretrained'):
+ logger = get_root_logger()
+ state_dict_tmp = get_state_dict(self.init_cfg['checkpoint'])
+ state_dict = OrderedDict()
+ state_dict['top'] = OrderedDict()
+ state_dict['bottlenecks'] = OrderedDict()
+ for k, v in state_dict_tmp.items():
+ if k.startswith('layer'):
+ if 'downsample.0' in k:
+ state_dict['bottlenecks'][k.replace(
+ 'downsample.0', 'downsample.conv')] = v
+ elif 'downsample.1' in k:
+ state_dict['bottlenecks'][k.replace(
+ 'downsample.1', 'downsample.bn')] = v
+ else:
+ state_dict['bottlenecks'][k] = v
+ elif k.startswith('conv1'):
+ state_dict['top'][k.replace('conv1', 'top.0.conv')] = v
+ elif k.startswith('bn1'):
+ state_dict['top'][k.replace('bn1', 'top.0.bn')] = v
+
+ load_state_dict(
+ self.top, state_dict['top'], strict=False, logger=logger)
+ for i in range(self.num_stages):
+ load_state_dict(
+ self.multi_stage_mspn[i].downsample,
+ state_dict['bottlenecks'],
+ strict=False,
+ logger=logger)
+ else:
+ super(MSPN, self).init_weights()
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/pvt.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/pvt.py
new file mode 100644
index 0000000000000000000000000000000000000000..cd235dbc5e1328fb63401d8d9707e296fbc78c4c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/pvt.py
@@ -0,0 +1,574 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import warnings
+
+import numpy as np
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from mmcv.cnn import Conv2d, build_activation_layer, build_norm_layer
+from mmcv.cnn.bricks.drop import build_dropout
+from mmcv.cnn.bricks.transformer import MultiheadAttention
+from mmengine.model import BaseModule, ModuleList, Sequential
+from mmengine.model.weight_init import trunc_normal_
+from mmengine.runner import load_state_dict
+from mmengine.utils import to_2tuple
+
+from mmpose.registry import MODELS
+from ...utils import get_root_logger
+from ..utils import PatchEmbed, nchw_to_nlc, nlc_to_nchw, pvt_convert
+from .utils import get_state_dict
+
+
+class MixFFN(BaseModule):
+ """An implementation of MixFFN of PVT.
+
+ The differences between MixFFN & FFN:
+ 1. Use 1X1 Conv to replace Linear layer.
+ 2. Introduce 3X3 Depth-wise Conv to encode positional information.
+
+ Args:
+ embed_dims (int): The feature dimension. Same as
+ `MultiheadAttention`.
+ feedforward_channels (int): The hidden dimension of FFNs.
+ act_cfg (dict, optional): The activation config for FFNs.
+ Default: dict(type='GELU').
+ ffn_drop (float, optional): Probability of an element to be
+ zeroed in FFN. Default 0.0.
+ dropout_layer (obj:`ConfigDict`): The dropout_layer used
+ when adding the shortcut.
+ Default: None.
+ use_conv (bool): If True, add 3x3 DWConv between two Linear layers.
+ Defaults: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ embed_dims,
+ feedforward_channels,
+ act_cfg=dict(type='GELU'),
+ ffn_drop=0.,
+ dropout_layer=None,
+ use_conv=False,
+ init_cfg=None):
+ super(MixFFN, self).__init__(init_cfg=init_cfg)
+
+ self.embed_dims = embed_dims
+ self.feedforward_channels = feedforward_channels
+ self.act_cfg = act_cfg
+ activate = build_activation_layer(act_cfg)
+
+ in_channels = embed_dims
+ fc1 = Conv2d(
+ in_channels=in_channels,
+ out_channels=feedforward_channels,
+ kernel_size=1,
+ stride=1,
+ bias=True)
+ if use_conv:
+ # 3x3 depth wise conv to provide positional encode information
+ dw_conv = Conv2d(
+ in_channels=feedforward_channels,
+ out_channels=feedforward_channels,
+ kernel_size=3,
+ stride=1,
+ padding=(3 - 1) // 2,
+ bias=True,
+ groups=feedforward_channels)
+ fc2 = Conv2d(
+ in_channels=feedforward_channels,
+ out_channels=in_channels,
+ kernel_size=1,
+ stride=1,
+ bias=True)
+ drop = nn.Dropout(ffn_drop)
+ layers = [fc1, activate, drop, fc2, drop]
+ if use_conv:
+ layers.insert(1, dw_conv)
+ self.layers = Sequential(*layers)
+ self.dropout_layer = build_dropout(
+ dropout_layer) if dropout_layer else torch.nn.Identity()
+
+ def forward(self, x, hw_shape, identity=None):
+ out = nlc_to_nchw(x, hw_shape)
+ out = self.layers(out)
+ out = nchw_to_nlc(out)
+ if identity is None:
+ identity = x
+ return identity + self.dropout_layer(out)
+
+
+class SpatialReductionAttention(MultiheadAttention):
+ """An implementation of Spatial Reduction Attention of PVT.
+
+ This module is modified from MultiheadAttention which is a module from
+ mmcv.cnn.bricks.transformer.
+
+ Args:
+ embed_dims (int): The embedding dimension.
+ num_heads (int): Parallel attention heads.
+ attn_drop (float): A Dropout layer on attn_output_weights.
+ Default: 0.0.
+ proj_drop (float): A Dropout layer after `nn.MultiheadAttention`.
+ Default: 0.0.
+ dropout_layer (obj:`ConfigDict`): The dropout_layer used
+ when adding the shortcut. Default: None.
+ batch_first (bool): Key, Query and Value are shape of
+ (batch, n, embed_dim)
+ or (n, batch, embed_dim). Default: False.
+ qkv_bias (bool): enable bias for qkv if True. Default: True.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='LN').
+ sr_ratio (int): The ratio of spatial reduction of Spatial Reduction
+ Attention of PVT. Default: 1.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ embed_dims,
+ num_heads,
+ attn_drop=0.,
+ proj_drop=0.,
+ dropout_layer=None,
+ batch_first=True,
+ qkv_bias=True,
+ norm_cfg=dict(type='LN'),
+ sr_ratio=1,
+ init_cfg=None):
+ super().__init__(
+ embed_dims,
+ num_heads,
+ attn_drop,
+ proj_drop,
+ batch_first=batch_first,
+ dropout_layer=dropout_layer,
+ bias=qkv_bias,
+ init_cfg=init_cfg)
+
+ self.sr_ratio = sr_ratio
+ if sr_ratio > 1:
+ self.sr = Conv2d(
+ in_channels=embed_dims,
+ out_channels=embed_dims,
+ kernel_size=sr_ratio,
+ stride=sr_ratio)
+ # The ret[0] of build_norm_layer is norm name.
+ self.norm = build_norm_layer(norm_cfg, embed_dims)[1]
+
+ # handle the BC-breaking from https://github.com/open-mmlab/mmcv/pull/1418 # noqa
+ from mmpose import digit_version, mmcv_version
+ if mmcv_version < digit_version('1.3.17'):
+ warnings.warn('The legacy version of forward function in'
+ 'SpatialReductionAttention is deprecated in'
+ 'mmcv>=1.3.17 and will no longer support in the'
+ 'future. Please upgrade your mmcv.')
+ self.forward = self.legacy_forward
+
+ def forward(self, x, hw_shape, identity=None):
+
+ x_q = x
+ if self.sr_ratio > 1:
+ x_kv = nlc_to_nchw(x, hw_shape)
+ x_kv = self.sr(x_kv)
+ x_kv = nchw_to_nlc(x_kv)
+ x_kv = self.norm(x_kv)
+ else:
+ x_kv = x
+
+ if identity is None:
+ identity = x_q
+
+ # Because the dataflow('key', 'query', 'value') of
+ # ``torch.nn.MultiheadAttention`` is (num_query, batch,
+ # embed_dims), We should adjust the shape of dataflow from
+ # batch_first (batch, num_query, embed_dims) to num_query_first
+ # (num_query ,batch, embed_dims), and recover ``attn_output``
+ # from num_query_first to batch_first.
+ if self.batch_first:
+ x_q = x_q.transpose(0, 1)
+ x_kv = x_kv.transpose(0, 1)
+
+ out = self.attn(query=x_q, key=x_kv, value=x_kv)[0]
+
+ if self.batch_first:
+ out = out.transpose(0, 1)
+
+ return identity + self.dropout_layer(self.proj_drop(out))
+
+ def legacy_forward(self, x, hw_shape, identity=None):
+ """multi head attention forward in mmcv version < 1.3.17."""
+ x_q = x
+ if self.sr_ratio > 1:
+ x_kv = nlc_to_nchw(x, hw_shape)
+ x_kv = self.sr(x_kv)
+ x_kv = nchw_to_nlc(x_kv)
+ x_kv = self.norm(x_kv)
+ else:
+ x_kv = x
+
+ if identity is None:
+ identity = x_q
+
+ out = self.attn(query=x_q, key=x_kv, value=x_kv)[0]
+
+ return identity + self.dropout_layer(self.proj_drop(out))
+
+
+class PVTEncoderLayer(BaseModule):
+ """Implements one encoder layer in PVT.
+
+ Args:
+ embed_dims (int): The feature dimension.
+ num_heads (int): Parallel attention heads.
+ feedforward_channels (int): The hidden dimension for FFNs.
+ drop_rate (float): Probability of an element to be zeroed.
+ after the feed forward layer. Default: 0.0.
+ attn_drop_rate (float): The drop out rate for attention layer.
+ Default: 0.0.
+ drop_path_rate (float): stochastic depth rate. Default: 0.0.
+ qkv_bias (bool): enable bias for qkv if True.
+ Default: True.
+ act_cfg (dict): The activation config for FFNs.
+ Default: dict(type='GELU').
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='LN').
+ sr_ratio (int): The ratio of spatial reduction of Spatial Reduction
+ Attention of PVT. Default: 1.
+ use_conv_ffn (bool): If True, use Convolutional FFN to replace FFN.
+ Default: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ embed_dims,
+ num_heads,
+ feedforward_channels,
+ drop_rate=0.,
+ attn_drop_rate=0.,
+ drop_path_rate=0.,
+ qkv_bias=True,
+ act_cfg=dict(type='GELU'),
+ norm_cfg=dict(type='LN'),
+ sr_ratio=1,
+ use_conv_ffn=False,
+ init_cfg=None):
+ super(PVTEncoderLayer, self).__init__(init_cfg=init_cfg)
+
+ # The ret[0] of build_norm_layer is norm name.
+ self.norm1 = build_norm_layer(norm_cfg, embed_dims)[1]
+
+ self.attn = SpatialReductionAttention(
+ embed_dims=embed_dims,
+ num_heads=num_heads,
+ attn_drop=attn_drop_rate,
+ proj_drop=drop_rate,
+ dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate),
+ qkv_bias=qkv_bias,
+ norm_cfg=norm_cfg,
+ sr_ratio=sr_ratio)
+
+ # The ret[0] of build_norm_layer is norm name.
+ self.norm2 = build_norm_layer(norm_cfg, embed_dims)[1]
+
+ self.ffn = MixFFN(
+ embed_dims=embed_dims,
+ feedforward_channels=feedforward_channels,
+ ffn_drop=drop_rate,
+ dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate),
+ use_conv=use_conv_ffn,
+ act_cfg=act_cfg)
+
+ def forward(self, x, hw_shape):
+ x = self.attn(self.norm1(x), hw_shape, identity=x)
+ x = self.ffn(self.norm2(x), hw_shape, identity=x)
+
+ return x
+
+
+class AbsolutePositionEmbedding(BaseModule):
+ """An implementation of the absolute position embedding in PVT.
+
+ Args:
+ pos_shape (int): The shape of the absolute position embedding.
+ pos_dim (int): The dimension of the absolute position embedding.
+ drop_rate (float): Probability of an element to be zeroed.
+ Default: 0.0.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None.
+ """
+
+ def __init__(self, pos_shape, pos_dim, drop_rate=0., init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+
+ if isinstance(pos_shape, int):
+ pos_shape = to_2tuple(pos_shape)
+ elif isinstance(pos_shape, tuple):
+ if len(pos_shape) == 1:
+ pos_shape = to_2tuple(pos_shape[0])
+ assert len(pos_shape) == 2, \
+ f'The size of image should have length 1 or 2, ' \
+ f'but got {len(pos_shape)}'
+ self.pos_shape = pos_shape
+ self.pos_dim = pos_dim
+
+ self.pos_embed = nn.Parameter(
+ torch.zeros(1, pos_shape[0] * pos_shape[1], pos_dim))
+ self.drop = nn.Dropout(p=drop_rate)
+
+ def init_weights(self):
+ trunc_normal_(self.pos_embed, std=0.02)
+
+ def resize_pos_embed(self, pos_embed, input_shape, mode='bilinear'):
+ """Resize pos_embed weights.
+
+ Resize pos_embed using bilinear interpolate method.
+
+ Args:
+ pos_embed (torch.Tensor): Position embedding weights.
+ input_shape (tuple): Tuple for (downsampled input image height,
+ downsampled input image width).
+ mode (str): Algorithm used for upsampling:
+ ``'nearest'`` | ``'linear'`` | ``'bilinear'`` | ``'bicubic'`` |
+ ``'trilinear'``. Default: ``'bilinear'``.
+
+ Return:
+ torch.Tensor: The resized pos_embed of shape [B, L_new, C].
+ """
+ assert pos_embed.ndim == 3, 'shape of pos_embed must be [B, L, C]'
+ pos_h, pos_w = self.pos_shape
+ pos_embed_weight = pos_embed[:, (-1 * pos_h * pos_w):]
+ pos_embed_weight = pos_embed_weight.reshape(
+ 1, pos_h, pos_w, self.pos_dim).permute(0, 3, 1, 2).contiguous()
+ pos_embed_weight = F.interpolate(
+ pos_embed_weight, size=input_shape, mode=mode)
+ pos_embed_weight = torch.flatten(pos_embed_weight,
+ 2).transpose(1, 2).contiguous()
+ pos_embed = pos_embed_weight
+
+ return pos_embed
+
+ def forward(self, x, hw_shape, mode='bilinear'):
+ pos_embed = self.resize_pos_embed(self.pos_embed, hw_shape, mode)
+ return self.drop(x + pos_embed)
+
+
+@MODELS.register_module()
+class PyramidVisionTransformer(BaseModule):
+ """Pyramid Vision Transformer (PVT)
+
+ Implementation of `Pyramid Vision Transformer: A Versatile Backbone for
+ Dense Prediction without Convolutions
+ `_.
+
+ Args:
+ pretrain_img_size (int | tuple[int]): The size of input image when
+ pretrain. Defaults: 224.
+ in_channels (int): Number of input channels. Default: 3.
+ embed_dims (int): Embedding dimension. Default: 64.
+ num_stags (int): The num of stages. Default: 4.
+ num_layers (Sequence[int]): The layer number of each transformer encode
+ layer. Default: [3, 4, 6, 3].
+ num_heads (Sequence[int]): The attention heads of each transformer
+ encode layer. Default: [1, 2, 5, 8].
+ patch_sizes (Sequence[int]): The patch_size of each patch embedding.
+ Default: [4, 2, 2, 2].
+ strides (Sequence[int]): The stride of each patch embedding.
+ Default: [4, 2, 2, 2].
+ paddings (Sequence[int]): The padding of each patch embedding.
+ Default: [0, 0, 0, 0].
+ sr_ratios (Sequence[int]): The spatial reduction rate of each
+ transformer encode layer. Default: [8, 4, 2, 1].
+ out_indices (Sequence[int] | int): Output from which stages.
+ Default: (0, 1, 2, 3).
+ mlp_ratios (Sequence[int]): The ratio of the mlp hidden dim to the
+ embedding dim of each transformer encode layer.
+ Default: [8, 8, 4, 4].
+ qkv_bias (bool): Enable bias for qkv if True. Default: True.
+ drop_rate (float): Probability of an element to be zeroed.
+ Default 0.0.
+ attn_drop_rate (float): The drop out rate for attention layer.
+ Default 0.0.
+ drop_path_rate (float): stochastic depth rate. Default 0.1.
+ use_abs_pos_embed (bool): If True, add absolute position embedding to
+ the patch embedding. Defaults: True.
+ use_conv_ffn (bool): If True, use Convolutional FFN to replace FFN.
+ Default: False.
+ act_cfg (dict): The activation config for FFNs.
+ Default: dict(type='GELU').
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='LN').
+ pretrained (str, optional): model pretrained path. Default: None.
+ convert_weights (bool): The flag indicates whether the
+ pre-trained model is from the original repo. We may need
+ to convert some keys to make it compatible.
+ Default: True.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='TruncNormal', std=.02, layer=['Linear']),
+ dict(type='Constant', val=1, layer=['LayerNorm']),
+ dict(type='Normal', std=0.01, layer=['Conv2d'])
+ ]``
+ """
+
+ def __init__(self,
+ pretrain_img_size=224,
+ in_channels=3,
+ embed_dims=64,
+ num_stages=4,
+ num_layers=[3, 4, 6, 3],
+ num_heads=[1, 2, 5, 8],
+ patch_sizes=[4, 2, 2, 2],
+ strides=[4, 2, 2, 2],
+ paddings=[0, 0, 0, 0],
+ sr_ratios=[8, 4, 2, 1],
+ out_indices=(0, 1, 2, 3),
+ mlp_ratios=[8, 8, 4, 4],
+ qkv_bias=True,
+ drop_rate=0.,
+ attn_drop_rate=0.,
+ drop_path_rate=0.1,
+ use_abs_pos_embed=True,
+ norm_after_stage=False,
+ use_conv_ffn=False,
+ act_cfg=dict(type='GELU'),
+ norm_cfg=dict(type='LN', eps=1e-6),
+ convert_weights=True,
+ init_cfg=[
+ dict(type='TruncNormal', std=.02, layer=['Linear']),
+ dict(type='Constant', val=1, layer=['LayerNorm']),
+ dict(type='Kaiming', layer=['Conv2d'])
+ ]):
+ super().__init__(init_cfg=init_cfg)
+
+ self.convert_weights = convert_weights
+ if isinstance(pretrain_img_size, int):
+ pretrain_img_size = to_2tuple(pretrain_img_size)
+ elif isinstance(pretrain_img_size, tuple):
+ if len(pretrain_img_size) == 1:
+ pretrain_img_size = to_2tuple(pretrain_img_size[0])
+ assert len(pretrain_img_size) == 2, \
+ f'The size of image should have length 1 or 2, ' \
+ f'but got {len(pretrain_img_size)}'
+
+ self.embed_dims = embed_dims
+
+ self.num_stages = num_stages
+ self.num_layers = num_layers
+ self.num_heads = num_heads
+ self.patch_sizes = patch_sizes
+ self.strides = strides
+ self.sr_ratios = sr_ratios
+ assert num_stages == len(num_layers) == len(num_heads) \
+ == len(patch_sizes) == len(strides) == len(sr_ratios)
+
+ self.out_indices = out_indices
+ assert max(out_indices) < self.num_stages
+
+ # transformer encoder
+ dpr = [
+ x.item()
+ for x in torch.linspace(0, drop_path_rate, sum(num_layers))
+ ] # stochastic num_layer decay rule
+
+ cur = 0
+ self.layers = ModuleList()
+ for i, num_layer in enumerate(num_layers):
+ embed_dims_i = embed_dims * num_heads[i]
+ patch_embed = PatchEmbed(
+ in_channels=in_channels,
+ embed_dims=embed_dims_i,
+ kernel_size=patch_sizes[i],
+ stride=strides[i],
+ padding=paddings[i],
+ bias=True,
+ norm_cfg=norm_cfg)
+
+ layers = ModuleList()
+ if use_abs_pos_embed:
+ pos_shape = pretrain_img_size // np.prod(patch_sizes[:i + 1])
+ pos_embed = AbsolutePositionEmbedding(
+ pos_shape=pos_shape,
+ pos_dim=embed_dims_i,
+ drop_rate=drop_rate)
+ layers.append(pos_embed)
+ layers.extend([
+ PVTEncoderLayer(
+ embed_dims=embed_dims_i,
+ num_heads=num_heads[i],
+ feedforward_channels=mlp_ratios[i] * embed_dims_i,
+ drop_rate=drop_rate,
+ attn_drop_rate=attn_drop_rate,
+ drop_path_rate=dpr[cur + idx],
+ qkv_bias=qkv_bias,
+ act_cfg=act_cfg,
+ norm_cfg=norm_cfg,
+ sr_ratio=sr_ratios[i],
+ use_conv_ffn=use_conv_ffn) for idx in range(num_layer)
+ ])
+ in_channels = embed_dims_i
+ # The ret[0] of build_norm_layer is norm name.
+ if norm_after_stage:
+ norm = build_norm_layer(norm_cfg, embed_dims_i)[1]
+ else:
+ norm = nn.Identity()
+ self.layers.append(ModuleList([patch_embed, layers, norm]))
+ cur += num_layer
+
+ def init_weights(self):
+ """Initialize the weights in backbone."""
+
+ if (isinstance(self.init_cfg, dict)
+ and self.init_cfg['type'] == 'Pretrained'):
+ logger = get_root_logger()
+ state_dict = get_state_dict(
+ self.init_cfg['checkpoint'], map_location='cpu')
+ logger.warn(f'Load pre-trained model for '
+ f'{self.__class__.__name__} from original repo')
+
+ if self.convert_weights:
+ # Because pvt backbones are not supported by mmcls,
+ # so we need to convert pre-trained weights to match this
+ # implementation.
+ state_dict = pvt_convert(state_dict)
+ load_state_dict(self, state_dict, strict=False, logger=logger)
+
+ else:
+ super(PyramidVisionTransformer, self).init_weights()
+
+ def forward(self, x):
+ outs = []
+
+ for i, layer in enumerate(self.layers):
+ x, hw_shape = layer[0](x)
+
+ for block in layer[1]:
+ x = block(x, hw_shape)
+ x = layer[2](x)
+ x = nlc_to_nchw(x, hw_shape)
+ if i in self.out_indices:
+ outs.append(x)
+
+ return outs
+
+
+@MODELS.register_module()
+class PyramidVisionTransformerV2(PyramidVisionTransformer):
+ """Implementation of `PVTv2: Improved Baselines with Pyramid Vision
+ Transformer `_."""
+
+ def __init__(self, **kwargs):
+ super(PyramidVisionTransformerV2, self).__init__(
+ patch_sizes=[7, 3, 3, 3],
+ paddings=[3, 1, 1, 1],
+ use_abs_pos_embed=False,
+ norm_after_stage=True,
+ use_conv_ffn=True,
+ **kwargs)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/regnet.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/regnet.py
new file mode 100644
index 0000000000000000000000000000000000000000..2d975c088aef468a0c9c792ae140a995217a09a7
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/regnet.py
@@ -0,0 +1,336 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+
+import numpy as np
+import torch.nn as nn
+from mmcv.cnn import build_conv_layer, build_norm_layer
+
+from mmpose.registry import MODELS
+from .resnet import ResNet
+from .resnext import Bottleneck
+
+
+@MODELS.register_module()
+class RegNet(ResNet):
+ """RegNet backbone.
+
+ More details can be found in `paper `__ .
+
+ Args:
+ arch (dict): The parameter of RegNets.
+ - w0 (int): initial width
+ - wa (float): slope of width
+ - wm (float): quantization parameter to quantize the width
+ - depth (int): depth of the backbone
+ - group_w (int): width of group
+ - bot_mul (float): bottleneck ratio, i.e. expansion of bottleneck.
+ strides (Sequence[int]): Strides of the first block of each stage.
+ base_channels (int): Base channels after stem layer.
+ in_channels (int): Number of input image channels. Default: 3.
+ dilations (Sequence[int]): Dilation of each stage.
+ out_indices (Sequence[int]): Output from which stages.
+ style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two
+ layer is the 3x3 conv layer, otherwise the stride-two layer is
+ the first 1x1 conv layer. Default: "pytorch".
+ frozen_stages (int): Stages to be frozen (all param fixed). -1 means
+ not freezing any parameters. Default: -1.
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN', requires_grad=True).
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False.
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+ zero_init_residual (bool): whether to use zero init for last norm layer
+ in resblocks to let them behave as identity. Default: True.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+
+ Example:
+ >>> from mmpose.models import RegNet
+ >>> import torch
+ >>> self = RegNet(
+ arch=dict(
+ w0=88,
+ wa=26.31,
+ wm=2.25,
+ group_w=48,
+ depth=25,
+ bot_mul=1.0),
+ out_indices=(0, 1, 2, 3))
+ >>> self.eval()
+ >>> inputs = torch.rand(1, 3, 32, 32)
+ >>> level_outputs = self.forward(inputs)
+ >>> for level_out in level_outputs:
+ ... print(tuple(level_out.shape))
+ (1, 96, 8, 8)
+ (1, 192, 4, 4)
+ (1, 432, 2, 2)
+ (1, 1008, 1, 1)
+ """
+ arch_settings = {
+ 'regnetx_400mf':
+ dict(w0=24, wa=24.48, wm=2.54, group_w=16, depth=22, bot_mul=1.0),
+ 'regnetx_800mf':
+ dict(w0=56, wa=35.73, wm=2.28, group_w=16, depth=16, bot_mul=1.0),
+ 'regnetx_1.6gf':
+ dict(w0=80, wa=34.01, wm=2.25, group_w=24, depth=18, bot_mul=1.0),
+ 'regnetx_3.2gf':
+ dict(w0=88, wa=26.31, wm=2.25, group_w=48, depth=25, bot_mul=1.0),
+ 'regnetx_4.0gf':
+ dict(w0=96, wa=38.65, wm=2.43, group_w=40, depth=23, bot_mul=1.0),
+ 'regnetx_6.4gf':
+ dict(w0=184, wa=60.83, wm=2.07, group_w=56, depth=17, bot_mul=1.0),
+ 'regnetx_8.0gf':
+ dict(w0=80, wa=49.56, wm=2.88, group_w=120, depth=23, bot_mul=1.0),
+ 'regnetx_12gf':
+ dict(w0=168, wa=73.36, wm=2.37, group_w=112, depth=19, bot_mul=1.0),
+ }
+
+ def __init__(self,
+ arch,
+ in_channels=3,
+ stem_channels=32,
+ base_channels=32,
+ strides=(2, 2, 2, 2),
+ dilations=(1, 1, 1, 1),
+ out_indices=(3, ),
+ style='pytorch',
+ deep_stem=False,
+ avg_down=False,
+ frozen_stages=-1,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN', requires_grad=True),
+ norm_eval=False,
+ with_cp=False,
+ zero_init_residual=True,
+ init_cfg=[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super(ResNet, self).__init__(init_cfg=init_cfg)
+
+ # Generate RegNet parameters first
+ if isinstance(arch, str):
+ assert arch in self.arch_settings, \
+ f'"arch": "{arch}" is not one of the' \
+ ' arch_settings'
+ arch = self.arch_settings[arch]
+ elif not isinstance(arch, dict):
+ raise TypeError('Expect "arch" to be either a string '
+ f'or a dict, got {type(arch)}')
+
+ widths, num_stages = self.generate_regnet(
+ arch['w0'],
+ arch['wa'],
+ arch['wm'],
+ arch['depth'],
+ )
+ # Convert to per stage format
+ stage_widths, stage_blocks = self.get_stages_from_blocks(widths)
+ # Generate group widths and bot muls
+ group_widths = [arch['group_w'] for _ in range(num_stages)]
+ self.bottleneck_ratio = [arch['bot_mul'] for _ in range(num_stages)]
+ # Adjust the compatibility of stage_widths and group_widths
+ stage_widths, group_widths = self.adjust_width_group(
+ stage_widths, self.bottleneck_ratio, group_widths)
+
+ # Group params by stage
+ self.stage_widths = stage_widths
+ self.group_widths = group_widths
+ self.depth = sum(stage_blocks)
+ self.stem_channels = stem_channels
+ self.base_channels = base_channels
+ self.num_stages = num_stages
+ assert 1 <= num_stages <= 4
+ self.strides = strides
+ self.dilations = dilations
+ assert len(strides) == len(dilations) == num_stages
+ self.out_indices = out_indices
+ assert max(out_indices) < num_stages
+ self.style = style
+ self.deep_stem = deep_stem
+ if self.deep_stem:
+ raise NotImplementedError(
+ 'deep_stem has not been implemented for RegNet')
+ self.avg_down = avg_down
+ self.frozen_stages = frozen_stages
+ self.conv_cfg = conv_cfg
+ self.norm_cfg = norm_cfg
+ self.with_cp = with_cp
+ self.norm_eval = norm_eval
+ self.zero_init_residual = zero_init_residual
+ self.stage_blocks = stage_blocks[:num_stages]
+
+ self._make_stem_layer(in_channels, stem_channels)
+
+ _in_channels = stem_channels
+ self.res_layers = []
+ for i, num_blocks in enumerate(self.stage_blocks):
+ stride = self.strides[i]
+ dilation = self.dilations[i]
+ group_width = self.group_widths[i]
+ width = int(round(self.stage_widths[i] * self.bottleneck_ratio[i]))
+ stage_groups = width // group_width
+
+ res_layer = self.make_res_layer(
+ block=Bottleneck,
+ num_blocks=num_blocks,
+ in_channels=_in_channels,
+ out_channels=self.stage_widths[i],
+ expansion=1,
+ stride=stride,
+ dilation=dilation,
+ style=self.style,
+ avg_down=self.avg_down,
+ with_cp=self.with_cp,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ base_channels=self.stage_widths[i],
+ groups=stage_groups,
+ width_per_group=group_width)
+ _in_channels = self.stage_widths[i]
+ layer_name = f'layer{i + 1}'
+ self.add_module(layer_name, res_layer)
+ self.res_layers.append(layer_name)
+
+ self._freeze_stages()
+
+ self.feat_dim = stage_widths[-1]
+
+ def _make_stem_layer(self, in_channels, base_channels):
+ self.conv1 = build_conv_layer(
+ self.conv_cfg,
+ in_channels,
+ base_channels,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ bias=False)
+ self.norm1_name, norm1 = build_norm_layer(
+ self.norm_cfg, base_channels, postfix=1)
+ self.add_module(self.norm1_name, norm1)
+ self.relu = nn.ReLU(inplace=True)
+
+ @staticmethod
+ def generate_regnet(initial_width,
+ width_slope,
+ width_parameter,
+ depth,
+ divisor=8):
+ """Generates per block width from RegNet parameters.
+
+ Args:
+ initial_width ([int]): Initial width of the backbone
+ width_slope ([float]): Slope of the quantized linear function
+ width_parameter ([int]): Parameter used to quantize the width.
+ depth ([int]): Depth of the backbone.
+ divisor (int, optional): The divisor of channels. Defaults to 8.
+
+ Returns:
+ list, int: return a list of widths of each stage and the number of
+ stages
+ """
+ assert width_slope >= 0
+ assert initial_width > 0
+ assert width_parameter > 1
+ assert initial_width % divisor == 0
+ widths_cont = np.arange(depth) * width_slope + initial_width
+ ks = np.round(
+ np.log(widths_cont / initial_width) / np.log(width_parameter))
+ widths = initial_width * np.power(width_parameter, ks)
+ widths = np.round(np.divide(widths, divisor)) * divisor
+ num_stages = len(np.unique(widths))
+ widths, widths_cont = widths.astype(int).tolist(), widths_cont.tolist()
+ return widths, num_stages
+
+ @staticmethod
+ def quantize_float(number, divisor):
+ """Converts a float to closest non-zero int divisible by divior.
+
+ Args:
+ number (int): Original number to be quantized.
+ divisor (int): Divisor used to quantize the number.
+
+ Returns:
+ int: quantized number that is divisible by devisor.
+ """
+ return int(round(number / divisor) * divisor)
+
+ def adjust_width_group(self, widths, bottleneck_ratio, groups):
+ """Adjusts the compatibility of widths and groups.
+
+ Args:
+ widths (list[int]): Width of each stage.
+ bottleneck_ratio (float): Bottleneck ratio.
+ groups (int): number of groups in each stage
+
+ Returns:
+ tuple(list): The adjusted widths and groups of each stage.
+ """
+ bottleneck_width = [
+ int(w * b) for w, b in zip(widths, bottleneck_ratio)
+ ]
+ groups = [min(g, w_bot) for g, w_bot in zip(groups, bottleneck_width)]
+ bottleneck_width = [
+ self.quantize_float(w_bot, g)
+ for w_bot, g in zip(bottleneck_width, groups)
+ ]
+ widths = [
+ int(w_bot / b)
+ for w_bot, b in zip(bottleneck_width, bottleneck_ratio)
+ ]
+ return widths, groups
+
+ def get_stages_from_blocks(self, widths):
+ """Gets widths/stage_blocks of network at each stage.
+
+ Args:
+ widths (list[int]): Width in each stage.
+
+ Returns:
+ tuple(list): width and depth of each stage
+ """
+ width_diff = [
+ width != width_prev
+ for width, width_prev in zip(widths + [0], [0] + widths)
+ ]
+ stage_widths = [
+ width for width, diff in zip(widths, width_diff[:-1]) if diff
+ ]
+ stage_blocks = np.diff([
+ depth for depth, diff in zip(range(len(width_diff)), width_diff)
+ if diff
+ ]).tolist()
+ return stage_widths, stage_blocks
+
+ def forward(self, x):
+ x = self.conv1(x)
+ x = self.norm1(x)
+ x = self.relu(x)
+
+ outs = []
+ for i, layer_name in enumerate(self.res_layers):
+ res_layer = getattr(self, layer_name)
+ x = res_layer(x)
+ if i in self.out_indices:
+ outs.append(x)
+
+ return tuple(outs)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/resnest.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/resnest.py
new file mode 100644
index 0000000000000000000000000000000000000000..98e769f31ff4d745efaeb7f0f7961cb258a254da
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/resnest.py
@@ -0,0 +1,358 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch.utils.checkpoint as cp
+from mmcv.cnn import build_conv_layer, build_norm_layer
+from mmengine.model import BaseModule
+
+from mmpose.registry import MODELS
+from .resnet import Bottleneck as _Bottleneck
+from .resnet import ResLayer, ResNetV1d
+
+
+class RSoftmax(nn.Module):
+ """Radix Softmax module in ``SplitAttentionConv2d``.
+
+ Args:
+ radix (int): Radix of input.
+ groups (int): Groups of input.
+ """
+
+ def __init__(self, radix, groups):
+ super().__init__()
+ self.radix = radix
+ self.groups = groups
+
+ def forward(self, x):
+ batch = x.size(0)
+ if self.radix > 1:
+ x = x.view(batch, self.groups, self.radix, -1).transpose(1, 2)
+ x = F.softmax(x, dim=1)
+ x = x.reshape(batch, -1)
+ else:
+ x = torch.sigmoid(x)
+ return x
+
+
+class SplitAttentionConv2d(BaseModule):
+ """Split-Attention Conv2d.
+
+ Args:
+ in_channels (int): Same as nn.Conv2d.
+ out_channels (int): Same as nn.Conv2d.
+ kernel_size (int | tuple[int]): Same as nn.Conv2d.
+ stride (int | tuple[int]): Same as nn.Conv2d.
+ padding (int | tuple[int]): Same as nn.Conv2d.
+ dilation (int | tuple[int]): Same as nn.Conv2d.
+ groups (int): Same as nn.Conv2d.
+ radix (int): Radix of SpltAtConv2d. Default: 2
+ reduction_factor (int): Reduction factor of SplitAttentionConv2d.
+ Default: 4.
+ conv_cfg (dict): Config dict for convolution layer. Default: None,
+ which means using conv2d.
+ norm_cfg (dict): Config dict for normalization layer. Default: None.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ channels,
+ kernel_size,
+ stride=1,
+ padding=0,
+ dilation=1,
+ groups=1,
+ radix=2,
+ reduction_factor=4,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+ inter_channels = max(in_channels * radix // reduction_factor, 32)
+ self.radix = radix
+ self.groups = groups
+ self.channels = channels
+ self.conv = build_conv_layer(
+ conv_cfg,
+ in_channels,
+ channels * radix,
+ kernel_size,
+ stride=stride,
+ padding=padding,
+ dilation=dilation,
+ groups=groups * radix,
+ bias=False)
+ self.norm0_name, norm0 = build_norm_layer(
+ norm_cfg, channels * radix, postfix=0)
+ self.add_module(self.norm0_name, norm0)
+ self.relu = nn.ReLU(inplace=True)
+ self.fc1 = build_conv_layer(
+ None, channels, inter_channels, 1, groups=self.groups)
+ self.norm1_name, norm1 = build_norm_layer(
+ norm_cfg, inter_channels, postfix=1)
+ self.add_module(self.norm1_name, norm1)
+ self.fc2 = build_conv_layer(
+ None, inter_channels, channels * radix, 1, groups=self.groups)
+ self.rsoftmax = RSoftmax(radix, groups)
+
+ @property
+ def norm0(self):
+ return getattr(self, self.norm0_name)
+
+ @property
+ def norm1(self):
+ return getattr(self, self.norm1_name)
+
+ def forward(self, x):
+ x = self.conv(x)
+ x = self.norm0(x)
+ x = self.relu(x)
+
+ batch, rchannel = x.shape[:2]
+ if self.radix > 1:
+ splits = x.view(batch, self.radix, -1, *x.shape[2:])
+ gap = splits.sum(dim=1)
+ else:
+ gap = x
+ gap = F.adaptive_avg_pool2d(gap, 1)
+ gap = self.fc1(gap)
+
+ gap = self.norm1(gap)
+ gap = self.relu(gap)
+
+ atten = self.fc2(gap)
+ atten = self.rsoftmax(atten).view(batch, -1, 1, 1)
+
+ if self.radix > 1:
+ attens = atten.view(batch, self.radix, -1, *atten.shape[2:])
+ out = torch.sum(attens * splits, dim=1)
+ else:
+ out = atten * x
+ return out.contiguous()
+
+
+class Bottleneck(_Bottleneck):
+ """Bottleneck block for ResNeSt.
+
+ Args:
+ in_channels (int): Input channels of this block.
+ out_channels (int): Output channels of this block.
+ groups (int): Groups of conv2.
+ width_per_group (int): Width per group of conv2. 64x4d indicates
+ ``groups=64, width_per_group=4`` and 32x8d indicates
+ ``groups=32, width_per_group=8``.
+ radix (int): Radix of SpltAtConv2d. Default: 2
+ reduction_factor (int): Reduction factor of SplitAttentionConv2d.
+ Default: 4.
+ avg_down_stride (bool): Whether to use average pool for stride in
+ Bottleneck. Default: True.
+ stride (int): stride of the block. Default: 1
+ dilation (int): dilation of convolution. Default: 1
+ downsample (nn.Module): downsample operation on identity branch.
+ Default: None
+ style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two
+ layer is the 3x3 conv layer, otherwise the stride-two layer is
+ the first 1x1 conv layer.
+ conv_cfg (dict): dictionary to construct and config conv layer.
+ Default: None
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ groups=1,
+ width_per_group=4,
+ base_channels=64,
+ radix=2,
+ reduction_factor=4,
+ avg_down_stride=True,
+ **kwargs):
+ super().__init__(in_channels, out_channels, **kwargs)
+
+ self.groups = groups
+ self.width_per_group = width_per_group
+
+ # For ResNet bottleneck, middle channels are determined by expansion
+ # and out_channels, but for ResNeXt bottleneck, it is determined by
+ # groups and width_per_group and the stage it is located in.
+ if groups != 1:
+ assert self.mid_channels % base_channels == 0
+ self.mid_channels = (
+ groups * width_per_group * self.mid_channels // base_channels)
+
+ self.avg_down_stride = avg_down_stride and self.conv2_stride > 1
+
+ self.norm1_name, norm1 = build_norm_layer(
+ self.norm_cfg, self.mid_channels, postfix=1)
+ self.norm3_name, norm3 = build_norm_layer(
+ self.norm_cfg, self.out_channels, postfix=3)
+
+ self.conv1 = build_conv_layer(
+ self.conv_cfg,
+ self.in_channels,
+ self.mid_channels,
+ kernel_size=1,
+ stride=self.conv1_stride,
+ bias=False)
+ self.add_module(self.norm1_name, norm1)
+ self.conv2 = SplitAttentionConv2d(
+ self.mid_channels,
+ self.mid_channels,
+ kernel_size=3,
+ stride=1 if self.avg_down_stride else self.conv2_stride,
+ padding=self.dilation,
+ dilation=self.dilation,
+ groups=groups,
+ radix=radix,
+ reduction_factor=reduction_factor,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg)
+ delattr(self, self.norm2_name)
+
+ if self.avg_down_stride:
+ self.avd_layer = nn.AvgPool2d(3, self.conv2_stride, padding=1)
+
+ self.conv3 = build_conv_layer(
+ self.conv_cfg,
+ self.mid_channels,
+ self.out_channels,
+ kernel_size=1,
+ bias=False)
+ self.add_module(self.norm3_name, norm3)
+
+ def forward(self, x):
+
+ def _inner_forward(x):
+ identity = x
+
+ out = self.conv1(x)
+ out = self.norm1(out)
+ out = self.relu(out)
+
+ out = self.conv2(out)
+
+ if self.avg_down_stride:
+ out = self.avd_layer(out)
+
+ out = self.conv3(out)
+ out = self.norm3(out)
+
+ if self.downsample is not None:
+ identity = self.downsample(x)
+
+ out += identity
+
+ return out
+
+ if self.with_cp and x.requires_grad:
+ out = cp.checkpoint(_inner_forward, x)
+ else:
+ out = _inner_forward(x)
+
+ out = self.relu(out)
+
+ return out
+
+
+@MODELS.register_module()
+class ResNeSt(ResNetV1d):
+ """ResNeSt backbone.
+
+ Please refer to the `paper `__
+ for details.
+
+ Args:
+ depth (int): Network depth, from {50, 101, 152, 200}.
+ groups (int): Groups of conv2 in Bottleneck. Default: 32.
+ width_per_group (int): Width per group of conv2 in Bottleneck.
+ Default: 4.
+ radix (int): Radix of SpltAtConv2d. Default: 2
+ reduction_factor (int): Reduction factor of SplitAttentionConv2d.
+ Default: 4.
+ avg_down_stride (bool): Whether to use average pool for stride in
+ Bottleneck. Default: True.
+ in_channels (int): Number of input image channels. Default: 3.
+ stem_channels (int): Output channels of the stem layer. Default: 64.
+ num_stages (int): Stages of the network. Default: 4.
+ strides (Sequence[int]): Strides of the first block of each stage.
+ Default: ``(1, 2, 2, 2)``.
+ dilations (Sequence[int]): Dilation of each stage.
+ Default: ``(1, 1, 1, 1)``.
+ out_indices (Sequence[int]): Output from which stages. If only one
+ stage is specified, a single tensor (feature map) is returned,
+ otherwise multiple stages are specified, a tuple of tensors will
+ be returned. Default: ``(3, )``.
+ style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two
+ layer is the 3x3 conv layer, otherwise the stride-two layer is
+ the first 1x1 conv layer.
+ deep_stem (bool): Replace 7x7 conv in input stem with 3 3x3 conv.
+ Default: False.
+ avg_down (bool): Use AvgPool instead of stride conv when
+ downsampling in the bottleneck. Default: False.
+ frozen_stages (int): Stages to be frozen (stop grad and set eval mode).
+ -1 means not freezing any parameters. Default: -1.
+ conv_cfg (dict | None): The config dict for conv layers. Default: None.
+ norm_cfg (dict): The config dict for norm layers.
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False.
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+ zero_init_residual (bool): Whether to use zero init for last norm layer
+ in resblocks to let them behave as identity. Default: True.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+ """
+
+ arch_settings = {
+ 50: (Bottleneck, (3, 4, 6, 3)),
+ 101: (Bottleneck, (3, 4, 23, 3)),
+ 152: (Bottleneck, (3, 8, 36, 3)),
+ 200: (Bottleneck, (3, 24, 36, 3)),
+ 269: (Bottleneck, (3, 30, 48, 8))
+ }
+
+ def __init__(self,
+ depth,
+ groups=1,
+ width_per_group=4,
+ radix=2,
+ reduction_factor=4,
+ avg_down_stride=True,
+ **kwargs):
+ self.groups = groups
+ self.width_per_group = width_per_group
+ self.radix = radix
+ self.reduction_factor = reduction_factor
+ self.avg_down_stride = avg_down_stride
+ super().__init__(depth=depth, **kwargs)
+
+ def make_res_layer(self, **kwargs):
+ return ResLayer(
+ groups=self.groups,
+ width_per_group=self.width_per_group,
+ base_channels=self.base_channels,
+ radix=self.radix,
+ reduction_factor=self.reduction_factor,
+ avg_down_stride=self.avg_down_stride,
+ **kwargs)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/resnet.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/resnet.py
new file mode 100644
index 0000000000000000000000000000000000000000..dcebca920549591574cfedfb228a2023f6eb348a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/resnet.py
@@ -0,0 +1,720 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+
+import torch.nn as nn
+import torch.utils.checkpoint as cp
+from mmcv.cnn import ConvModule, build_conv_layer, build_norm_layer
+from mmengine.model import BaseModule, constant_init
+from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+
+
+class BasicBlock(BaseModule):
+ """BasicBlock for ResNet.
+
+ Args:
+ in_channels (int): Input channels of this block.
+ out_channels (int): Output channels of this block.
+ expansion (int): The ratio of ``out_channels/mid_channels`` where
+ ``mid_channels`` is the output channels of conv1. This is a
+ reserved argument in BasicBlock and should always be 1. Default: 1.
+ stride (int): stride of the block. Default: 1
+ dilation (int): dilation of convolution. Default: 1
+ downsample (nn.Module): downsample operation on identity branch.
+ Default: None.
+ style (str): `pytorch` or `caffe`. It is unused and reserved for
+ unified API with Bottleneck.
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed.
+ conv_cfg (dict): dictionary to construct and config conv layer.
+ Default: None
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ expansion=1,
+ stride=1,
+ dilation=1,
+ downsample=None,
+ style='pytorch',
+ with_cp=False,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+ self.expansion = expansion
+ assert self.expansion == 1
+ assert out_channels % expansion == 0
+ self.mid_channels = out_channels // expansion
+ self.stride = stride
+ self.dilation = dilation
+ self.style = style
+ self.with_cp = with_cp
+ self.conv_cfg = conv_cfg
+ self.norm_cfg = norm_cfg
+
+ self.norm1_name, norm1 = build_norm_layer(
+ norm_cfg, self.mid_channels, postfix=1)
+ self.norm2_name, norm2 = build_norm_layer(
+ norm_cfg, out_channels, postfix=2)
+
+ self.conv1 = build_conv_layer(
+ conv_cfg,
+ in_channels,
+ self.mid_channels,
+ 3,
+ stride=stride,
+ padding=dilation,
+ dilation=dilation,
+ bias=False)
+ self.add_module(self.norm1_name, norm1)
+ self.conv2 = build_conv_layer(
+ conv_cfg,
+ self.mid_channels,
+ out_channels,
+ 3,
+ padding=1,
+ bias=False)
+ self.add_module(self.norm2_name, norm2)
+
+ self.relu = nn.ReLU(inplace=True)
+ self.downsample = downsample
+
+ @property
+ def norm1(self):
+ """nn.Module: the normalization layer named "norm1" """
+ return getattr(self, self.norm1_name)
+
+ @property
+ def norm2(self):
+ """nn.Module: the normalization layer named "norm2" """
+ return getattr(self, self.norm2_name)
+
+ def forward(self, x):
+ """Forward function."""
+
+ def _inner_forward(x):
+ identity = x
+
+ out = self.conv1(x)
+ out = self.norm1(out)
+ out = self.relu(out)
+
+ out = self.conv2(out)
+ out = self.norm2(out)
+
+ if self.downsample is not None:
+ identity = self.downsample(x)
+
+ out += identity
+
+ return out
+
+ if self.with_cp and x.requires_grad:
+ out = cp.checkpoint(_inner_forward, x)
+ else:
+ out = _inner_forward(x)
+
+ out = self.relu(out)
+
+ return out
+
+
+class Bottleneck(BaseModule):
+ """Bottleneck block for ResNet.
+
+ Args:
+ in_channels (int): Input channels of this block.
+ out_channels (int): Output channels of this block.
+ expansion (int): The ratio of ``out_channels/mid_channels`` where
+ ``mid_channels`` is the input/output channels of conv2. Default: 4.
+ stride (int): stride of the block. Default: 1
+ dilation (int): dilation of convolution. Default: 1
+ downsample (nn.Module): downsample operation on identity branch.
+ Default: None.
+ style (str): ``"pytorch"`` or ``"caffe"``. If set to "pytorch", the
+ stride-two layer is the 3x3 conv layer, otherwise the stride-two
+ layer is the first 1x1 conv layer. Default: "pytorch".
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed.
+ conv_cfg (dict): dictionary to construct and config conv layer.
+ Default: None
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ expansion=4,
+ stride=1,
+ dilation=1,
+ downsample=None,
+ style='pytorch',
+ with_cp=False,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ assert style in ['pytorch', 'caffe']
+
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+ self.expansion = expansion
+ assert out_channels % expansion == 0
+ self.mid_channels = out_channels // expansion
+ self.stride = stride
+ self.dilation = dilation
+ self.style = style
+ self.with_cp = with_cp
+ self.conv_cfg = conv_cfg
+ self.norm_cfg = norm_cfg
+
+ if self.style == 'pytorch':
+ self.conv1_stride = 1
+ self.conv2_stride = stride
+ else:
+ self.conv1_stride = stride
+ self.conv2_stride = 1
+
+ self.norm1_name, norm1 = build_norm_layer(
+ norm_cfg, self.mid_channels, postfix=1)
+ self.norm2_name, norm2 = build_norm_layer(
+ norm_cfg, self.mid_channels, postfix=2)
+ self.norm3_name, norm3 = build_norm_layer(
+ norm_cfg, out_channels, postfix=3)
+
+ self.conv1 = build_conv_layer(
+ conv_cfg,
+ in_channels,
+ self.mid_channels,
+ kernel_size=1,
+ stride=self.conv1_stride,
+ bias=False)
+ self.add_module(self.norm1_name, norm1)
+ self.conv2 = build_conv_layer(
+ conv_cfg,
+ self.mid_channels,
+ self.mid_channels,
+ kernel_size=3,
+ stride=self.conv2_stride,
+ padding=dilation,
+ dilation=dilation,
+ bias=False)
+
+ self.add_module(self.norm2_name, norm2)
+ self.conv3 = build_conv_layer(
+ conv_cfg,
+ self.mid_channels,
+ out_channels,
+ kernel_size=1,
+ bias=False)
+ self.add_module(self.norm3_name, norm3)
+
+ self.relu = nn.ReLU(inplace=True)
+ self.downsample = downsample
+
+ @property
+ def norm1(self):
+ """nn.Module: the normalization layer named "norm1" """
+ return getattr(self, self.norm1_name)
+
+ @property
+ def norm2(self):
+ """nn.Module: the normalization layer named "norm2" """
+ return getattr(self, self.norm2_name)
+
+ @property
+ def norm3(self):
+ """nn.Module: the normalization layer named "norm3" """
+ return getattr(self, self.norm3_name)
+
+ def forward(self, x):
+ """Forward function."""
+
+ def _inner_forward(x):
+ identity = x
+
+ out = self.conv1(x)
+ out = self.norm1(out)
+ out = self.relu(out)
+
+ out = self.conv2(out)
+ out = self.norm2(out)
+ out = self.relu(out)
+
+ out = self.conv3(out)
+ out = self.norm3(out)
+
+ if self.downsample is not None:
+ identity = self.downsample(x)
+
+ out += identity
+
+ return out
+
+ if self.with_cp and x.requires_grad:
+ out = cp.checkpoint(_inner_forward, x)
+ else:
+ out = _inner_forward(x)
+
+ out = self.relu(out)
+
+ return out
+
+
+def get_expansion(block, expansion=None):
+ """Get the expansion of a residual block.
+
+ The block expansion will be obtained by the following order:
+
+ 1. If ``expansion`` is given, just return it.
+ 2. If ``block`` has the attribute ``expansion``, then return
+ ``block.expansion``.
+ 3. Return the default value according the the block type:
+ 1 for ``BasicBlock`` and 4 for ``Bottleneck``.
+
+ Args:
+ block (class): The block class.
+ expansion (int | None): The given expansion ratio.
+
+ Returns:
+ int: The expansion of the block.
+ """
+ if isinstance(expansion, int):
+ assert expansion > 0
+ elif expansion is None:
+ if hasattr(block, 'expansion'):
+ expansion = block.expansion
+ elif issubclass(block, BasicBlock):
+ expansion = 1
+ elif issubclass(block, Bottleneck):
+ expansion = 4
+ else:
+ raise TypeError(f'expansion is not specified for {block.__name__}')
+ else:
+ raise TypeError('expansion must be an integer or None')
+
+ return expansion
+
+
+class ResLayer(nn.Sequential):
+ """ResLayer to build ResNet style backbone.
+
+ Args:
+ block (nn.Module): Residual block used to build ResLayer.
+ num_blocks (int): Number of blocks.
+ in_channels (int): Input channels of this block.
+ out_channels (int): Output channels of this block.
+ expansion (int, optional): The expansion for BasicBlock/Bottleneck.
+ If not specified, it will firstly be obtained via
+ ``block.expansion``. If the block has no attribute "expansion",
+ the following default values will be used: 1 for BasicBlock and
+ 4 for Bottleneck. Default: None.
+ stride (int): stride of the first block. Default: 1.
+ avg_down (bool): Use AvgPool instead of stride conv when
+ downsampling in the bottleneck. Default: False
+ conv_cfg (dict): dictionary to construct and config conv layer.
+ Default: None
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ downsample_first (bool): Downsample at the first block or last block.
+ False for Hourglass, True for ResNet. Default: True
+ """
+
+ def __init__(self,
+ block,
+ num_blocks,
+ in_channels,
+ out_channels,
+ expansion=None,
+ stride=1,
+ avg_down=False,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ downsample_first=True,
+ **kwargs):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ self.block = block
+ self.expansion = get_expansion(block, expansion)
+
+ downsample = None
+ if stride != 1 or in_channels != out_channels:
+ downsample = []
+ conv_stride = stride
+ if avg_down and stride != 1:
+ conv_stride = 1
+ downsample.append(
+ nn.AvgPool2d(
+ kernel_size=stride,
+ stride=stride,
+ ceil_mode=True,
+ count_include_pad=False))
+ downsample.extend([
+ build_conv_layer(
+ conv_cfg,
+ in_channels,
+ out_channels,
+ kernel_size=1,
+ stride=conv_stride,
+ bias=False),
+ build_norm_layer(norm_cfg, out_channels)[1]
+ ])
+ downsample = nn.Sequential(*downsample)
+
+ layers = []
+ if downsample_first:
+ layers.append(
+ block(
+ in_channels=in_channels,
+ out_channels=out_channels,
+ expansion=self.expansion,
+ stride=stride,
+ downsample=downsample,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ **kwargs))
+ in_channels = out_channels
+ for _ in range(1, num_blocks):
+ layers.append(
+ block(
+ in_channels=in_channels,
+ out_channels=out_channels,
+ expansion=self.expansion,
+ stride=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ **kwargs))
+ else: # downsample_first=False is for HourglassModule
+ for i in range(0, num_blocks - 1):
+ layers.append(
+ block(
+ in_channels=in_channels,
+ out_channels=in_channels,
+ expansion=self.expansion,
+ stride=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ **kwargs))
+ layers.append(
+ block(
+ in_channels=in_channels,
+ out_channels=out_channels,
+ expansion=self.expansion,
+ stride=stride,
+ downsample=downsample,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ **kwargs))
+
+ super().__init__(*layers)
+
+
+@MODELS.register_module()
+class ResNet(BaseBackbone):
+ """ResNet backbone.
+
+ Please refer to the `paper `__ for
+ details.
+
+ Args:
+ depth (int): Network depth, from {18, 34, 50, 101, 152}.
+ in_channels (int): Number of input image channels. Default: 3.
+ stem_channels (int): Output channels of the stem layer. Default: 64.
+ base_channels (int): Middle channels of the first stage. Default: 64.
+ num_stages (int): Stages of the network. Default: 4.
+ strides (Sequence[int]): Strides of the first block of each stage.
+ Default: ``(1, 2, 2, 2)``.
+ dilations (Sequence[int]): Dilation of each stage.
+ Default: ``(1, 1, 1, 1)``.
+ out_indices (Sequence[int]): Output from which stages. If only one
+ stage is specified, a single tensor (feature map) is returned,
+ otherwise multiple stages are specified, a tuple of tensors will
+ be returned. Default: ``(3, )``.
+ style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two
+ layer is the 3x3 conv layer, otherwise the stride-two layer is
+ the first 1x1 conv layer.
+ deep_stem (bool): Replace 7x7 conv in input stem with 3 3x3 conv.
+ Default: False.
+ avg_down (bool): Use AvgPool instead of stride conv when
+ downsampling in the bottleneck. Default: False.
+ frozen_stages (int): Stages to be frozen (stop grad and set eval mode).
+ -1 means not freezing any parameters. Default: -1.
+ conv_cfg (dict | None): The config dict for conv layers. Default: None.
+ norm_cfg (dict): The config dict for norm layers.
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False.
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+ zero_init_residual (bool): Whether to use zero init for last norm layer
+ in resblocks to let them behave as identity. Default: True.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+
+ Example:
+ >>> from mmpose.models import ResNet
+ >>> import torch
+ >>> self = ResNet(depth=18, out_indices=(0, 1, 2, 3))
+ >>> self.eval()
+ >>> inputs = torch.rand(1, 3, 32, 32)
+ >>> level_outputs = self.forward(inputs)
+ >>> for level_out in level_outputs:
+ ... print(tuple(level_out.shape))
+ (1, 64, 8, 8)
+ (1, 128, 4, 4)
+ (1, 256, 2, 2)
+ (1, 512, 1, 1)
+ """
+
+ arch_settings = {
+ 18: (BasicBlock, (2, 2, 2, 2)),
+ 34: (BasicBlock, (3, 4, 6, 3)),
+ 50: (Bottleneck, (3, 4, 6, 3)),
+ 101: (Bottleneck, (3, 4, 23, 3)),
+ 152: (Bottleneck, (3, 8, 36, 3))
+ }
+
+ def __init__(self,
+ depth,
+ in_channels=3,
+ stem_channels=64,
+ base_channels=64,
+ expansion=None,
+ num_stages=4,
+ strides=(1, 2, 2, 2),
+ dilations=(1, 1, 1, 1),
+ out_indices=(3, ),
+ style='pytorch',
+ deep_stem=False,
+ avg_down=False,
+ frozen_stages=-1,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN', requires_grad=True),
+ norm_eval=False,
+ with_cp=False,
+ zero_init_residual=True,
+ init_cfg=[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super(ResNet, self).__init__(init_cfg)
+ if depth not in self.arch_settings:
+ raise KeyError(f'invalid depth {depth} for resnet')
+ self.depth = depth
+ self.stem_channels = stem_channels
+ self.base_channels = base_channels
+ self.num_stages = num_stages
+ assert 1 <= num_stages <= 4
+ self.strides = strides
+ self.dilations = dilations
+ assert len(strides) == len(dilations) == num_stages
+ self.out_indices = out_indices
+ assert max(out_indices) < num_stages
+ self.style = style
+ self.deep_stem = deep_stem
+ self.avg_down = avg_down
+ self.frozen_stages = frozen_stages
+ self.conv_cfg = conv_cfg
+ self.norm_cfg = norm_cfg
+ self.with_cp = with_cp
+ self.norm_eval = norm_eval
+ self.zero_init_residual = zero_init_residual
+ self.block, stage_blocks = self.arch_settings[depth]
+ self.stage_blocks = stage_blocks[:num_stages]
+ self.expansion = get_expansion(self.block, expansion)
+
+ self._make_stem_layer(in_channels, stem_channels)
+
+ self.res_layers = []
+ _in_channels = stem_channels
+ _out_channels = base_channels * self.expansion
+ for i, num_blocks in enumerate(self.stage_blocks):
+ stride = strides[i]
+ dilation = dilations[i]
+ res_layer = self.make_res_layer(
+ block=self.block,
+ num_blocks=num_blocks,
+ in_channels=_in_channels,
+ out_channels=_out_channels,
+ expansion=self.expansion,
+ stride=stride,
+ dilation=dilation,
+ style=self.style,
+ avg_down=self.avg_down,
+ with_cp=with_cp,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg)
+ _in_channels = _out_channels
+ _out_channels *= 2
+ layer_name = f'layer{i + 1}'
+ self.add_module(layer_name, res_layer)
+ self.res_layers.append(layer_name)
+
+ self._freeze_stages()
+
+ self.feat_dim = res_layer[-1].out_channels
+
+ def make_res_layer(self, **kwargs):
+ """Make a ResLayer."""
+ return ResLayer(**kwargs)
+
+ @property
+ def norm1(self):
+ """nn.Module: the normalization layer named "norm1" """
+ return getattr(self, self.norm1_name)
+
+ def _make_stem_layer(self, in_channels, stem_channels):
+ """Make stem layer."""
+ if self.deep_stem:
+ self.stem = nn.Sequential(
+ ConvModule(
+ in_channels,
+ stem_channels // 2,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ inplace=True),
+ ConvModule(
+ stem_channels // 2,
+ stem_channels // 2,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ inplace=True),
+ ConvModule(
+ stem_channels // 2,
+ stem_channels,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ inplace=True))
+ else:
+ self.conv1 = build_conv_layer(
+ self.conv_cfg,
+ in_channels,
+ stem_channels,
+ kernel_size=7,
+ stride=2,
+ padding=3,
+ bias=False)
+ self.norm1_name, norm1 = build_norm_layer(
+ self.norm_cfg, stem_channels, postfix=1)
+ self.add_module(self.norm1_name, norm1)
+ self.relu = nn.ReLU(inplace=True)
+ self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
+
+ def _freeze_stages(self):
+ """Freeze parameters."""
+ if self.frozen_stages >= 0:
+ if self.deep_stem:
+ self.stem.eval()
+ for param in self.stem.parameters():
+ param.requires_grad = False
+ else:
+ self.norm1.eval()
+ for m in [self.conv1, self.norm1]:
+ for param in m.parameters():
+ param.requires_grad = False
+
+ for i in range(1, self.frozen_stages + 1):
+ m = getattr(self, f'layer{i}')
+ m.eval()
+ for param in m.parameters():
+ param.requires_grad = False
+
+ def init_weights(self):
+ """Initialize the weights in backbone."""
+ super(ResNet, self).init_weights()
+
+ if (isinstance(self.init_cfg, dict)
+ and self.init_cfg['type'] == 'Pretrained'):
+ # Suppress zero_init_residual if use pretrained model.
+ return
+
+ if self.zero_init_residual:
+ for m in self.modules():
+ if isinstance(m, Bottleneck):
+ constant_init(m.norm3, 0)
+ elif isinstance(m, BasicBlock):
+ constant_init(m.norm2, 0)
+
+ def forward(self, x):
+ """Forward function."""
+ if self.deep_stem:
+ x = self.stem(x)
+ else:
+ x = self.conv1(x)
+ x = self.norm1(x)
+ x = self.relu(x)
+ x = self.maxpool(x)
+ outs = []
+ for i, layer_name in enumerate(self.res_layers):
+ res_layer = getattr(self, layer_name)
+ x = res_layer(x)
+ if i in self.out_indices:
+ outs.append(x)
+ return tuple(outs)
+
+ def train(self, mode=True):
+ """Convert the model into training mode."""
+ super().train(mode)
+ self._freeze_stages()
+ if mode and self.norm_eval:
+ for m in self.modules():
+ # trick: eval have effect on BatchNorm only
+ if isinstance(m, _BatchNorm):
+ m.eval()
+
+
+@MODELS.register_module()
+class ResNetV1d(ResNet):
+ r"""ResNetV1d variant described in `Bag of Tricks
+ `__.
+
+ Compared with default ResNet(ResNetV1b), ResNetV1d replaces the 7x7 conv in
+ the input stem with three 3x3 convs. And in the downsampling block, a 2x2
+ avg_pool with stride 2 is added before conv, whose stride is changed to 1.
+ """
+
+ def __init__(self, **kwargs):
+ super().__init__(deep_stem=True, avg_down=True, **kwargs)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/resnext.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/resnext.py
new file mode 100644
index 0000000000000000000000000000000000000000..aa4bd9645b443c1cb3a2a5345edc89d75944b6a8
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/resnext.py
@@ -0,0 +1,176 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmcv.cnn import build_conv_layer, build_norm_layer
+
+from mmpose.registry import MODELS
+from .resnet import Bottleneck as _Bottleneck
+from .resnet import ResLayer, ResNet
+
+
+class Bottleneck(_Bottleneck):
+ """Bottleneck block for ResNeXt.
+
+ Args:
+ in_channels (int): Input channels of this block.
+ out_channels (int): Output channels of this block.
+ groups (int): Groups of conv2.
+ width_per_group (int): Width per group of conv2. 64x4d indicates
+ ``groups=64, width_per_group=4`` and 32x8d indicates
+ ``groups=32, width_per_group=8``.
+ stride (int): stride of the block. Default: 1
+ dilation (int): dilation of convolution. Default: 1
+ downsample (nn.Module): downsample operation on identity branch.
+ Default: None
+ style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two
+ layer is the 3x3 conv layer, otherwise the stride-two layer is
+ the first 1x1 conv layer.
+ conv_cfg (dict): dictionary to construct and config conv layer.
+ Default: None
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed.
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ base_channels=64,
+ groups=32,
+ width_per_group=4,
+ **kwargs):
+ super().__init__(in_channels, out_channels, **kwargs)
+ self.groups = groups
+ self.width_per_group = width_per_group
+
+ # For ResNet bottleneck, middle channels are determined by expansion
+ # and out_channels, but for ResNeXt bottleneck, it is determined by
+ # groups and width_per_group and the stage it is located in.
+ if groups != 1:
+ assert self.mid_channels % base_channels == 0
+ self.mid_channels = (
+ groups * width_per_group * self.mid_channels // base_channels)
+
+ self.norm1_name, norm1 = build_norm_layer(
+ self.norm_cfg, self.mid_channels, postfix=1)
+ self.norm2_name, norm2 = build_norm_layer(
+ self.norm_cfg, self.mid_channels, postfix=2)
+ self.norm3_name, norm3 = build_norm_layer(
+ self.norm_cfg, self.out_channels, postfix=3)
+
+ self.conv1 = build_conv_layer(
+ self.conv_cfg,
+ self.in_channels,
+ self.mid_channels,
+ kernel_size=1,
+ stride=self.conv1_stride,
+ bias=False)
+ self.add_module(self.norm1_name, norm1)
+ self.conv2 = build_conv_layer(
+ self.conv_cfg,
+ self.mid_channels,
+ self.mid_channels,
+ kernel_size=3,
+ stride=self.conv2_stride,
+ padding=self.dilation,
+ dilation=self.dilation,
+ groups=groups,
+ bias=False)
+
+ self.add_module(self.norm2_name, norm2)
+ self.conv3 = build_conv_layer(
+ self.conv_cfg,
+ self.mid_channels,
+ self.out_channels,
+ kernel_size=1,
+ bias=False)
+ self.add_module(self.norm3_name, norm3)
+
+
+@MODELS.register_module()
+class ResNeXt(ResNet):
+ """ResNeXt backbone.
+
+ Please refer to the `paper `__ for
+ details.
+
+ Args:
+ depth (int): Network depth, from {50, 101, 152}.
+ groups (int): Groups of conv2 in Bottleneck. Default: 32.
+ width_per_group (int): Width per group of conv2 in Bottleneck.
+ Default: 4.
+ in_channels (int): Number of input image channels. Default: 3.
+ stem_channels (int): Output channels of the stem layer. Default: 64.
+ num_stages (int): Stages of the network. Default: 4.
+ strides (Sequence[int]): Strides of the first block of each stage.
+ Default: ``(1, 2, 2, 2)``.
+ dilations (Sequence[int]): Dilation of each stage.
+ Default: ``(1, 1, 1, 1)``.
+ out_indices (Sequence[int]): Output from which stages. If only one
+ stage is specified, a single tensor (feature map) is returned,
+ otherwise multiple stages are specified, a tuple of tensors will
+ be returned. Default: ``(3, )``.
+ style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two
+ layer is the 3x3 conv layer, otherwise the stride-two layer is
+ the first 1x1 conv layer.
+ deep_stem (bool): Replace 7x7 conv in input stem with 3 3x3 conv.
+ Default: False.
+ avg_down (bool): Use AvgPool instead of stride conv when
+ downsampling in the bottleneck. Default: False.
+ frozen_stages (int): Stages to be frozen (stop grad and set eval mode).
+ -1 means not freezing any parameters. Default: -1.
+ conv_cfg (dict | None): The config dict for conv layers. Default: None.
+ norm_cfg (dict): The config dict for norm layers.
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False.
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+ zero_init_residual (bool): Whether to use zero init for last norm layer
+ in resblocks to let them behave as identity. Default: True.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+
+ Example:
+ >>> from mmpose.models import ResNeXt
+ >>> import torch
+ >>> self = ResNeXt(depth=50, out_indices=(0, 1, 2, 3))
+ >>> self.eval()
+ >>> inputs = torch.rand(1, 3, 32, 32)
+ >>> level_outputs = self.forward(inputs)
+ >>> for level_out in level_outputs:
+ ... print(tuple(level_out.shape))
+ (1, 256, 8, 8)
+ (1, 512, 4, 4)
+ (1, 1024, 2, 2)
+ (1, 2048, 1, 1)
+ """
+
+ arch_settings = {
+ 50: (Bottleneck, (3, 4, 6, 3)),
+ 101: (Bottleneck, (3, 4, 23, 3)),
+ 152: (Bottleneck, (3, 8, 36, 3))
+ }
+
+ def __init__(self, depth, groups=32, width_per_group=4, **kwargs):
+ self.groups = groups
+ self.width_per_group = width_per_group
+ super().__init__(depth, **kwargs)
+
+ def make_res_layer(self, **kwargs):
+ return ResLayer(
+ groups=self.groups,
+ width_per_group=self.width_per_group,
+ base_channels=self.base_channels,
+ **kwargs)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/rsn.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/rsn.py
new file mode 100644
index 0000000000000000000000000000000000000000..ae9337e4e435b6367ee40cda6cf57867c4380162
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/rsn.py
@@ -0,0 +1,645 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy as cp
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from mmcv.cnn import ConvModule, MaxPool2d
+from mmengine.model import BaseModule
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+
+
+class RSB(BaseModule):
+ """Residual Steps block for RSN. Paper ref: Cai et al. "Learning Delicate
+ Local Representations for Multi-Person Pose Estimation" (ECCV 2020).
+
+ Args:
+ in_channels (int): Input channels of this block.
+ out_channels (int): Output channels of this block.
+ num_steps (int): Numbers of steps in RSB
+ stride (int): stride of the block. Default: 1
+ downsample (nn.Module): downsample operation on identity branch.
+ Default: None.
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ expand_times (int): Times by which the in_channels are expanded.
+ Default:26.
+ res_top_channels (int): Number of channels of feature output by
+ ResNet_top. Default:64.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ expansion = 1
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ num_steps=4,
+ stride=1,
+ downsample=None,
+ with_cp=False,
+ norm_cfg=dict(type='BN'),
+ expand_times=26,
+ res_top_channels=64,
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = cp.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ assert num_steps > 1
+ self.in_channels = in_channels
+ self.branch_channels = self.in_channels * expand_times
+ self.branch_channels //= res_top_channels
+ self.out_channels = out_channels
+ self.stride = stride
+ self.downsample = downsample
+ self.with_cp = with_cp
+ self.norm_cfg = norm_cfg
+ self.num_steps = num_steps
+ self.conv_bn_relu1 = ConvModule(
+ self.in_channels,
+ self.num_steps * self.branch_channels,
+ kernel_size=1,
+ stride=self.stride,
+ padding=0,
+ norm_cfg=self.norm_cfg,
+ inplace=False)
+ for i in range(self.num_steps):
+ for j in range(i + 1):
+ module_name = f'conv_bn_relu2_{i + 1}_{j + 1}'
+ self.add_module(
+ module_name,
+ ConvModule(
+ self.branch_channels,
+ self.branch_channels,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ norm_cfg=self.norm_cfg,
+ inplace=False))
+ self.conv_bn3 = ConvModule(
+ self.num_steps * self.branch_channels,
+ self.out_channels * self.expansion,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ act_cfg=None,
+ norm_cfg=self.norm_cfg,
+ inplace=False)
+ self.relu = nn.ReLU(inplace=False)
+
+ def forward(self, x):
+ """Forward function."""
+
+ identity = x
+ x = self.conv_bn_relu1(x)
+ spx = torch.split(x, self.branch_channels, 1)
+ outputs = list()
+ outs = list()
+ for i in range(self.num_steps):
+ outputs_i = list()
+ outputs.append(outputs_i)
+ for j in range(i + 1):
+ if j == 0:
+ inputs = spx[i]
+ else:
+ inputs = outputs[i][j - 1]
+ if i > j:
+ inputs = inputs + outputs[i - 1][j]
+ module_name = f'conv_bn_relu2_{i + 1}_{j + 1}'
+ module_i_j = getattr(self, module_name)
+ outputs[i].append(module_i_j(inputs))
+
+ outs.append(outputs[i][i])
+ out = torch.cat(tuple(outs), 1)
+ out = self.conv_bn3(out)
+
+ if self.downsample is not None:
+ identity = self.downsample(identity)
+ out = out + identity
+
+ out = self.relu(out)
+
+ return out
+
+
+class Downsample_module(BaseModule):
+ """Downsample module for RSN.
+
+ Args:
+ block (nn.Module): Downsample block.
+ num_blocks (list): Number of blocks in each downsample unit.
+ num_units (int): Numbers of downsample units. Default: 4
+ has_skip (bool): Have skip connections from prior upsample
+ module or not. Default:False
+ num_steps (int): Number of steps in a block. Default:4
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ in_channels (int): Number of channels of the input feature to
+ downsample module. Default: 64
+ expand_times (int): Times by which the in_channels are expanded.
+ Default:26.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ block,
+ num_blocks,
+ num_steps=4,
+ num_units=4,
+ has_skip=False,
+ norm_cfg=dict(type='BN'),
+ in_channels=64,
+ expand_times=26,
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = cp.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.has_skip = has_skip
+ self.in_channels = in_channels
+ assert len(num_blocks) == num_units
+ self.num_blocks = num_blocks
+ self.num_units = num_units
+ self.num_steps = num_steps
+ self.norm_cfg = norm_cfg
+ self.layer1 = self._make_layer(
+ block,
+ in_channels,
+ num_blocks[0],
+ expand_times=expand_times,
+ res_top_channels=in_channels)
+ for i in range(1, num_units):
+ module_name = f'layer{i + 1}'
+ self.add_module(
+ module_name,
+ self._make_layer(
+ block,
+ in_channels * pow(2, i),
+ num_blocks[i],
+ stride=2,
+ expand_times=expand_times,
+ res_top_channels=in_channels))
+
+ def _make_layer(self,
+ block,
+ out_channels,
+ blocks,
+ stride=1,
+ expand_times=26,
+ res_top_channels=64):
+ downsample = None
+ if stride != 1 or self.in_channels != out_channels * block.expansion:
+ downsample = ConvModule(
+ self.in_channels,
+ out_channels * block.expansion,
+ kernel_size=1,
+ stride=stride,
+ padding=0,
+ norm_cfg=self.norm_cfg,
+ act_cfg=None,
+ inplace=True)
+
+ units = list()
+ units.append(
+ block(
+ self.in_channels,
+ out_channels,
+ num_steps=self.num_steps,
+ stride=stride,
+ downsample=downsample,
+ norm_cfg=self.norm_cfg,
+ expand_times=expand_times,
+ res_top_channels=res_top_channels))
+ self.in_channels = out_channels * block.expansion
+ for _ in range(1, blocks):
+ units.append(
+ block(
+ self.in_channels,
+ out_channels,
+ num_steps=self.num_steps,
+ expand_times=expand_times,
+ res_top_channels=res_top_channels))
+
+ return nn.Sequential(*units)
+
+ def forward(self, x, skip1, skip2):
+ out = list()
+ for i in range(self.num_units):
+ module_name = f'layer{i + 1}'
+ module_i = getattr(self, module_name)
+ x = module_i(x)
+ if self.has_skip:
+ x = x + skip1[i] + skip2[i]
+ out.append(x)
+ out.reverse()
+
+ return tuple(out)
+
+
+class Upsample_unit(BaseModule):
+ """Upsample unit for upsample module.
+
+ Args:
+ ind (int): Indicates whether to interpolate (>0) and whether to
+ generate feature map for the next hourglass-like module.
+ num_units (int): Number of units that form a upsample module. Along
+ with ind and gen_cross_conv, nm_units is used to decide whether
+ to generate feature map for the next hourglass-like module.
+ in_channels (int): Channel number of the skip-in feature maps from
+ the corresponding downsample unit.
+ unit_channels (int): Channel number in this unit. Default:256.
+ gen_skip: (bool): Whether or not to generate skips for the posterior
+ downsample module. Default:False
+ gen_cross_conv (bool): Whether to generate feature map for the next
+ hourglass-like module. Default:False
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ out_channels (in): Number of channels of feature output by upsample
+ module. Must equal to in_channels of downsample module. Default:64
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ ind,
+ num_units,
+ in_channels,
+ unit_channels=256,
+ gen_skip=False,
+ gen_cross_conv=False,
+ norm_cfg=dict(type='BN'),
+ out_channels=64,
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = cp.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.num_units = num_units
+ self.norm_cfg = norm_cfg
+ self.in_skip = ConvModule(
+ in_channels,
+ unit_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ norm_cfg=self.norm_cfg,
+ act_cfg=None,
+ inplace=True)
+ self.relu = nn.ReLU(inplace=True)
+
+ self.ind = ind
+ if self.ind > 0:
+ self.up_conv = ConvModule(
+ unit_channels,
+ unit_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ norm_cfg=self.norm_cfg,
+ act_cfg=None,
+ inplace=True)
+
+ self.gen_skip = gen_skip
+ if self.gen_skip:
+ self.out_skip1 = ConvModule(
+ in_channels,
+ in_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ norm_cfg=self.norm_cfg,
+ inplace=True)
+
+ self.out_skip2 = ConvModule(
+ unit_channels,
+ in_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ norm_cfg=self.norm_cfg,
+ inplace=True)
+
+ self.gen_cross_conv = gen_cross_conv
+ if self.ind == num_units - 1 and self.gen_cross_conv:
+ self.cross_conv = ConvModule(
+ unit_channels,
+ out_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ norm_cfg=self.norm_cfg,
+ inplace=True)
+
+ def forward(self, x, up_x):
+ out = self.in_skip(x)
+
+ if self.ind > 0:
+ up_x = F.interpolate(
+ up_x,
+ size=(x.size(2), x.size(3)),
+ mode='bilinear',
+ align_corners=True)
+ up_x = self.up_conv(up_x)
+ out = out + up_x
+ out = self.relu(out)
+
+ skip1 = None
+ skip2 = None
+ if self.gen_skip:
+ skip1 = self.out_skip1(x)
+ skip2 = self.out_skip2(out)
+
+ cross_conv = None
+ if self.ind == self.num_units - 1 and self.gen_cross_conv:
+ cross_conv = self.cross_conv(out)
+
+ return out, skip1, skip2, cross_conv
+
+
+class Upsample_module(BaseModule):
+ """Upsample module for RSN.
+
+ Args:
+ unit_channels (int): Channel number in the upsample units.
+ Default:256.
+ num_units (int): Numbers of upsample units. Default: 4
+ gen_skip (bool): Whether to generate skip for posterior downsample
+ module or not. Default:False
+ gen_cross_conv (bool): Whether to generate feature map for the next
+ hourglass-like module. Default:False
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ out_channels (int): Number of channels of feature output by upsample
+ module. Must equal to in_channels of downsample module. Default:64
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ unit_channels=256,
+ num_units=4,
+ gen_skip=False,
+ gen_cross_conv=False,
+ norm_cfg=dict(type='BN'),
+ out_channels=64,
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = cp.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.in_channels = list()
+ for i in range(num_units):
+ self.in_channels.append(RSB.expansion * out_channels * pow(2, i))
+ self.in_channels.reverse()
+ self.num_units = num_units
+ self.gen_skip = gen_skip
+ self.gen_cross_conv = gen_cross_conv
+ self.norm_cfg = norm_cfg
+ for i in range(num_units):
+ module_name = f'up{i + 1}'
+ self.add_module(
+ module_name,
+ Upsample_unit(
+ i,
+ self.num_units,
+ self.in_channels[i],
+ unit_channels,
+ self.gen_skip,
+ self.gen_cross_conv,
+ norm_cfg=self.norm_cfg,
+ out_channels=64))
+
+ def forward(self, x):
+ out = list()
+ skip1 = list()
+ skip2 = list()
+ cross_conv = None
+ for i in range(self.num_units):
+ module_i = getattr(self, f'up{i + 1}')
+ if i == 0:
+ outi, skip1_i, skip2_i, _ = module_i(x[i], None)
+ elif i == self.num_units - 1:
+ outi, skip1_i, skip2_i, cross_conv = module_i(x[i], out[i - 1])
+ else:
+ outi, skip1_i, skip2_i, _ = module_i(x[i], out[i - 1])
+ out.append(outi)
+ skip1.append(skip1_i)
+ skip2.append(skip2_i)
+ skip1.reverse()
+ skip2.reverse()
+
+ return out, skip1, skip2, cross_conv
+
+
+class Single_stage_RSN(BaseModule):
+ """Single_stage Residual Steps Network.
+
+ Args:
+ unit_channels (int): Channel number in the upsample units. Default:256.
+ num_units (int): Numbers of downsample/upsample units. Default: 4
+ gen_skip (bool): Whether to generate skip for posterior downsample
+ module or not. Default:False
+ gen_cross_conv (bool): Whether to generate feature map for the next
+ hourglass-like module. Default:False
+ has_skip (bool): Have skip connections from prior upsample
+ module or not. Default:False
+ num_steps (int): Number of steps in RSB. Default: 4
+ num_blocks (list): Number of blocks in each downsample unit.
+ Default: [2, 2, 2, 2] Note: Make sure num_units==len(num_blocks)
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ in_channels (int): Number of channels of the feature from ResNet_Top.
+ Default: 64.
+ expand_times (int): Times by which the in_channels are expanded in RSB.
+ Default:26.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ has_skip=False,
+ gen_skip=False,
+ gen_cross_conv=False,
+ unit_channels=256,
+ num_units=4,
+ num_steps=4,
+ num_blocks=[2, 2, 2, 2],
+ norm_cfg=dict(type='BN'),
+ in_channels=64,
+ expand_times=26,
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = cp.deepcopy(norm_cfg)
+ num_blocks = cp.deepcopy(num_blocks)
+ super().__init__(init_cfg=init_cfg)
+ assert len(num_blocks) == num_units
+ self.has_skip = has_skip
+ self.gen_skip = gen_skip
+ self.gen_cross_conv = gen_cross_conv
+ self.num_units = num_units
+ self.num_steps = num_steps
+ self.unit_channels = unit_channels
+ self.num_blocks = num_blocks
+ self.norm_cfg = norm_cfg
+
+ self.downsample = Downsample_module(RSB, num_blocks, num_steps,
+ num_units, has_skip, norm_cfg,
+ in_channels, expand_times)
+ self.upsample = Upsample_module(unit_channels, num_units, gen_skip,
+ gen_cross_conv, norm_cfg, in_channels)
+
+ def forward(self, x, skip1, skip2):
+ mid = self.downsample(x, skip1, skip2)
+ out, skip1, skip2, cross_conv = self.upsample(mid)
+
+ return out, skip1, skip2, cross_conv
+
+
+class ResNet_top(BaseModule):
+ """ResNet top for RSN.
+
+ Args:
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ channels (int): Number of channels of the feature output by ResNet_top.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self, norm_cfg=dict(type='BN'), channels=64, init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = cp.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.top = nn.Sequential(
+ ConvModule(
+ 3,
+ channels,
+ kernel_size=7,
+ stride=2,
+ padding=3,
+ norm_cfg=norm_cfg,
+ inplace=True), MaxPool2d(kernel_size=3, stride=2, padding=1))
+
+ def forward(self, img):
+ return self.top(img)
+
+
+@MODELS.register_module()
+class RSN(BaseBackbone):
+ """Residual Steps Network backbone. Paper ref: Cai et al. "Learning
+ Delicate Local Representations for Multi-Person Pose Estimation" (ECCV
+ 2020).
+
+ Args:
+ unit_channels (int): Number of Channels in an upsample unit.
+ Default: 256
+ num_stages (int): Number of stages in a multi-stage RSN. Default: 4
+ num_units (int): NUmber of downsample/upsample units in a single-stage
+ RSN. Default: 4 Note: Make sure num_units == len(self.num_blocks)
+ num_blocks (list): Number of RSBs (Residual Steps Block) in each
+ downsample unit. Default: [2, 2, 2, 2]
+ num_steps (int): Number of steps in a RSB. Default:4
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ res_top_channels (int): Number of channels of feature from ResNet_top.
+ Default: 64.
+ expand_times (int): Times by which the in_channels are expanded in RSB.
+ Default:26.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm']),
+ dict(
+ type='Normal',
+ std=0.01,
+ layer=['Linear']),
+ ]``
+ Example:
+ >>> from mmpose.models import RSN
+ >>> import torch
+ >>> self = RSN(num_stages=2,num_units=2,num_blocks=[2,2])
+ >>> self.eval()
+ >>> inputs = torch.rand(1, 3, 511, 511)
+ >>> level_outputs = self.forward(inputs)
+ >>> for level_output in level_outputs:
+ ... for feature in level_output:
+ ... print(tuple(feature.shape))
+ ...
+ (1, 256, 64, 64)
+ (1, 256, 128, 128)
+ (1, 256, 64, 64)
+ (1, 256, 128, 128)
+ """
+
+ def __init__(self,
+ unit_channels=256,
+ num_stages=4,
+ num_units=4,
+ num_blocks=[2, 2, 2, 2],
+ num_steps=4,
+ norm_cfg=dict(type='BN'),
+ res_top_channels=64,
+ expand_times=26,
+ init_cfg=[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm']),
+ dict(type='Normal', std=0.01, layer=['Linear']),
+ ]):
+ # Protect mutable default arguments
+ norm_cfg = cp.deepcopy(norm_cfg)
+ num_blocks = cp.deepcopy(num_blocks)
+ super().__init__(init_cfg=init_cfg)
+ self.unit_channels = unit_channels
+ self.num_stages = num_stages
+ self.num_units = num_units
+ self.num_blocks = num_blocks
+ self.num_steps = num_steps
+ self.norm_cfg = norm_cfg
+
+ assert self.num_stages > 0
+ assert self.num_steps > 1
+ assert self.num_units > 1
+ assert self.num_units == len(self.num_blocks)
+ self.top = ResNet_top(norm_cfg=norm_cfg)
+ self.multi_stage_rsn = nn.ModuleList([])
+ for i in range(self.num_stages):
+ if i == 0:
+ has_skip = False
+ else:
+ has_skip = True
+ if i != self.num_stages - 1:
+ gen_skip = True
+ gen_cross_conv = True
+ else:
+ gen_skip = False
+ gen_cross_conv = False
+ self.multi_stage_rsn.append(
+ Single_stage_RSN(has_skip, gen_skip, gen_cross_conv,
+ unit_channels, num_units, num_steps,
+ num_blocks, norm_cfg, res_top_channels,
+ expand_times))
+
+ def forward(self, x):
+ """Model forward function."""
+ out_feats = []
+ skip1 = None
+ skip2 = None
+ x = self.top(x)
+ for i in range(self.num_stages):
+ out, skip1, skip2, x = self.multi_stage_rsn[i](x, skip1, skip2)
+ out_feats.append(out)
+
+ return out_feats
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/scnet.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/scnet.py
new file mode 100644
index 0000000000000000000000000000000000000000..96f6279976b1ddb00239b9f9dd65938772537352
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/scnet.py
@@ -0,0 +1,257 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch.utils.checkpoint as cp
+from mmcv.cnn import build_conv_layer, build_norm_layer
+from mmengine.model import BaseModule
+
+from mmpose.registry import MODELS
+from .resnet import Bottleneck, ResNet
+
+
+class SCConv(BaseModule):
+ """SCConv (Self-calibrated Convolution)
+
+ Args:
+ in_channels (int): The input channels of the SCConv.
+ out_channels (int): The output channel of the SCConv.
+ stride (int): stride of SCConv.
+ pooling_r (int): size of pooling for scconv.
+ conv_cfg (dict): dictionary to construct and config conv layer.
+ Default: None
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ stride,
+ pooling_r,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN', momentum=0.1),
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+
+ assert in_channels == out_channels
+
+ self.k2 = nn.Sequential(
+ nn.AvgPool2d(kernel_size=pooling_r, stride=pooling_r),
+ build_conv_layer(
+ conv_cfg,
+ in_channels,
+ in_channels,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ bias=False),
+ build_norm_layer(norm_cfg, in_channels)[1],
+ )
+ self.k3 = nn.Sequential(
+ build_conv_layer(
+ conv_cfg,
+ in_channels,
+ in_channels,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ bias=False),
+ build_norm_layer(norm_cfg, in_channels)[1],
+ )
+ self.k4 = nn.Sequential(
+ build_conv_layer(
+ conv_cfg,
+ in_channels,
+ in_channels,
+ kernel_size=3,
+ stride=stride,
+ padding=1,
+ bias=False),
+ build_norm_layer(norm_cfg, out_channels)[1],
+ nn.ReLU(inplace=True),
+ )
+
+ def forward(self, x):
+ """Forward function."""
+ identity = x
+
+ out = torch.sigmoid(
+ torch.add(identity, F.interpolate(self.k2(x),
+ identity.size()[2:])))
+ out = torch.mul(self.k3(x), out)
+ out = self.k4(out)
+
+ return out
+
+
+class SCBottleneck(Bottleneck):
+ """SC(Self-calibrated) Bottleneck.
+
+ Args:
+ in_channels (int): The input channels of the SCBottleneck block.
+ out_channels (int): The output channel of the SCBottleneck block.
+ """
+
+ pooling_r = 4
+
+ def __init__(self, in_channels, out_channels, **kwargs):
+ super().__init__(in_channels, out_channels, **kwargs)
+ self.mid_channels = out_channels // self.expansion // 2
+
+ self.norm1_name, norm1 = build_norm_layer(
+ self.norm_cfg, self.mid_channels, postfix=1)
+ self.norm2_name, norm2 = build_norm_layer(
+ self.norm_cfg, self.mid_channels, postfix=2)
+ self.norm3_name, norm3 = build_norm_layer(
+ self.norm_cfg, out_channels, postfix=3)
+
+ self.conv1 = build_conv_layer(
+ self.conv_cfg,
+ in_channels,
+ self.mid_channels,
+ kernel_size=1,
+ stride=1,
+ bias=False)
+ self.add_module(self.norm1_name, norm1)
+
+ self.k1 = nn.Sequential(
+ build_conv_layer(
+ self.conv_cfg,
+ self.mid_channels,
+ self.mid_channels,
+ kernel_size=3,
+ stride=self.stride,
+ padding=1,
+ bias=False),
+ build_norm_layer(self.norm_cfg, self.mid_channels)[1],
+ nn.ReLU(inplace=True))
+
+ self.conv2 = build_conv_layer(
+ self.conv_cfg,
+ in_channels,
+ self.mid_channels,
+ kernel_size=1,
+ stride=1,
+ bias=False)
+ self.add_module(self.norm2_name, norm2)
+
+ self.scconv = SCConv(self.mid_channels, self.mid_channels, self.stride,
+ self.pooling_r, self.conv_cfg, self.norm_cfg)
+
+ self.conv3 = build_conv_layer(
+ self.conv_cfg,
+ self.mid_channels * 2,
+ out_channels,
+ kernel_size=1,
+ stride=1,
+ bias=False)
+ self.add_module(self.norm3_name, norm3)
+
+ def forward(self, x):
+ """Forward function."""
+
+ def _inner_forward(x):
+ identity = x
+
+ out_a = self.conv1(x)
+ out_a = self.norm1(out_a)
+ out_a = self.relu(out_a)
+
+ out_a = self.k1(out_a)
+
+ out_b = self.conv2(x)
+ out_b = self.norm2(out_b)
+ out_b = self.relu(out_b)
+
+ out_b = self.scconv(out_b)
+
+ out = self.conv3(torch.cat([out_a, out_b], dim=1))
+ out = self.norm3(out)
+
+ if self.downsample is not None:
+ identity = self.downsample(x)
+
+ out += identity
+
+ return out
+
+ if self.with_cp and x.requires_grad:
+ out = cp.checkpoint(_inner_forward, x)
+ else:
+ out = _inner_forward(x)
+
+ out = self.relu(out)
+
+ return out
+
+
+@MODELS.register_module()
+class SCNet(ResNet):
+ """SCNet backbone.
+
+ Improving Convolutional Networks with Self-Calibrated Convolutions,
+ Jiang-Jiang Liu, Qibin Hou, Ming-Ming Cheng, Changhu Wang, Jiashi Feng,
+ IEEE CVPR, 2020.
+ http://mftp.mmcheng.net/Papers/20cvprSCNet.pdf
+
+ Args:
+ depth (int): Depth of scnet, from {50, 101}.
+ in_channels (int): Number of input image channels. Normally 3.
+ base_channels (int): Number of base channels of hidden layer.
+ num_stages (int): SCNet stages, normally 4.
+ strides (Sequence[int]): Strides of the first block of each stage.
+ dilations (Sequence[int]): Dilation of each stage.
+ out_indices (Sequence[int]): Output from which stages.
+ style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two
+ layer is the 3x3 conv layer, otherwise the stride-two layer is
+ the first 1x1 conv layer.
+ deep_stem (bool): Replace 7x7 conv in input stem with 3 3x3 conv
+ avg_down (bool): Use AvgPool instead of stride conv when
+ downsampling in the bottleneck.
+ frozen_stages (int): Stages to be frozen (stop grad and set eval mode).
+ -1 means not freezing any parameters.
+ norm_cfg (dict): Dictionary to construct and config norm layer.
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only.
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed.
+ zero_init_residual (bool): Whether to use zero init for last norm layer
+ in resblocks to let them behave as identity.
+
+ Example:
+ >>> from mmpose.models import SCNet
+ >>> import torch
+ >>> self = SCNet(depth=50, out_indices=(0, 1, 2, 3))
+ >>> self.eval()
+ >>> inputs = torch.rand(1, 3, 224, 224)
+ >>> level_outputs = self.forward(inputs)
+ >>> for level_out in level_outputs:
+ ... print(tuple(level_out.shape))
+ (1, 256, 56, 56)
+ (1, 512, 28, 28)
+ (1, 1024, 14, 14)
+ (1, 2048, 7, 7)
+ """
+
+ arch_settings = {
+ 50: (SCBottleneck, [3, 4, 6, 3]),
+ 101: (SCBottleneck, [3, 4, 23, 3])
+ }
+
+ def __init__(self, depth, **kwargs):
+ if depth not in self.arch_settings:
+ raise KeyError(f'invalid depth {depth} for SCNet')
+ super().__init__(depth, **kwargs)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/seresnet.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/seresnet.py
new file mode 100644
index 0000000000000000000000000000000000000000..a7c5ec67f2a284b9bd942f9c24f670c04151d245
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/seresnet.py
@@ -0,0 +1,139 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import torch.utils.checkpoint as cp
+
+from mmpose.registry import MODELS
+from .resnet import Bottleneck, ResLayer, ResNet
+from .utils.se_layer import SELayer
+
+
+class SEBottleneck(Bottleneck):
+ """SEBottleneck block for SEResNet.
+
+ Args:
+ in_channels (int): The input channels of the SEBottleneck block.
+ out_channels (int): The output channel of the SEBottleneck block.
+ se_ratio (int): Squeeze ratio in SELayer. Default: 16
+ """
+
+ def __init__(self, in_channels, out_channels, se_ratio=16, **kwargs):
+ super().__init__(in_channels, out_channels, **kwargs)
+ self.se_layer = SELayer(out_channels, ratio=se_ratio)
+
+ def forward(self, x):
+
+ def _inner_forward(x):
+ identity = x
+
+ out = self.conv1(x)
+ out = self.norm1(out)
+ out = self.relu(out)
+
+ out = self.conv2(out)
+ out = self.norm2(out)
+ out = self.relu(out)
+
+ out = self.conv3(out)
+ out = self.norm3(out)
+
+ out = self.se_layer(out)
+
+ if self.downsample is not None:
+ identity = self.downsample(x)
+
+ out += identity
+
+ return out
+
+ if self.with_cp and x.requires_grad:
+ out = cp.checkpoint(_inner_forward, x)
+ else:
+ out = _inner_forward(x)
+
+ out = self.relu(out)
+
+ return out
+
+
+@MODELS.register_module()
+class SEResNet(ResNet):
+ """SEResNet backbone.
+
+ Please refer to the `paper `__ for
+ details.
+
+ Args:
+ depth (int): Network depth, from {50, 101, 152}.
+ se_ratio (int): Squeeze ratio in SELayer. Default: 16.
+ in_channels (int): Number of input image channels. Default: 3.
+ stem_channels (int): Output channels of the stem layer. Default: 64.
+ num_stages (int): Stages of the network. Default: 4.
+ strides (Sequence[int]): Strides of the first block of each stage.
+ Default: ``(1, 2, 2, 2)``.
+ dilations (Sequence[int]): Dilation of each stage.
+ Default: ``(1, 1, 1, 1)``.
+ out_indices (Sequence[int]): Output from which stages. If only one
+ stage is specified, a single tensor (feature map) is returned,
+ otherwise multiple stages are specified, a tuple of tensors will
+ be returned. Default: ``(3, )``.
+ style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two
+ layer is the 3x3 conv layer, otherwise the stride-two layer is
+ the first 1x1 conv layer.
+ deep_stem (bool): Replace 7x7 conv in input stem with 3 3x3 conv.
+ Default: False.
+ avg_down (bool): Use AvgPool instead of stride conv when
+ downsampling in the bottleneck. Default: False.
+ frozen_stages (int): Stages to be frozen (stop grad and set eval mode).
+ -1 means not freezing any parameters. Default: -1.
+ conv_cfg (dict | None): The config dict for conv layers. Default: None.
+ norm_cfg (dict): The config dict for norm layers.
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False.
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+ zero_init_residual (bool): Whether to use zero init for last norm layer
+ in resblocks to let them behave as identity. Default: True.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+
+ Example:
+ >>> from mmpose.models import SEResNet
+ >>> import torch
+ >>> self = SEResNet(depth=50, out_indices=(0, 1, 2, 3))
+ >>> self.eval()
+ >>> inputs = torch.rand(1, 3, 224, 224)
+ >>> level_outputs = self.forward(inputs)
+ >>> for level_out in level_outputs:
+ ... print(tuple(level_out.shape))
+ (1, 256, 56, 56)
+ (1, 512, 28, 28)
+ (1, 1024, 14, 14)
+ (1, 2048, 7, 7)
+ """
+
+ arch_settings = {
+ 50: (SEBottleneck, (3, 4, 6, 3)),
+ 101: (SEBottleneck, (3, 4, 23, 3)),
+ 152: (SEBottleneck, (3, 8, 36, 3))
+ }
+
+ def __init__(self, depth, se_ratio=16, **kwargs):
+ if depth not in self.arch_settings:
+ raise KeyError(f'invalid depth {depth} for SEResNet')
+ self.se_ratio = se_ratio
+ super().__init__(depth, **kwargs)
+
+ def make_res_layer(self, **kwargs):
+ return ResLayer(se_ratio=self.se_ratio, **kwargs)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/seresnext.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/seresnext.py
new file mode 100644
index 0000000000000000000000000000000000000000..3307945936589c73d27bed7165bda81b033d8045
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/seresnext.py
@@ -0,0 +1,184 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmcv.cnn import build_conv_layer, build_norm_layer
+
+from mmpose.registry import MODELS
+from .resnet import ResLayer
+from .seresnet import SEBottleneck as _SEBottleneck
+from .seresnet import SEResNet
+
+
+class SEBottleneck(_SEBottleneck):
+ """SEBottleneck block for SEResNeXt.
+
+ Args:
+ in_channels (int): Input channels of this block.
+ out_channels (int): Output channels of this block.
+ base_channels (int): Middle channels of the first stage. Default: 64.
+ groups (int): Groups of conv2.
+ width_per_group (int): Width per group of conv2. 64x4d indicates
+ ``groups=64, width_per_group=4`` and 32x8d indicates
+ ``groups=32, width_per_group=8``.
+ stride (int): stride of the block. Default: 1
+ dilation (int): dilation of convolution. Default: 1
+ downsample (nn.Module): downsample operation on identity branch.
+ Default: None
+ se_ratio (int): Squeeze ratio in SELayer. Default: 16
+ style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two
+ layer is the 3x3 conv layer, otherwise the stride-two layer is
+ the first 1x1 conv layer.
+ conv_cfg (dict): dictionary to construct and config conv layer.
+ Default: None
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ base_channels=64,
+ groups=32,
+ width_per_group=4,
+ se_ratio=16,
+ **kwargs):
+ super().__init__(in_channels, out_channels, se_ratio, **kwargs)
+ self.groups = groups
+ self.width_per_group = width_per_group
+
+ # We follow the same rational of ResNext to compute mid_channels.
+ # For SEResNet bottleneck, middle channels are determined by expansion
+ # and out_channels, but for SEResNeXt bottleneck, it is determined by
+ # groups and width_per_group and the stage it is located in.
+ if groups != 1:
+ assert self.mid_channels % base_channels == 0
+ self.mid_channels = (
+ groups * width_per_group * self.mid_channels // base_channels)
+
+ self.norm1_name, norm1 = build_norm_layer(
+ self.norm_cfg, self.mid_channels, postfix=1)
+ self.norm2_name, norm2 = build_norm_layer(
+ self.norm_cfg, self.mid_channels, postfix=2)
+ self.norm3_name, norm3 = build_norm_layer(
+ self.norm_cfg, self.out_channels, postfix=3)
+
+ self.conv1 = build_conv_layer(
+ self.conv_cfg,
+ self.in_channels,
+ self.mid_channels,
+ kernel_size=1,
+ stride=self.conv1_stride,
+ bias=False)
+ self.add_module(self.norm1_name, norm1)
+ self.conv2 = build_conv_layer(
+ self.conv_cfg,
+ self.mid_channels,
+ self.mid_channels,
+ kernel_size=3,
+ stride=self.conv2_stride,
+ padding=self.dilation,
+ dilation=self.dilation,
+ groups=groups,
+ bias=False)
+
+ self.add_module(self.norm2_name, norm2)
+ self.conv3 = build_conv_layer(
+ self.conv_cfg,
+ self.mid_channels,
+ self.out_channels,
+ kernel_size=1,
+ bias=False)
+ self.add_module(self.norm3_name, norm3)
+
+
+@MODELS.register_module()
+class SEResNeXt(SEResNet):
+ """SEResNeXt backbone.
+
+ Please refer to the `paper `__ for
+ details.
+
+ Args:
+ depth (int): Network depth, from {50, 101, 152}.
+ groups (int): Groups of conv2 in Bottleneck. Default: 32.
+ width_per_group (int): Width per group of conv2 in Bottleneck.
+ Default: 4.
+ se_ratio (int): Squeeze ratio in SELayer. Default: 16.
+ in_channels (int): Number of input image channels. Default: 3.
+ stem_channels (int): Output channels of the stem layer. Default: 64.
+ num_stages (int): Stages of the network. Default: 4.
+ strides (Sequence[int]): Strides of the first block of each stage.
+ Default: ``(1, 2, 2, 2)``.
+ dilations (Sequence[int]): Dilation of each stage.
+ Default: ``(1, 1, 1, 1)``.
+ out_indices (Sequence[int]): Output from which stages. If only one
+ stage is specified, a single tensor (feature map) is returned,
+ otherwise multiple stages are specified, a tuple of tensors will
+ be returned. Default: ``(3, )``.
+ style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two
+ layer is the 3x3 conv layer, otherwise the stride-two layer is
+ the first 1x1 conv layer.
+ deep_stem (bool): Replace 7x7 conv in input stem with 3 3x3 conv.
+ Default: False.
+ avg_down (bool): Use AvgPool instead of stride conv when
+ downsampling in the bottleneck. Default: False.
+ frozen_stages (int): Stages to be frozen (stop grad and set eval mode).
+ -1 means not freezing any parameters. Default: -1.
+ conv_cfg (dict | None): The config dict for conv layers. Default: None.
+ norm_cfg (dict): The config dict for norm layers.
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False.
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+ zero_init_residual (bool): Whether to use zero init for last norm layer
+ in resblocks to let them behave as identity. Default: True.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+
+ Example:
+ >>> from mmpose.models import SEResNeXt
+ >>> import torch
+ >>> self = SEResNet(depth=50, out_indices=(0, 1, 2, 3))
+ >>> self.eval()
+ >>> inputs = torch.rand(1, 3, 224, 224)
+ >>> level_outputs = self.forward(inputs)
+ >>> for level_out in level_outputs:
+ ... print(tuple(level_out.shape))
+ (1, 256, 56, 56)
+ (1, 512, 28, 28)
+ (1, 1024, 14, 14)
+ (1, 2048, 7, 7)
+ """
+
+ arch_settings = {
+ 50: (SEBottleneck, (3, 4, 6, 3)),
+ 101: (SEBottleneck, (3, 4, 23, 3)),
+ 152: (SEBottleneck, (3, 8, 36, 3))
+ }
+
+ def __init__(self, depth, groups=32, width_per_group=4, **kwargs):
+ self.groups = groups
+ self.width_per_group = width_per_group
+ super().__init__(depth, **kwargs)
+
+ def make_res_layer(self, **kwargs):
+ return ResLayer(
+ groups=self.groups,
+ width_per_group=self.width_per_group,
+ base_channels=self.base_channels,
+ **kwargs)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/shufflenet_v1.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/shufflenet_v1.py
new file mode 100644
index 0000000000000000000000000000000000000000..9d2108f198a00488a847b227d4b157d059d3a16b
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/shufflenet_v1.py
@@ -0,0 +1,343 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+
+import torch
+import torch.nn as nn
+import torch.utils.checkpoint as cp
+from mmcv.cnn import ConvModule, build_activation_layer
+from mmengine.model import BaseModule
+from torch.nn.modules.batchnorm import _BatchNorm
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+from .utils import channel_shuffle, make_divisible
+
+
+class ShuffleUnit(BaseModule):
+ """ShuffleUnit block.
+
+ ShuffleNet unit with pointwise group convolution (GConv) and channel
+ shuffle.
+
+ Args:
+ in_channels (int): The input channels of the ShuffleUnit.
+ out_channels (int): The output channels of the ShuffleUnit.
+ groups (int, optional): The number of groups to be used in grouped 1x1
+ convolutions in each ShuffleUnit. Default: 3
+ first_block (bool, optional): Whether it is the first ShuffleUnit of a
+ sequential ShuffleUnits. Default: True, which means not using the
+ grouped 1x1 convolution.
+ combine (str, optional): The ways to combine the input and output
+ branches. Default: 'add'.
+ conv_cfg (dict): Config dict for convolution layer. Default: None,
+ which means using conv2d.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='BN').
+ act_cfg (dict): Config dict for activation layer.
+ Default: dict(type='ReLU').
+ with_cp (bool, optional): Use checkpoint or not. Using checkpoint
+ will save some memory while slowing down the training speed.
+ Default: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+
+ Returns:
+ Tensor: The output tensor.
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ groups=3,
+ first_block=True,
+ combine='add',
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ act_cfg=dict(type='ReLU'),
+ with_cp=False,
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ act_cfg = copy.deepcopy(act_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+ self.first_block = first_block
+ self.combine = combine
+ self.groups = groups
+ self.bottleneck_channels = self.out_channels // 4
+ self.with_cp = with_cp
+
+ if self.combine == 'add':
+ self.depthwise_stride = 1
+ self._combine_func = self._add
+ assert in_channels == out_channels, (
+ 'in_channels must be equal to out_channels when combine '
+ 'is add')
+ elif self.combine == 'concat':
+ self.depthwise_stride = 2
+ self._combine_func = self._concat
+ self.out_channels -= self.in_channels
+ self.avgpool = nn.AvgPool2d(kernel_size=3, stride=2, padding=1)
+ else:
+ raise ValueError(f'Cannot combine tensors with {self.combine}. '
+ 'Only "add" and "concat" are supported')
+
+ self.first_1x1_groups = 1 if first_block else self.groups
+ self.g_conv_1x1_compress = ConvModule(
+ in_channels=self.in_channels,
+ out_channels=self.bottleneck_channels,
+ kernel_size=1,
+ groups=self.first_1x1_groups,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg)
+
+ self.depthwise_conv3x3_bn = ConvModule(
+ in_channels=self.bottleneck_channels,
+ out_channels=self.bottleneck_channels,
+ kernel_size=3,
+ stride=self.depthwise_stride,
+ padding=1,
+ groups=self.bottleneck_channels,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=None)
+
+ self.g_conv_1x1_expand = ConvModule(
+ in_channels=self.bottleneck_channels,
+ out_channels=self.out_channels,
+ kernel_size=1,
+ groups=self.groups,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=None)
+
+ self.act = build_activation_layer(act_cfg)
+
+ @staticmethod
+ def _add(x, out):
+ # residual connection
+ return x + out
+
+ @staticmethod
+ def _concat(x, out):
+ # concatenate along channel axis
+ return torch.cat((x, out), 1)
+
+ def forward(self, x):
+
+ def _inner_forward(x):
+ residual = x
+
+ out = self.g_conv_1x1_compress(x)
+ out = self.depthwise_conv3x3_bn(out)
+
+ if self.groups > 1:
+ out = channel_shuffle(out, self.groups)
+
+ out = self.g_conv_1x1_expand(out)
+
+ if self.combine == 'concat':
+ residual = self.avgpool(residual)
+ out = self.act(out)
+ out = self._combine_func(residual, out)
+ else:
+ out = self._combine_func(residual, out)
+ out = self.act(out)
+ return out
+
+ if self.with_cp and x.requires_grad:
+ out = cp.checkpoint(_inner_forward, x)
+ else:
+ out = _inner_forward(x)
+
+ return out
+
+
+@MODELS.register_module()
+class ShuffleNetV1(BaseBackbone):
+ """ShuffleNetV1 backbone.
+
+ Args:
+ groups (int, optional): The number of groups to be used in grouped 1x1
+ convolutions in each ShuffleUnit. Default: 3.
+ widen_factor (float, optional): Width multiplier - adjusts the number
+ of channels in each layer by this amount. Default: 1.0.
+ out_indices (Sequence[int]): Output from which stages.
+ Default: (2, )
+ frozen_stages (int): Stages to be frozen (all param fixed).
+ Default: -1, which means not freezing any parameters.
+ conv_cfg (dict): Config dict for convolution layer. Default: None,
+ which means using conv2d.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='BN').
+ act_cfg (dict): Config dict for activation layer.
+ Default: dict(type='ReLU').
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False.
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Normal', std=0.01, layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ bias=0.0001
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+ """
+
+ def __init__(self,
+ groups=3,
+ widen_factor=1.0,
+ out_indices=(2, ),
+ frozen_stages=-1,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ act_cfg=dict(type='ReLU'),
+ norm_eval=False,
+ with_cp=False,
+ init_cfg=[
+ dict(type='Normal', std=0.01, layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ bias=0.0001,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ act_cfg = copy.deepcopy(act_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.stage_blocks = [4, 8, 4]
+ self.groups = groups
+
+ for index in out_indices:
+ if index not in range(0, 3):
+ raise ValueError('the item in out_indices must in '
+ f'range(0, 3). But received {index}')
+
+ if frozen_stages not in range(-1, 3):
+ raise ValueError('frozen_stages must be in range(-1, 3). '
+ f'But received {frozen_stages}')
+ self.out_indices = out_indices
+ self.frozen_stages = frozen_stages
+ self.conv_cfg = conv_cfg
+ self.norm_cfg = norm_cfg
+ self.act_cfg = act_cfg
+ self.norm_eval = norm_eval
+ self.with_cp = with_cp
+
+ if groups == 1:
+ channels = (144, 288, 576)
+ elif groups == 2:
+ channels = (200, 400, 800)
+ elif groups == 3:
+ channels = (240, 480, 960)
+ elif groups == 4:
+ channels = (272, 544, 1088)
+ elif groups == 8:
+ channels = (384, 768, 1536)
+ else:
+ raise ValueError(f'{groups} groups is not supported for 1x1 '
+ 'Grouped Convolutions')
+
+ channels = [make_divisible(ch * widen_factor, 8) for ch in channels]
+
+ self.in_channels = int(24 * widen_factor)
+
+ self.conv1 = ConvModule(
+ in_channels=3,
+ out_channels=self.in_channels,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg)
+ self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
+
+ self.layers = nn.ModuleList()
+ for i, num_blocks in enumerate(self.stage_blocks):
+ first_block = (i == 0)
+ layer = self.make_layer(channels[i], num_blocks, first_block)
+ self.layers.append(layer)
+
+ def _freeze_stages(self):
+ if self.frozen_stages >= 0:
+ for param in self.conv1.parameters():
+ param.requires_grad = False
+ for i in range(self.frozen_stages):
+ layer = self.layers[i]
+ layer.eval()
+ for param in layer.parameters():
+ param.requires_grad = False
+
+ def init_weights(self, pretrained=None):
+ super(ShuffleNetV1, self).init_weights()
+
+ if (isinstance(self.init_cfg, dict)
+ and self.init_cfg['type'] == 'Pretrained'):
+ return
+
+ for name, m in self.named_modules():
+ if isinstance(m, nn.Conv2d) and 'conv1' not in name:
+ nn.init.normal_(m.weight, mean=0, std=1.0 / m.weight.shape[1])
+
+ def make_layer(self, out_channels, num_blocks, first_block=False):
+ """Stack ShuffleUnit blocks to make a layer.
+
+ Args:
+ out_channels (int): out_channels of the block.
+ num_blocks (int): Number of blocks.
+ first_block (bool, optional): Whether is the first ShuffleUnit of a
+ sequential ShuffleUnits. Default: False, which means using
+ the grouped 1x1 convolution.
+ """
+ layers = []
+ for i in range(num_blocks):
+ first_block = first_block if i == 0 else False
+ combine_mode = 'concat' if i == 0 else 'add'
+ layers.append(
+ ShuffleUnit(
+ self.in_channels,
+ out_channels,
+ groups=self.groups,
+ first_block=first_block,
+ combine=combine_mode,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ act_cfg=self.act_cfg,
+ with_cp=self.with_cp))
+ self.in_channels = out_channels
+
+ return nn.Sequential(*layers)
+
+ def forward(self, x):
+ x = self.conv1(x)
+ x = self.maxpool(x)
+
+ outs = []
+ for i, layer in enumerate(self.layers):
+ x = layer(x)
+ if i in self.out_indices:
+ outs.append(x)
+
+ return tuple(outs)
+
+ def train(self, mode=True):
+ super().train(mode)
+ self._freeze_stages()
+ if mode and self.norm_eval:
+ for m in self.modules():
+ if isinstance(m, _BatchNorm):
+ m.eval()
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/shufflenet_v2.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/shufflenet_v2.py
new file mode 100644
index 0000000000000000000000000000000000000000..973229e5590c88da5c39c5d1f9b748d6c25e8a88
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/shufflenet_v2.py
@@ -0,0 +1,316 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+
+import torch
+import torch.nn as nn
+import torch.utils.checkpoint as cp
+from mmcv.cnn import ConvModule
+from mmengine.model import BaseModule
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+from .utils import channel_shuffle
+
+
+class InvertedResidual(BaseModule):
+ """InvertedResidual block for ShuffleNetV2 backbone.
+
+ Args:
+ in_channels (int): The input channels of the block.
+ out_channels (int): The output channels of the block.
+ stride (int): Stride of the 3x3 convolution layer. Default: 1
+ conv_cfg (dict): Config dict for convolution layer.
+ Default: None, which means using conv2d.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='BN').
+ act_cfg (dict): Config dict for activation layer.
+ Default: dict(type='ReLU').
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ stride=1,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ act_cfg=dict(type='ReLU'),
+ with_cp=False,
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ act_cfg = copy.deepcopy(act_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.stride = stride
+ self.with_cp = with_cp
+
+ branch_features = out_channels // 2
+ if self.stride == 1:
+ assert in_channels == branch_features * 2, (
+ f'in_channels ({in_channels}) should equal to '
+ f'branch_features * 2 ({branch_features * 2}) '
+ 'when stride is 1')
+
+ if in_channels != branch_features * 2:
+ assert self.stride != 1, (
+ f'stride ({self.stride}) should not equal 1 when '
+ f'in_channels != branch_features * 2')
+
+ if self.stride > 1:
+ self.branch1 = nn.Sequential(
+ ConvModule(
+ in_channels,
+ in_channels,
+ kernel_size=3,
+ stride=self.stride,
+ padding=1,
+ groups=in_channels,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=None),
+ ConvModule(
+ in_channels,
+ branch_features,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg),
+ )
+
+ self.branch2 = nn.Sequential(
+ ConvModule(
+ in_channels if (self.stride > 1) else branch_features,
+ branch_features,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg),
+ ConvModule(
+ branch_features,
+ branch_features,
+ kernel_size=3,
+ stride=self.stride,
+ padding=1,
+ groups=branch_features,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=None),
+ ConvModule(
+ branch_features,
+ branch_features,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg))
+
+ def forward(self, x):
+
+ def _inner_forward(x):
+ if self.stride > 1:
+ out = torch.cat((self.branch1(x), self.branch2(x)), dim=1)
+ else:
+ x1, x2 = x.chunk(2, dim=1)
+ out = torch.cat((x1, self.branch2(x2)), dim=1)
+
+ out = channel_shuffle(out, 2)
+
+ return out
+
+ if self.with_cp and x.requires_grad:
+ out = cp.checkpoint(_inner_forward, x)
+ else:
+ out = _inner_forward(x)
+
+ return out
+
+
+@MODELS.register_module()
+class ShuffleNetV2(BaseBackbone):
+ """ShuffleNetV2 backbone.
+
+ Args:
+ widen_factor (float): Width multiplier - adjusts the number of
+ channels in each layer by this amount. Default: 1.0.
+ out_indices (Sequence[int]): Output from which stages.
+ Default: (0, 1, 2, 3).
+ frozen_stages (int): Stages to be frozen (all param fixed).
+ Default: -1, which means not freezing any parameters.
+ conv_cfg (dict): Config dict for convolution layer.
+ Default: None, which means using conv2d.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='BN').
+ act_cfg (dict): Config dict for activation layer.
+ Default: dict(type='ReLU').
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False.
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Normal', std=0.01, layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ bias=0.0001
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+ """
+
+ def __init__(self,
+ widen_factor=1.0,
+ out_indices=(3, ),
+ frozen_stages=-1,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ act_cfg=dict(type='ReLU'),
+ norm_eval=False,
+ with_cp=False,
+ init_cfg=[
+ dict(type='Normal', std=0.01, layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ bias=0.0001,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ act_cfg = copy.deepcopy(act_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.stage_blocks = [4, 8, 4]
+ for index in out_indices:
+ if index not in range(0, 4):
+ raise ValueError('the item in out_indices must in '
+ f'range(0, 4). But received {index}')
+
+ if frozen_stages not in range(-1, 4):
+ raise ValueError('frozen_stages must be in range(-1, 4). '
+ f'But received {frozen_stages}')
+ self.out_indices = out_indices
+ self.frozen_stages = frozen_stages
+ self.conv_cfg = conv_cfg
+ self.norm_cfg = norm_cfg
+ self.act_cfg = act_cfg
+ self.norm_eval = norm_eval
+ self.with_cp = with_cp
+
+ if widen_factor == 0.5:
+ channels = [48, 96, 192, 1024]
+ elif widen_factor == 1.0:
+ channels = [116, 232, 464, 1024]
+ elif widen_factor == 1.5:
+ channels = [176, 352, 704, 1024]
+ elif widen_factor == 2.0:
+ channels = [244, 488, 976, 2048]
+ else:
+ raise ValueError('widen_factor must be in [0.5, 1.0, 1.5, 2.0]. '
+ f'But received {widen_factor}')
+
+ self.in_channels = 24
+ self.conv1 = ConvModule(
+ in_channels=3,
+ out_channels=self.in_channels,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg)
+
+ self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
+
+ self.layers = nn.ModuleList()
+ for i, num_blocks in enumerate(self.stage_blocks):
+ layer = self._make_layer(channels[i], num_blocks)
+ self.layers.append(layer)
+
+ output_channels = channels[-1]
+ self.layers.append(
+ ConvModule(
+ in_channels=self.in_channels,
+ out_channels=output_channels,
+ kernel_size=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg))
+
+ def _make_layer(self, out_channels, num_blocks):
+ """Stack blocks to make a layer.
+
+ Args:
+ out_channels (int): out_channels of the block.
+ num_blocks (int): number of blocks.
+ """
+ layers = []
+ for i in range(num_blocks):
+ stride = 2 if i == 0 else 1
+ layers.append(
+ InvertedResidual(
+ in_channels=self.in_channels,
+ out_channels=out_channels,
+ stride=stride,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ act_cfg=self.act_cfg,
+ with_cp=self.with_cp))
+ self.in_channels = out_channels
+
+ return nn.Sequential(*layers)
+
+ def _freeze_stages(self):
+ if self.frozen_stages >= 0:
+ for param in self.conv1.parameters():
+ param.requires_grad = False
+
+ for i in range(self.frozen_stages):
+ m = self.layers[i]
+ m.eval()
+ for param in m.parameters():
+ param.requires_grad = False
+
+ def init_weights(self):
+ super(ShuffleNetV2, self).init_weights()
+
+ if (isinstance(self.init_cfg, dict)
+ and self.init_cfg['type'] == 'Pretrained'):
+ return
+
+ for name, m in self.named_modules():
+ if isinstance(m, nn.Conv2d) and 'conv1' not in name:
+ nn.init.normal_(m.weight, mean=0, std=1.0 / m.weight.shape[1])
+
+ def forward(self, x):
+ x = self.conv1(x)
+ x = self.maxpool(x)
+
+ outs = []
+ for i, layer in enumerate(self.layers):
+ x = layer(x)
+ if i in self.out_indices:
+ outs.append(x)
+
+ return tuple(outs)
+
+ def train(self, mode=True):
+ super().train(mode)
+ self._freeze_stages()
+ if mode and self.norm_eval:
+ for m in self.modules():
+ if isinstance(m, nn.BatchNorm2d):
+ m.eval()
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/swin.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/swin.py
new file mode 100644
index 0000000000000000000000000000000000000000..2b758b012012f5a06ba9da48a2cb64b05695af98
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/swin.py
@@ -0,0 +1,744 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from copy import deepcopy
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch.utils.checkpoint as cp
+from mmcv.cnn import build_norm_layer
+from mmcv.cnn.bricks.transformer import FFN, build_dropout
+from mmengine.model import BaseModule
+from mmengine.model.weight_init import trunc_normal_
+from mmengine.runner import load_state_dict
+from mmengine.utils import to_2tuple
+
+from mmpose.registry import MODELS
+from mmpose.utils import get_root_logger
+from ..utils.transformer import PatchEmbed, PatchMerging
+from .base_backbone import BaseBackbone
+from .utils import get_state_dict
+from .utils.ckpt_convert import swin_converter
+
+
+class WindowMSA(BaseModule):
+ """Window based multi-head self-attention (W-MSA) module with relative
+ position bias.
+
+ Args:
+ embed_dims (int): Number of input channels.
+ num_heads (int): Number of attention heads.
+ window_size (tuple[int]): The height and width of the window.
+ qkv_bias (bool, optional): If True, add a learnable bias to q, k, v.
+ Default: True.
+ qk_scale (float | None, optional): Override default qk scale of
+ head_dim ** -0.5 if set. Default: None.
+ attn_drop_rate (float, optional): Dropout ratio of attention weight.
+ Default: 0.0
+ proj_drop_rate (float, optional): Dropout ratio of output. Default: 0.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None.
+ """
+
+ def __init__(self,
+ embed_dims,
+ num_heads,
+ window_size,
+ qkv_bias=True,
+ qk_scale=None,
+ attn_drop_rate=0.,
+ proj_drop_rate=0.,
+ init_cfg=None):
+
+ super().__init__(init_cfg=init_cfg)
+ self.embed_dims = embed_dims
+ self.window_size = window_size # Wh, Ww
+ self.num_heads = num_heads
+ head_embed_dims = embed_dims // num_heads
+ self.scale = qk_scale or head_embed_dims**-0.5
+
+ # define a parameter table of relative position bias
+ self.relative_position_bias_table = nn.Parameter(
+ torch.zeros((2 * window_size[0] - 1) * (2 * window_size[1] - 1),
+ num_heads)) # 2*Wh-1 * 2*Ww-1, nH
+
+ # About 2x faster than original impl
+ Wh, Ww = self.window_size
+ rel_index_coords = self.double_step_seq(2 * Ww - 1, Wh, 1, Ww)
+ rel_position_index = rel_index_coords + rel_index_coords.T
+ rel_position_index = rel_position_index.flip(1).contiguous()
+ self.register_buffer('relative_position_index', rel_position_index)
+
+ self.qkv = nn.Linear(embed_dims, embed_dims * 3, bias=qkv_bias)
+ self.attn_drop = nn.Dropout(attn_drop_rate)
+ self.proj = nn.Linear(embed_dims, embed_dims)
+ self.proj_drop = nn.Dropout(proj_drop_rate)
+
+ self.softmax = nn.Softmax(dim=-1)
+
+ def init_weights(self):
+ trunc_normal_(self.relative_position_bias_table, std=0.02)
+
+ def forward(self, x, mask=None):
+ """
+ Args:
+
+ x (tensor): input features with shape of (num_windows*B, N, C)
+ mask (tensor | None, Optional): mask with shape of (num_windows,
+ Wh*Ww, Wh*Ww), value should be between (-inf, 0].
+ """
+ B, N, C = x.shape
+ qkv = self.qkv(x).reshape(B, N, 3, self.num_heads,
+ C // self.num_heads).permute(2, 0, 3, 1, 4)
+ # make torchscript happy (cannot use tensor as tuple)
+ q, k, v = qkv[0], qkv[1], qkv[2]
+
+ q = q * self.scale
+ attn = (q @ k.transpose(-2, -1))
+
+ relative_position_bias = self.relative_position_bias_table[
+ self.relative_position_index.view(-1)].view(
+ self.window_size[0] * self.window_size[1],
+ self.window_size[0] * self.window_size[1],
+ -1) # Wh*Ww,Wh*Ww,nH
+ relative_position_bias = relative_position_bias.permute(
+ 2, 0, 1).contiguous() # nH, Wh*Ww, Wh*Ww
+ attn = attn + relative_position_bias.unsqueeze(0)
+
+ if mask is not None:
+ nW = mask.shape[0]
+ attn = attn.view(B // nW, nW, self.num_heads, N,
+ N) + mask.unsqueeze(1).unsqueeze(0)
+ attn = attn.view(-1, self.num_heads, N, N)
+ attn = self.softmax(attn)
+
+ attn = self.attn_drop(attn)
+
+ x = (attn @ v).transpose(1, 2).reshape(B, N, C)
+ x = self.proj(x)
+ x = self.proj_drop(x)
+ return x
+
+ @staticmethod
+ def double_step_seq(step1, len1, step2, len2):
+ seq1 = torch.arange(0, step1 * len1, step1)
+ seq2 = torch.arange(0, step2 * len2, step2)
+ return (seq1[:, None] + seq2[None, :]).reshape(1, -1)
+
+
+class ShiftWindowMSA(BaseModule):
+ """Shifted Window Multihead Self-Attention Module.
+
+ Args:
+ embed_dims (int): Number of input channels.
+ num_heads (int): Number of attention heads.
+ window_size (int): The height and width of the window.
+ shift_size (int, optional): The shift step of each window towards
+ right-bottom. If zero, act as regular window-msa. Defaults to 0.
+ qkv_bias (bool, optional): If True, add a learnable bias to q, k, v.
+ Default: True
+ qk_scale (float | None, optional): Override default qk scale of
+ head_dim ** -0.5 if set. Defaults: None.
+ attn_drop_rate (float, optional): Dropout ratio of attention weight.
+ Defaults: 0.
+ proj_drop_rate (float, optional): Dropout ratio of output.
+ Defaults: 0.
+ dropout_layer (dict, optional): The dropout_layer used before output.
+ Defaults: dict(type='DropPath', drop_prob=0.).
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ embed_dims,
+ num_heads,
+ window_size,
+ shift_size=0,
+ qkv_bias=True,
+ qk_scale=None,
+ attn_drop_rate=0,
+ proj_drop_rate=0,
+ dropout_layer=dict(type='DropPath', drop_prob=0.),
+ init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+
+ self.window_size = window_size
+ self.shift_size = shift_size
+ assert 0 <= self.shift_size < self.window_size
+
+ self.w_msa = WindowMSA(
+ embed_dims=embed_dims,
+ num_heads=num_heads,
+ window_size=to_2tuple(window_size),
+ qkv_bias=qkv_bias,
+ qk_scale=qk_scale,
+ attn_drop_rate=attn_drop_rate,
+ proj_drop_rate=proj_drop_rate)
+
+ self.drop = build_dropout(dropout_layer)
+
+ def forward(self, query, hw_shape):
+ B, L, C = query.shape
+ H, W = hw_shape
+ assert L == H * W, 'input feature has wrong size'
+ query = query.view(B, H, W, C)
+
+ # pad feature maps to multiples of window size
+ pad_r = (self.window_size - W % self.window_size) % self.window_size
+ pad_b = (self.window_size - H % self.window_size) % self.window_size
+ query = F.pad(query, (0, 0, 0, pad_r, 0, pad_b))
+ H_pad, W_pad = query.shape[1], query.shape[2]
+
+ # cyclic shift
+ if self.shift_size > 0:
+ shifted_query = torch.roll(
+ query,
+ shifts=(-self.shift_size, -self.shift_size),
+ dims=(1, 2))
+
+ # calculate attention mask for SW-MSA
+ img_mask = torch.zeros((1, H_pad, W_pad, 1), device=query.device)
+ h_slices = (slice(0, -self.window_size),
+ slice(-self.window_size,
+ -self.shift_size), slice(-self.shift_size, None))
+ w_slices = (slice(0, -self.window_size),
+ slice(-self.window_size,
+ -self.shift_size), slice(-self.shift_size, None))
+ cnt = 0
+ for h in h_slices:
+ for w in w_slices:
+ img_mask[:, h, w, :] = cnt
+ cnt += 1
+
+ # nW, window_size, window_size, 1
+ mask_windows = self.window_partition(img_mask)
+ mask_windows = mask_windows.view(
+ -1, self.window_size * self.window_size)
+ attn_mask = mask_windows.unsqueeze(1) - mask_windows.unsqueeze(2)
+ attn_mask = attn_mask.masked_fill(attn_mask != 0,
+ float(-100.0)).masked_fill(
+ attn_mask == 0, float(0.0))
+ else:
+ shifted_query = query
+ attn_mask = None
+
+ # nW*B, window_size, window_size, C
+ query_windows = self.window_partition(shifted_query)
+ # nW*B, window_size*window_size, C
+ query_windows = query_windows.view(-1, self.window_size**2, C)
+
+ # W-MSA/SW-MSA (nW*B, window_size*window_size, C)
+ attn_windows = self.w_msa(query_windows, mask=attn_mask)
+
+ # merge windows
+ attn_windows = attn_windows.view(-1, self.window_size,
+ self.window_size, C)
+
+ # B H' W' C
+ shifted_x = self.window_reverse(attn_windows, H_pad, W_pad)
+ # reverse cyclic shift
+ if self.shift_size > 0:
+ x = torch.roll(
+ shifted_x,
+ shifts=(self.shift_size, self.shift_size),
+ dims=(1, 2))
+ else:
+ x = shifted_x
+
+ if pad_r > 0 or pad_b:
+ x = x[:, :H, :W, :].contiguous()
+
+ x = x.view(B, H * W, C)
+
+ x = self.drop(x)
+ return x
+
+ def window_reverse(self, windows, H, W):
+ """
+ Args:
+ windows: (num_windows*B, window_size, window_size, C)
+ H (int): Height of image
+ W (int): Width of image
+ Returns:
+ x: (B, H, W, C)
+ """
+ window_size = self.window_size
+ B = int(windows.shape[0] / (H * W / window_size / window_size))
+ x = windows.view(B, H // window_size, W // window_size, window_size,
+ window_size, -1)
+ x = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(B, H, W, -1)
+ return x
+
+ def window_partition(self, x):
+ """
+ Args:
+ x: (B, H, W, C)
+ Returns:
+ windows: (num_windows*B, window_size, window_size, C)
+ """
+ B, H, W, C = x.shape
+ window_size = self.window_size
+ x = x.view(B, H // window_size, window_size, W // window_size,
+ window_size, C)
+ windows = x.permute(0, 1, 3, 2, 4, 5).contiguous()
+ windows = windows.view(-1, window_size, window_size, C)
+ return windows
+
+
+class SwinBlock(BaseModule):
+ """"
+ Args:
+ embed_dims (int): The feature dimension.
+ num_heads (int): Parallel attention heads.
+ feedforward_channels (int): The hidden dimension for FFNs.
+ window_size (int, optional): The local window scale. Default: 7.
+ shift (bool, optional): whether to shift window or not. Default False.
+ qkv_bias (bool, optional): enable bias for qkv if True. Default: True.
+ qk_scale (float | None, optional): Override default qk scale of
+ head_dim ** -0.5 if set. Default: None.
+ drop_rate (float, optional): Dropout rate. Default: 0.
+ attn_drop_rate (float, optional): Attention dropout rate. Default: 0.
+ drop_path_rate (float, optional): Stochastic depth rate. Default: 0.
+ act_cfg (dict, optional): The config dict of activation function.
+ Default: dict(type='GELU').
+ norm_cfg (dict, optional): The config dict of normalization.
+ Default: dict(type='LN').
+ with_cp (bool, optional): Use checkpoint or not. Using checkpoint
+ will save some memory while slowing down the training speed.
+ Default: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ embed_dims,
+ num_heads,
+ feedforward_channels,
+ window_size=7,
+ shift=False,
+ qkv_bias=True,
+ qk_scale=None,
+ drop_rate=0.,
+ attn_drop_rate=0.,
+ drop_path_rate=0.,
+ act_cfg=dict(type='GELU'),
+ norm_cfg=dict(type='LN'),
+ with_cp=False,
+ init_cfg=None):
+
+ super(SwinBlock, self).__init__(init_cfg=init_cfg)
+
+ self.with_cp = with_cp
+
+ self.norm1 = build_norm_layer(norm_cfg, embed_dims)[1]
+ self.attn = ShiftWindowMSA(
+ embed_dims=embed_dims,
+ num_heads=num_heads,
+ window_size=window_size,
+ shift_size=window_size // 2 if shift else 0,
+ qkv_bias=qkv_bias,
+ qk_scale=qk_scale,
+ attn_drop_rate=attn_drop_rate,
+ proj_drop_rate=drop_rate,
+ dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate))
+
+ self.norm2 = build_norm_layer(norm_cfg, embed_dims)[1]
+ self.ffn = FFN(
+ embed_dims=embed_dims,
+ feedforward_channels=feedforward_channels,
+ num_fcs=2,
+ ffn_drop=drop_rate,
+ dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate),
+ act_cfg=act_cfg,
+ add_identity=True,
+ init_cfg=None)
+
+ def forward(self, x, hw_shape):
+
+ def _inner_forward(x):
+ identity = x
+ x = self.norm1(x)
+ x = self.attn(x, hw_shape)
+
+ x = x + identity
+
+ identity = x
+ x = self.norm2(x)
+ x = self.ffn(x, identity=identity)
+
+ return x
+
+ if self.with_cp and x.requires_grad:
+ x = cp.checkpoint(_inner_forward, x)
+ else:
+ x = _inner_forward(x)
+
+ return x
+
+
+class SwinBlockSequence(BaseModule):
+ """Implements one stage in Swin Transformer.
+
+ Args:
+ embed_dims (int): The feature dimension.
+ num_heads (int): Parallel attention heads.
+ feedforward_channels (int): The hidden dimension for FFNs.
+ depth (int): The number of blocks in this stage.
+ window_size (int, optional): The local window scale. Default: 7.
+ qkv_bias (bool, optional): enable bias for qkv if True. Default: True.
+ qk_scale (float | None, optional): Override default qk scale of
+ head_dim ** -0.5 if set. Default: None.
+ drop_rate (float, optional): Dropout rate. Default: 0.
+ attn_drop_rate (float, optional): Attention dropout rate. Default: 0.
+ drop_path_rate (float | list[float], optional): Stochastic depth
+ rate. Default: 0.
+ downsample (nn.Module | None, optional): The downsample operation
+ module. Default: None.
+ act_cfg (dict, optional): The config dict of activation function.
+ Default: dict(type='GELU').
+ norm_cfg (dict, optional): The config dict of normalization.
+ Default: dict(type='LN').
+ with_cp (bool, optional): Use checkpoint or not. Using checkpoint
+ will save some memory while slowing down the training speed.
+ Default: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ embed_dims,
+ num_heads,
+ feedforward_channels,
+ depth,
+ window_size=7,
+ qkv_bias=True,
+ qk_scale=None,
+ drop_rate=0.,
+ attn_drop_rate=0.,
+ drop_path_rate=0.,
+ downsample=None,
+ act_cfg=dict(type='GELU'),
+ norm_cfg=dict(type='LN'),
+ with_cp=False,
+ init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+
+ if isinstance(drop_path_rate, list):
+ drop_path_rates = drop_path_rate
+ assert len(drop_path_rates) == depth
+ else:
+ drop_path_rates = [deepcopy(drop_path_rate) for _ in range(depth)]
+
+ self.blocks = nn.ModuleList()
+ for i in range(depth):
+ block = SwinBlock(
+ embed_dims=embed_dims,
+ num_heads=num_heads,
+ feedforward_channels=feedforward_channels,
+ window_size=window_size,
+ shift=False if i % 2 == 0 else True,
+ qkv_bias=qkv_bias,
+ qk_scale=qk_scale,
+ drop_rate=drop_rate,
+ attn_drop_rate=attn_drop_rate,
+ drop_path_rate=drop_path_rates[i],
+ act_cfg=act_cfg,
+ norm_cfg=norm_cfg,
+ with_cp=with_cp)
+ self.blocks.append(block)
+
+ self.downsample = downsample
+
+ def forward(self, x, hw_shape):
+ for block in self.blocks:
+ x = block(x, hw_shape)
+
+ if self.downsample:
+ x_down, down_hw_shape = self.downsample(x, hw_shape)
+ return x_down, down_hw_shape, x, hw_shape
+ else:
+ return x, hw_shape, x, hw_shape
+
+
+@MODELS.register_module()
+class SwinTransformer(BaseBackbone):
+ """ Swin Transformer
+ A PyTorch implement of : `Swin Transformer:
+ Hierarchical Vision Transformer using Shifted Windows` -
+ https://arxiv.org/abs/2103.14030
+
+ Inspiration from
+ https://github.com/microsoft/Swin-Transformer
+
+ Args:
+ pretrain_img_size (int | tuple[int]): The size of input image when
+ pretrain. Defaults: 224.
+ in_channels (int): The num of input channels.
+ Defaults: 3.
+ embed_dims (int): The feature dimension. Default: 96.
+ patch_size (int | tuple[int]): Patch size. Default: 4.
+ window_size (int): Window size. Default: 7.
+ mlp_ratio (int): Ratio of mlp hidden dim to embedding dim.
+ Default: 4.
+ depths (tuple[int]): Depths of each Swin Transformer stage.
+ Default: (2, 2, 6, 2).
+ num_heads (tuple[int]): Parallel attention heads of each Swin
+ Transformer stage. Default: (3, 6, 12, 24).
+ strides (tuple[int]): The patch merging or patch embedding stride of
+ each Swin Transformer stage. (In swin, we set kernel size equal to
+ stride.) Default: (4, 2, 2, 2).
+ out_indices (tuple[int]): Output from which stages.
+ Default: (0, 1, 2, 3).
+ qkv_bias (bool, optional): If True, add a learnable bias to query, key,
+ value. Default: True
+ qk_scale (float | None, optional): Override default qk scale of
+ head_dim ** -0.5 if set. Default: None.
+ patch_norm (bool): If add a norm layer for patch embed and patch
+ merging. Default: True.
+ drop_rate (float): Dropout rate. Defaults: 0.
+ attn_drop_rate (float): Attention dropout rate. Default: 0.
+ drop_path_rate (float): Stochastic depth rate. Defaults: 0.1.
+ use_abs_pos_embed (bool): If True, add absolute position embedding to
+ the patch embedding. Defaults: False.
+ act_cfg (dict): Config dict for activation layer.
+ Default: dict(type='LN').
+ norm_cfg (dict): Config dict for normalization layer at
+ output of backone. Defaults: dict(type='LN').
+ with_cp (bool, optional): Use checkpoint or not. Using checkpoint
+ will save some memory while slowing down the training speed.
+ Default: False.
+ pretrained (str, optional): model pretrained path. Default: None.
+ convert_weights (bool): The flag indicates whether the
+ pre-trained model is from the original repo. We may need
+ to convert some keys to make it compatible.
+ Default: False.
+ frozen_stages (int): Stages to be frozen (stop grad and set eval mode).
+ Default: -1 (-1 means not freezing any parameters).
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: ``[
+ dict(type='TruncNormal', std=.02, layer=['Linear']),
+ dict(type='Constant', val=1, layer=['LayerNorm']),
+ ]``
+ """
+
+ def __init__(self,
+ pretrain_img_size=224,
+ in_channels=3,
+ embed_dims=96,
+ patch_size=4,
+ window_size=7,
+ mlp_ratio=4,
+ depths=(2, 2, 6, 2),
+ num_heads=(3, 6, 12, 24),
+ strides=(4, 2, 2, 2),
+ out_indices=(0, 1, 2, 3),
+ qkv_bias=True,
+ qk_scale=None,
+ patch_norm=True,
+ drop_rate=0.,
+ attn_drop_rate=0.,
+ drop_path_rate=0.1,
+ use_abs_pos_embed=False,
+ act_cfg=dict(type='GELU'),
+ norm_cfg=dict(type='LN'),
+ with_cp=False,
+ convert_weights=False,
+ frozen_stages=-1,
+ init_cfg=[
+ dict(type='TruncNormal', std=.02, layer=['Linear']),
+ dict(type='Constant', val=1, layer=['LayerNorm']),
+ ]):
+ self.convert_weights = convert_weights
+ self.frozen_stages = frozen_stages
+ if isinstance(pretrain_img_size, int):
+ pretrain_img_size = to_2tuple(pretrain_img_size)
+ elif isinstance(pretrain_img_size, tuple):
+ if len(pretrain_img_size) == 1:
+ pretrain_img_size = to_2tuple(pretrain_img_size[0])
+ assert len(pretrain_img_size) == 2, \
+ f'The size of image should have length 1 or 2, ' \
+ f'but got {len(pretrain_img_size)}'
+
+ super(SwinTransformer, self).__init__(init_cfg=init_cfg)
+
+ num_layers = len(depths)
+ self.out_indices = out_indices
+ self.use_abs_pos_embed = use_abs_pos_embed
+
+ assert strides[0] == patch_size, 'Use non-overlapping patch embed.'
+
+ self.patch_embed = PatchEmbed(
+ in_channels=in_channels,
+ embed_dims=embed_dims,
+ conv_type='Conv2d',
+ kernel_size=patch_size,
+ stride=strides[0],
+ norm_cfg=norm_cfg if patch_norm else None,
+ init_cfg=None)
+
+ if self.use_abs_pos_embed:
+ patch_row = pretrain_img_size[0] // patch_size
+ patch_col = pretrain_img_size[1] // patch_size
+ num_patches = patch_row * patch_col
+ self.absolute_pos_embed = nn.Parameter(
+ torch.zeros((1, num_patches, embed_dims)))
+
+ self.drop_after_pos = nn.Dropout(p=drop_rate)
+
+ # set stochastic depth decay rule
+ total_depth = sum(depths)
+ dpr = [
+ x.item() for x in torch.linspace(0, drop_path_rate, total_depth)
+ ]
+
+ self.stages = nn.ModuleList()
+ in_channels = embed_dims
+ for i in range(num_layers):
+ if i < num_layers - 1:
+ downsample = PatchMerging(
+ in_channels=in_channels,
+ out_channels=2 * in_channels,
+ stride=strides[i + 1],
+ norm_cfg=norm_cfg if patch_norm else None,
+ init_cfg=None)
+ else:
+ downsample = None
+
+ stage = SwinBlockSequence(
+ embed_dims=in_channels,
+ num_heads=num_heads[i],
+ feedforward_channels=mlp_ratio * in_channels,
+ depth=depths[i],
+ window_size=window_size,
+ qkv_bias=qkv_bias,
+ qk_scale=qk_scale,
+ drop_rate=drop_rate,
+ attn_drop_rate=attn_drop_rate,
+ drop_path_rate=dpr[sum(depths[:i]):sum(depths[:i + 1])],
+ downsample=downsample,
+ act_cfg=act_cfg,
+ norm_cfg=norm_cfg,
+ with_cp=with_cp)
+ self.stages.append(stage)
+ if downsample:
+ in_channels = downsample.out_channels
+
+ self.num_features = [int(embed_dims * 2**i) for i in range(num_layers)]
+ # Add a norm layer for each output
+ for i in out_indices:
+ layer = build_norm_layer(norm_cfg, self.num_features[i])[1]
+ layer_name = f'norm{i}'
+ self.add_module(layer_name, layer)
+
+ def train(self, mode=True):
+ """Convert the model into training mode while keep layers freezed."""
+ super(SwinTransformer, self).train(mode)
+ self._freeze_stages()
+
+ def _freeze_stages(self):
+ if self.frozen_stages >= 0:
+ self.patch_embed.eval()
+ for param in self.patch_embed.parameters():
+ param.requires_grad = False
+ if self.use_abs_pos_embed:
+ self.absolute_pos_embed.requires_grad = False
+ self.drop_after_pos.eval()
+
+ for i in range(1, self.frozen_stages + 1):
+
+ if (i - 1) in self.out_indices:
+ norm_layer = getattr(self, f'norm{i-1}')
+ norm_layer.eval()
+ for param in norm_layer.parameters():
+ param.requires_grad = False
+
+ m = self.stages[i - 1]
+ m.eval()
+ for param in m.parameters():
+ param.requires_grad = False
+
+ def init_weights(self, pretrained=None):
+ """Initialize the weights in backbone.
+
+ Args:
+ pretrained (str, optional): Path to pre-trained weights.
+ Defaults to None.
+ """
+ if (isinstance(self.init_cfg, dict)
+ and self.init_cfg['type'] == 'Pretrained'):
+ # Suppress zero_init_residual if use pretrained model.
+ logger = get_root_logger()
+ state_dict = get_state_dict(
+ self.init_cfg['checkpoint'], map_location='cpu')
+ if self.convert_weights:
+ # supported loading weight from original repo
+ state_dict = swin_converter(state_dict)
+
+ # strip prefix of state_dict
+ if list(state_dict.keys())[0].startswith('module.'):
+ state_dict = {k[7:]: v for k, v in state_dict.items()}
+
+ # reshape absolute position embedding
+ if state_dict.get('absolute_pos_embed') is not None:
+ absolute_pos_embed = state_dict['absolute_pos_embed']
+ N1, L, C1 = absolute_pos_embed.size()
+ N2, C2, H, W = self.absolute_pos_embed.size()
+ if N1 != N2 or C1 != C2 or L != H * W:
+ logger.warning('Error in loading absolute_pos_embed, pass')
+ else:
+ state_dict['absolute_pos_embed'] = absolute_pos_embed.view(
+ N2, H, W, C2).permute(0, 3, 1, 2).contiguous()
+
+ # interpolate position bias table if needed
+ relative_position_bias_table_keys = [
+ k for k in state_dict.keys()
+ if 'relative_position_bias_table' in k
+ ]
+ for table_key in relative_position_bias_table_keys:
+ table_pretrained = state_dict[table_key]
+ table_current = self.state_dict()[table_key]
+ L1, nH1 = table_pretrained.size()
+ L2, nH2 = table_current.size()
+ if nH1 != nH2:
+ logger.warning(f'Error in loading {table_key}, pass')
+ elif L1 != L2:
+ S1 = int(L1**0.5)
+ S2 = int(L2**0.5)
+ table_pretrained_resized = F.interpolate(
+ table_pretrained.permute(1, 0).reshape(1, nH1, S1, S1),
+ size=(S2, S2),
+ mode='bicubic')
+ state_dict[table_key] = table_pretrained_resized.view(
+ nH2, L2).permute(1, 0).contiguous()
+
+ # load state_dict
+ load_state_dict(self, state_dict, strict=False, logger=logger)
+
+ else:
+ super(SwinTransformer, self).init_weights()
+ if self.use_abs_pos_embed:
+ trunc_normal_(self.absolute_pos_embed, std=0.02)
+
+ def forward(self, x):
+ x, hw_shape = self.patch_embed(x)
+
+ if self.use_abs_pos_embed:
+ x = x + self.absolute_pos_embed
+ x = self.drop_after_pos(x)
+
+ outs = []
+ for i, stage in enumerate(self.stages):
+ x, hw_shape, out, out_hw_shape = stage(x, hw_shape)
+ if i in self.out_indices:
+ norm_layer = getattr(self, f'norm{i}')
+ out = norm_layer(out)
+ out = out.view(-1, *out_hw_shape,
+ self.num_features[i]).permute(0, 3, 1,
+ 2).contiguous()
+ outs.append(out)
+
+ return tuple(outs)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/tcn.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/tcn.py
new file mode 100644
index 0000000000000000000000000000000000000000..fd0f229d5837a77b9ec4727e8a5119086829434f
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/tcn.py
@@ -0,0 +1,289 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+
+import torch.nn as nn
+from mmcv.cnn import ConvModule, build_conv_layer
+from mmengine.model import BaseModule
+
+from mmpose.registry import MODELS
+from ..utils.regularizations import WeightNormClipHook
+from .base_backbone import BaseBackbone
+
+
+class BasicTemporalBlock(BaseModule):
+ """Basic block for VideoPose3D.
+
+ Args:
+ in_channels (int): Input channels of this block.
+ out_channels (int): Output channels of this block.
+ mid_channels (int): The output channels of conv1. Default: 1024.
+ kernel_size (int): Size of the convolving kernel. Default: 3.
+ dilation (int): Spacing between kernel elements. Default: 3.
+ dropout (float): Dropout rate. Default: 0.25.
+ causal (bool): Use causal convolutions instead of symmetric
+ convolutions (for real-time applications). Default: False.
+ residual (bool): Use residual connection. Default: True.
+ use_stride_conv (bool): Use optimized TCN that designed
+ specifically for single-frame batching, i.e. where batches have
+ input length = receptive field, and output length = 1. This
+ implementation replaces dilated convolutions with strided
+ convolutions to avoid generating unused intermediate results.
+ Default: False.
+ conv_cfg (dict): dictionary to construct and config conv layer.
+ Default: dict(type='Conv1d').
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN1d').
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ mid_channels=1024,
+ kernel_size=3,
+ dilation=3,
+ dropout=0.25,
+ causal=False,
+ residual=True,
+ use_stride_conv=False,
+ conv_cfg=dict(type='Conv1d'),
+ norm_cfg=dict(type='BN1d'),
+ init_cfg=None):
+ # Protect mutable default arguments
+ conv_cfg = copy.deepcopy(conv_cfg)
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+ self.mid_channels = mid_channels
+ self.kernel_size = kernel_size
+ self.dilation = dilation
+ self.dropout = dropout
+ self.causal = causal
+ self.residual = residual
+ self.use_stride_conv = use_stride_conv
+
+ self.pad = (kernel_size - 1) * dilation // 2
+ if use_stride_conv:
+ self.stride = kernel_size
+ self.causal_shift = kernel_size // 2 if causal else 0
+ self.dilation = 1
+ else:
+ self.stride = 1
+ self.causal_shift = kernel_size // 2 * dilation if causal else 0
+
+ self.conv1 = nn.Sequential(
+ ConvModule(
+ in_channels,
+ mid_channels,
+ kernel_size=kernel_size,
+ stride=self.stride,
+ dilation=self.dilation,
+ bias='auto',
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg))
+ self.conv2 = nn.Sequential(
+ ConvModule(
+ mid_channels,
+ out_channels,
+ kernel_size=1,
+ bias='auto',
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg))
+
+ if residual and in_channels != out_channels:
+ self.short_cut = build_conv_layer(conv_cfg, in_channels,
+ out_channels, 1)
+ else:
+ self.short_cut = None
+
+ self.dropout = nn.Dropout(dropout) if dropout > 0 else None
+
+ def forward(self, x):
+ """Forward function."""
+ if self.use_stride_conv:
+ assert self.causal_shift + self.kernel_size // 2 < x.shape[2]
+ else:
+ assert 0 <= self.pad + self.causal_shift < x.shape[2] - \
+ self.pad + self.causal_shift <= x.shape[2]
+
+ out = self.conv1(x)
+ if self.dropout is not None:
+ out = self.dropout(out)
+
+ out = self.conv2(out)
+ if self.dropout is not None:
+ out = self.dropout(out)
+
+ if self.residual:
+ if self.use_stride_conv:
+ res = x[:, :, self.causal_shift +
+ self.kernel_size // 2::self.kernel_size]
+ else:
+ res = x[:, :,
+ (self.pad + self.causal_shift):(x.shape[2] - self.pad +
+ self.causal_shift)]
+
+ if self.short_cut is not None:
+ res = self.short_cut(res)
+ out = out + res
+
+ return out
+
+
+@MODELS.register_module()
+class TCN(BaseBackbone):
+ """TCN backbone.
+
+ Temporal Convolutional Networks.
+ More details can be found in the
+ `paper `__ .
+
+ Args:
+ in_channels (int): Number of input channels, which equals to
+ num_keypoints * num_features.
+ stem_channels (int): Number of feature channels. Default: 1024.
+ num_blocks (int): NUmber of basic temporal convolutional blocks.
+ Default: 2.
+ kernel_sizes (Sequence[int]): Sizes of the convolving kernel of
+ each basic block. Default: ``(3, 3, 3)``.
+ dropout (float): Dropout rate. Default: 0.25.
+ causal (bool): Use causal convolutions instead of symmetric
+ convolutions (for real-time applications).
+ Default: False.
+ residual (bool): Use residual connection. Default: True.
+ use_stride_conv (bool): Use TCN backbone optimized for
+ single-frame batching, i.e. where batches have input length =
+ receptive field, and output length = 1. This implementation
+ replaces dilated convolutions with strided convolutions to avoid
+ generating unused intermediate results. The weights are
+ interchangeable with the reference implementation. Default: False
+ conv_cfg (dict): dictionary to construct and config conv layer.
+ Default: dict(type='Conv1d').
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN1d').
+ max_norm (float|None): if not None, the weight of convolution layers
+ will be clipped to have a maximum norm of max_norm.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(
+ type='Kaiming',
+ mode='fan_in',
+ nonlinearity='relu',
+ layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+
+ Example:
+ >>> from mmpose.models import TCN
+ >>> import torch
+ >>> self = TCN(in_channels=34)
+ >>> self.eval()
+ >>> inputs = torch.rand(1, 34, 243)
+ >>> level_outputs = self.forward(inputs)
+ >>> for level_out in level_outputs:
+ ... print(tuple(level_out.shape))
+ (1, 1024, 235)
+ (1, 1024, 217)
+ """
+
+ def __init__(self,
+ in_channels,
+ stem_channels=1024,
+ num_blocks=2,
+ kernel_sizes=(3, 3, 3),
+ dropout=0.25,
+ causal=False,
+ residual=True,
+ use_stride_conv=False,
+ conv_cfg=dict(type='Conv1d'),
+ norm_cfg=dict(type='BN1d'),
+ max_norm=None,
+ init_cfg=[
+ dict(
+ type='Kaiming',
+ mode='fan_in',
+ nonlinearity='relu',
+ layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]):
+ # Protect mutable default arguments
+ conv_cfg = copy.deepcopy(conv_cfg)
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__()
+ self.in_channels = in_channels
+ self.stem_channels = stem_channels
+ self.num_blocks = num_blocks
+ self.kernel_sizes = kernel_sizes
+ self.dropout = dropout
+ self.causal = causal
+ self.residual = residual
+ self.use_stride_conv = use_stride_conv
+ self.max_norm = max_norm
+
+ assert num_blocks == len(kernel_sizes) - 1
+ for ks in kernel_sizes:
+ assert ks % 2 == 1, 'Only odd filter widths are supported.'
+
+ self.expand_conv = ConvModule(
+ in_channels,
+ stem_channels,
+ kernel_size=kernel_sizes[0],
+ stride=kernel_sizes[0] if use_stride_conv else 1,
+ bias='auto',
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg)
+
+ dilation = kernel_sizes[0]
+ self.tcn_blocks = nn.ModuleList()
+ for i in range(1, num_blocks + 1):
+ self.tcn_blocks.append(
+ BasicTemporalBlock(
+ in_channels=stem_channels,
+ out_channels=stem_channels,
+ mid_channels=stem_channels,
+ kernel_size=kernel_sizes[i],
+ dilation=dilation,
+ dropout=dropout,
+ causal=causal,
+ residual=residual,
+ use_stride_conv=use_stride_conv,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg))
+ dilation *= kernel_sizes[i]
+
+ if self.max_norm is not None:
+ # Apply weight norm clip to conv layers
+ weight_clip = WeightNormClipHook(self.max_norm)
+ for module in self.modules():
+ if isinstance(module, nn.modules.conv._ConvNd):
+ weight_clip.register(module)
+
+ self.dropout = nn.Dropout(dropout) if dropout > 0 else None
+
+ def forward(self, x):
+ """Forward function."""
+ x = self.expand_conv(x)
+
+ if self.dropout is not None:
+ x = self.dropout(x)
+
+ outs = []
+ for i in range(self.num_blocks):
+ x = self.tcn_blocks[i](x)
+ outs.append(x)
+
+ return tuple(outs)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..fe9b01047eacf4a3ab9d9079516a5f670e920987
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__init__.py
@@ -0,0 +1,16 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .channel_shuffle import channel_shuffle
+from .inverted_residual import InvertedResidual
+from .make_divisible import make_divisible
+from .se_layer import SELayer
+from .utils import get_state_dict, load_checkpoint
+
+__all__ = [
+ 'channel_shuffle', 'make_divisible', 'InvertedResidual', 'SELayer',
+ 'load_checkpoint', 'get_state_dict'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..220d1ca48e68d5ca79066d29afa1fa0ecfc58fe2
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/channel_shuffle.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/channel_shuffle.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2446b6632c4c8f5379955f060ee1981be3e603ce
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/channel_shuffle.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/ckpt_convert.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/ckpt_convert.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8bb0770bb1e3d7fdab5569b8fdb006c62c888041
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/ckpt_convert.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/inverted_residual.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/inverted_residual.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4cd7aa34782f2ca9711b422fa8ead89f3c829e31
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/inverted_residual.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/make_divisible.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/make_divisible.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4265bf86d405e415a7b46df9752719778b5619d4
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/make_divisible.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/se_layer.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/se_layer.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bece2f88bee22755c7ce3543d24c7e0587e5e43e
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/se_layer.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/utils.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/utils.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..120a4ff929b1c753469743e15f37c57af363ba08
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/__pycache__/utils.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/channel_shuffle.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/channel_shuffle.py
new file mode 100644
index 0000000000000000000000000000000000000000..fd73d91272172eeb3d5e3961f5ea9d1a927c867b
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/channel_shuffle.py
@@ -0,0 +1,34 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import torch
+
+
+def channel_shuffle(x, groups):
+ """Channel Shuffle operation.
+
+ This function enables cross-group information flow for multiple groups
+ convolution layers.
+
+ Args:
+ x (Tensor): The input tensor.
+ groups (int): The number of groups to divide the input tensor
+ in the channel dimension.
+
+ Returns:
+ Tensor: The output tensor after channel shuffle operation.
+ """
+
+ batch_size, num_channels, height, width = x.size()
+ assert (num_channels % groups == 0), ('num_channels should be '
+ 'divisible by groups')
+ channels_per_group = num_channels // groups
+
+ x = x.view(batch_size, groups, channels_per_group, height, width)
+ x = torch.transpose(x, 1, 2).contiguous()
+ x = x.view(batch_size, groups * channels_per_group, height, width)
+
+ return x
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/ckpt_convert.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/ckpt_convert.py
new file mode 100644
index 0000000000000000000000000000000000000000..747537243786aaf0d3d2acd501ef54e54ac6d619
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/ckpt_convert.py
@@ -0,0 +1,67 @@
+# Copyright (c) Meta Platforms, Inc. and 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 script consists of several convert functions which
+# can modify the weights of model in original repo to be
+# pre-trained weights.
+
+from collections import OrderedDict
+
+
+def swin_converter(ckpt):
+
+ new_ckpt = OrderedDict()
+
+ def correct_unfold_reduction_order(x):
+ out_channel, in_channel = x.shape
+ x = x.reshape(out_channel, 4, in_channel // 4)
+ x = x[:, [0, 2, 1, 3], :].transpose(1,
+ 2).reshape(out_channel, in_channel)
+ return x
+
+ def correct_unfold_norm_order(x):
+ in_channel = x.shape[0]
+ x = x.reshape(4, in_channel // 4)
+ x = x[[0, 2, 1, 3], :].transpose(0, 1).reshape(in_channel)
+ return x
+
+ for k, v in ckpt.items():
+ if k.startswith('head'):
+ continue
+ elif k.startswith('layers'):
+ new_v = v
+ if 'attn.' in k:
+ new_k = k.replace('attn.', 'attn.w_msa.')
+ elif 'mlp.' in k:
+ if 'mlp.fc1.' in k:
+ new_k = k.replace('mlp.fc1.', 'ffn.layers.0.0.')
+ elif 'mlp.fc2.' in k:
+ new_k = k.replace('mlp.fc2.', 'ffn.layers.1.')
+ else:
+ new_k = k.replace('mlp.', 'ffn.')
+ elif 'downsample' in k:
+ new_k = k
+ if 'reduction.' in k:
+ new_v = correct_unfold_reduction_order(v)
+ elif 'norm.' in k:
+ new_v = correct_unfold_norm_order(v)
+ else:
+ new_k = k
+ new_k = new_k.replace('layers', 'stages', 1)
+ elif k.startswith('patch_embed'):
+ new_v = v
+ if 'proj' in k:
+ new_k = k.replace('proj', 'projection')
+ else:
+ new_k = k
+ else:
+ new_v = v
+ new_k = k
+
+ new_ckpt['backbone.' + new_k] = new_v
+
+ return new_ckpt
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/inverted_residual.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/inverted_residual.py
new file mode 100644
index 0000000000000000000000000000000000000000..8f633cf044471d0b66c1e25e74122b43ec840ee4
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/inverted_residual.py
@@ -0,0 +1,133 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+
+import torch.nn as nn
+import torch.utils.checkpoint as cp
+from mmcv.cnn import ConvModule
+
+from .se_layer import SELayer
+
+
+class InvertedResidual(nn.Module):
+ """Inverted Residual Block.
+
+ Args:
+ in_channels (int): The input channels of this Module.
+ out_channels (int): The output channels of this Module.
+ mid_channels (int): The input channels of the depthwise convolution.
+ kernel_size (int): The kernel size of the depthwise convolution.
+ Default: 3.
+ groups (None or int): The group number of the depthwise convolution.
+ Default: None, which means group number = mid_channels.
+ stride (int): The stride of the depthwise convolution. Default: 1.
+ se_cfg (dict): Config dict for se layer. Default: None, which means no
+ se layer.
+ with_expand_conv (bool): Use expand conv or not. If set False,
+ mid_channels must be the same with in_channels.
+ Default: True.
+ conv_cfg (dict): Config dict for convolution layer. Default: None,
+ which means using conv2d.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='BN').
+ act_cfg (dict): Config dict for activation layer.
+ Default: dict(type='ReLU').
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+
+ Returns:
+ Tensor: The output tensor.
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ mid_channels,
+ kernel_size=3,
+ groups=None,
+ stride=1,
+ se_cfg=None,
+ with_expand_conv=True,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ act_cfg=dict(type='ReLU'),
+ with_cp=False):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ act_cfg = copy.deepcopy(act_cfg)
+ super().__init__()
+ self.with_res_shortcut = (stride == 1 and in_channels == out_channels)
+ assert stride in [1, 2]
+ self.with_cp = with_cp
+ self.with_se = se_cfg is not None
+ self.with_expand_conv = with_expand_conv
+
+ if groups is None:
+ groups = mid_channels
+
+ if self.with_se:
+ assert isinstance(se_cfg, dict)
+ if not self.with_expand_conv:
+ assert mid_channels == in_channels
+
+ if self.with_expand_conv:
+ self.expand_conv = ConvModule(
+ in_channels=in_channels,
+ out_channels=mid_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg)
+ self.depthwise_conv = ConvModule(
+ in_channels=mid_channels,
+ out_channels=mid_channels,
+ kernel_size=kernel_size,
+ stride=stride,
+ padding=kernel_size // 2,
+ groups=groups,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg)
+ if self.with_se:
+ self.se = SELayer(**se_cfg)
+ self.linear_conv = ConvModule(
+ in_channels=mid_channels,
+ out_channels=out_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=None)
+
+ def forward(self, x):
+
+ def _inner_forward(x):
+ out = x
+
+ if self.with_expand_conv:
+ out = self.expand_conv(out)
+
+ out = self.depthwise_conv(out)
+
+ if self.with_se:
+ out = self.se(out)
+
+ out = self.linear_conv(out)
+
+ if self.with_res_shortcut:
+ return x + out
+ return out
+
+ if self.with_cp and x.requires_grad:
+ out = cp.checkpoint(_inner_forward, x)
+ else:
+ out = _inner_forward(x)
+
+ return out
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/make_divisible.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/make_divisible.py
new file mode 100644
index 0000000000000000000000000000000000000000..d80fdc52b2b4439471bb33c5de77748b03ca1990
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/make_divisible.py
@@ -0,0 +1,30 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+def make_divisible(value, divisor, min_value=None, min_ratio=0.9):
+ """Make divisible function.
+
+ This function rounds the channel number down to the nearest value that can
+ be divisible by the divisor.
+
+ Args:
+ value (int): The original channel number.
+ divisor (int): The divisor to fully divide the channel number.
+ min_value (int, optional): The minimum value of the output channel.
+ Default: None, means that the minimum value equal to the divisor.
+ min_ratio (float, optional): The minimum ratio of the rounded channel
+ number to the original channel number. Default: 0.9.
+ Returns:
+ int: The modified output channel number
+ """
+
+ if min_value is None:
+ min_value = divisor
+ new_value = max(min_value, int(value + divisor / 2) // divisor * divisor)
+ # Make sure that round down does not go down by more than (1-min_ratio).
+ if new_value < min_ratio * value:
+ new_value += divisor
+ return new_value
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/se_layer.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/se_layer.py
new file mode 100644
index 0000000000000000000000000000000000000000..8c368cb383e52777b42b5c7bfeab18d8a2836cc3
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/se_layer.py
@@ -0,0 +1,59 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import mmengine
+import torch.nn as nn
+from mmcv.cnn import ConvModule
+
+
+class SELayer(nn.Module):
+ """Squeeze-and-Excitation Module.
+
+ Args:
+ channels (int): The input (and output) channels of the SE layer.
+ ratio (int): Squeeze ratio in SELayer, the intermediate channel will be
+ ``int(channels/ratio)``. Default: 16.
+ conv_cfg (None or dict): Config dict for convolution layer.
+ Default: None, which means using conv2d.
+ act_cfg (dict or Sequence[dict]): Config dict for activation layer.
+ If act_cfg is a dict, two activation layers will be configurated
+ by this dict. If act_cfg is a sequence of dicts, the first
+ activation layer will be configurated by the first dict and the
+ second activation layer will be configurated by the second dict.
+ Default: (dict(type='ReLU'), dict(type='Sigmoid'))
+ """
+
+ def __init__(self,
+ channels,
+ ratio=16,
+ conv_cfg=None,
+ act_cfg=(dict(type='ReLU'), dict(type='Sigmoid'))):
+ super().__init__()
+ if isinstance(act_cfg, dict):
+ act_cfg = (act_cfg, act_cfg)
+ assert len(act_cfg) == 2
+ assert mmengine.is_tuple_of(act_cfg, dict)
+ self.global_avgpool = nn.AdaptiveAvgPool2d(1)
+ self.conv1 = ConvModule(
+ in_channels=channels,
+ out_channels=int(channels / ratio),
+ kernel_size=1,
+ stride=1,
+ conv_cfg=conv_cfg,
+ act_cfg=act_cfg[0])
+ self.conv2 = ConvModule(
+ in_channels=int(channels / ratio),
+ out_channels=channels,
+ kernel_size=1,
+ stride=1,
+ conv_cfg=conv_cfg,
+ act_cfg=act_cfg[1])
+
+ def forward(self, x):
+ out = self.global_avgpool(x)
+ out = self.conv1(out)
+ out = self.conv2(out)
+ return x * out
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/utils.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..e80f395f037101cd1533f6f72f53180db56dc8b1
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/utils/utils.py
@@ -0,0 +1,94 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from collections import OrderedDict
+
+from mmengine.runner import CheckpointLoader, load_state_dict
+
+
+def load_checkpoint(model,
+ filename,
+ map_location='cpu',
+ strict=False,
+ logger=None):
+ """Load checkpoint from a file or URI.
+
+ Args:
+ model (Module): Module to load checkpoint.
+ filename (str): Accept local filepath, URL, ``torchvision://xxx``,
+ ``open-mmlab://xxx``.
+ map_location (str): Same as :func:`torch.load`.
+ strict (bool): Whether to allow different params for the model and
+ checkpoint.
+ logger (:mod:`logging.Logger` or None): The logger for error message.
+
+ Returns:
+ dict or OrderedDict: The loaded checkpoint.
+ """
+ checkpoint = CheckpointLoader.load_checkpoint(filename, map_location)
+ # OrderedDict is a subclass of dict
+ if not isinstance(checkpoint, dict):
+ raise RuntimeError(
+ f'No state_dict found in checkpoint file {filename}')
+ # get state_dict from checkpoint
+ if 'state_dict' in checkpoint:
+ state_dict_tmp = checkpoint['state_dict']
+ elif 'model' in checkpoint:
+ state_dict_tmp = checkpoint['model']
+ else:
+ state_dict_tmp = checkpoint
+
+ state_dict = OrderedDict()
+ # strip prefix of state_dict
+ for k, v in state_dict_tmp.items():
+ if k.startswith('module.backbone.'):
+ state_dict[k[16:]] = v
+ elif k.startswith('module.'):
+ state_dict[k[7:]] = v
+ elif k.startswith('backbone.'):
+ state_dict[k[9:]] = v
+ else:
+ state_dict[k] = v
+ # load state_dict
+ load_state_dict(model, state_dict, strict, logger)
+ return checkpoint
+
+
+def get_state_dict(filename, map_location='cpu'):
+ """Get state_dict from a file or URI.
+
+ Args:
+ filename (str): Accept local filepath, URL, ``torchvision://xxx``,
+ ``open-mmlab://xxx``.
+ map_location (str): Same as :func:`torch.load`.
+
+ Returns:
+ OrderedDict: The state_dict.
+ """
+ checkpoint = CheckpointLoader.load_checkpoint(filename, map_location)
+ # OrderedDict is a subclass of dict
+ if not isinstance(checkpoint, dict):
+ raise RuntimeError(
+ f'No state_dict found in checkpoint file {filename}')
+ # get state_dict from checkpoint
+ if 'state_dict' in checkpoint:
+ state_dict_tmp = checkpoint['state_dict']
+ else:
+ state_dict_tmp = checkpoint
+
+ state_dict = OrderedDict()
+ # strip prefix of state_dict
+ for k, v in state_dict_tmp.items():
+ if k.startswith('module.backbone.'):
+ state_dict[k[16:]] = v
+ elif k.startswith('module.'):
+ state_dict[k[7:]] = v
+ elif k.startswith('backbone.'):
+ state_dict[k[9:]] = v
+ else:
+ state_dict[k] = v
+
+ return state_dict
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/v2v_net.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/v2v_net.py
new file mode 100644
index 0000000000000000000000000000000000000000..35192590cc11e61c6f2f76c6fcb1d4e483dea25b
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/v2v_net.py
@@ -0,0 +1,281 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+# ------------------------------------------------------------------------------
+# Copyright and License Information
+# Adapted from
+# https://github.com/microsoft/voxelpose-pytorch/blob/main/lib/models/v2v_net.py
+# Original Licence: MIT License
+# ------------------------------------------------------------------------------
+
+import torch.nn as nn
+import torch.nn.functional as F
+from mmcv.cnn import ConvModule
+from mmengine.model import BaseModule
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+
+
+class Basic3DBlock(BaseModule):
+ """A basic 3D convolutional block.
+
+ Args:
+ in_channels (int): Input channels of this block.
+ out_channels (int): Output channels of this block.
+ kernel_size (int): Kernel size of the convolution operation
+ conv_cfg (dict): Dictionary to construct and config conv layer.
+ Default: dict(type='Conv3d')
+ norm_cfg (dict): Dictionary to construct and config norm layer.
+ Default: dict(type='BN3d')
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ kernel_size,
+ conv_cfg=dict(type='Conv3d'),
+ norm_cfg=dict(type='BN3d'),
+ init_cfg=None):
+ super(Basic3DBlock, self).__init__(init_cfg=init_cfg)
+ self.block = ConvModule(
+ in_channels,
+ out_channels,
+ kernel_size,
+ stride=1,
+ padding=((kernel_size - 1) // 2),
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ bias=True)
+
+ def forward(self, x):
+ """Forward function."""
+ return self.block(x)
+
+
+class Res3DBlock(BaseModule):
+ """A residual 3D convolutional block.
+
+ Args:
+ in_channels (int): Input channels of this block.
+ out_channels (int): Output channels of this block.
+ kernel_size (int): Kernel size of the convolution operation
+ Default: 3
+ conv_cfg (dict): Dictionary to construct and config conv layer.
+ Default: dict(type='Conv3d')
+ norm_cfg (dict): Dictionary to construct and config norm layer.
+ Default: dict(type='BN3d')
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ kernel_size=3,
+ conv_cfg=dict(type='Conv3d'),
+ norm_cfg=dict(type='BN3d'),
+ init_cfg=None):
+ super(Res3DBlock, self).__init__(init_cfg=init_cfg)
+ self.res_branch = nn.Sequential(
+ ConvModule(
+ in_channels,
+ out_channels,
+ kernel_size,
+ stride=1,
+ padding=((kernel_size - 1) // 2),
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ bias=True),
+ ConvModule(
+ out_channels,
+ out_channels,
+ kernel_size,
+ stride=1,
+ padding=((kernel_size - 1) // 2),
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=None,
+ bias=True))
+
+ if in_channels == out_channels:
+ self.skip_con = nn.Sequential()
+ else:
+ self.skip_con = ConvModule(
+ in_channels,
+ out_channels,
+ 1,
+ stride=1,
+ padding=0,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=None,
+ bias=True)
+
+ def forward(self, x):
+ """Forward function."""
+ res = self.res_branch(x)
+ skip = self.skip_con(x)
+ return F.relu(res + skip, True)
+
+
+class Pool3DBlock(BaseModule):
+ """A 3D max-pool block.
+
+ Args:
+ pool_size (int): Pool size of the 3D max-pool layer
+ """
+
+ def __init__(self, pool_size):
+ super(Pool3DBlock, self).__init__()
+ self.pool_size = pool_size
+
+ def forward(self, x):
+ """Forward function."""
+ return F.max_pool3d(
+ x, kernel_size=self.pool_size, stride=self.pool_size)
+
+
+class Upsample3DBlock(BaseModule):
+ """A 3D upsample block.
+
+ Args:
+ in_channels (int): Input channels of this block.
+ out_channels (int): Output channels of this block.
+ kernel_size (int): Kernel size of the transposed convolution operation.
+ Default: 2
+ stride (int): Kernel size of the transposed convolution operation.
+ Default: 2
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ kernel_size=2,
+ stride=2,
+ init_cfg=None):
+ super(Upsample3DBlock, self).__init__(init_cfg=init_cfg)
+ assert kernel_size == 2
+ assert stride == 2
+ self.block = nn.Sequential(
+ nn.ConvTranspose3d(
+ in_channels,
+ out_channels,
+ kernel_size=kernel_size,
+ stride=stride,
+ padding=0,
+ output_padding=0), nn.BatchNorm3d(out_channels), nn.ReLU(True))
+
+ def forward(self, x):
+ """Forward function."""
+ return self.block(x)
+
+
+class EncoderDecorder(BaseModule):
+ """An encoder-decoder block.
+
+ Args:
+ in_channels (int): Input channels of this block
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self, in_channels=32, init_cfg=None):
+ super(EncoderDecorder, self).__init__(init_cfg=init_cfg)
+
+ self.encoder_pool1 = Pool3DBlock(2)
+ self.encoder_res1 = Res3DBlock(in_channels, in_channels * 2)
+ self.encoder_pool2 = Pool3DBlock(2)
+ self.encoder_res2 = Res3DBlock(in_channels * 2, in_channels * 4)
+
+ self.mid_res = Res3DBlock(in_channels * 4, in_channels * 4)
+
+ self.decoder_res2 = Res3DBlock(in_channels * 4, in_channels * 4)
+ self.decoder_upsample2 = Upsample3DBlock(in_channels * 4,
+ in_channels * 2, 2, 2)
+ self.decoder_res1 = Res3DBlock(in_channels * 2, in_channels * 2)
+ self.decoder_upsample1 = Upsample3DBlock(in_channels * 2, in_channels,
+ 2, 2)
+
+ self.skip_res1 = Res3DBlock(in_channels, in_channels)
+ self.skip_res2 = Res3DBlock(in_channels * 2, in_channels * 2)
+
+ def forward(self, x):
+ """Forward function."""
+ skip_x1 = self.skip_res1(x)
+ x = self.encoder_pool1(x)
+ x = self.encoder_res1(x)
+
+ skip_x2 = self.skip_res2(x)
+ x = self.encoder_pool2(x)
+ x = self.encoder_res2(x)
+
+ x = self.mid_res(x)
+
+ x = self.decoder_res2(x)
+ x = self.decoder_upsample2(x)
+ x = x + skip_x2
+
+ x = self.decoder_res1(x)
+ x = self.decoder_upsample1(x)
+ x = x + skip_x1
+
+ return x
+
+
+@MODELS.register_module()
+class V2VNet(BaseBackbone):
+ """V2VNet.
+
+ Please refer to the `paper `
+ for details.
+
+ Args:
+ input_channels (int):
+ Number of channels of the input feature volume.
+ output_channels (int):
+ Number of channels of the output volume.
+ mid_channels (int):
+ Input and output channels of the encoder-decoder block.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: ``dict(
+ type='Normal',
+ std=0.001,
+ layer=['Conv3d', 'ConvTranspose3d']
+ )``
+ """
+
+ def __init__(self,
+ input_channels,
+ output_channels,
+ mid_channels=32,
+ init_cfg=dict(
+ type='Normal',
+ std=0.001,
+ layer=['Conv3d', 'ConvTranspose3d'])):
+ super(V2VNet, self).__init__(init_cfg=init_cfg)
+
+ self.front_layers = nn.Sequential(
+ Basic3DBlock(input_channels, mid_channels // 2, 7),
+ Res3DBlock(mid_channels // 2, mid_channels),
+ )
+
+ self.encoder_decoder = EncoderDecorder(in_channels=mid_channels)
+
+ self.output_layer = nn.Conv3d(
+ mid_channels, output_channels, kernel_size=1, stride=1, padding=0)
+
+ def forward(self, x):
+ """Forward function."""
+ x = self.front_layers(x)
+ x = self.encoder_decoder(x)
+ x = self.output_layer(x)
+
+ return (x, )
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/vgg.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/vgg.py
new file mode 100644
index 0000000000000000000000000000000000000000..fb9a10389c3a3c0f6ef48d22cfb90378bd351b96
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/vgg.py
@@ -0,0 +1,206 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import torch.nn as nn
+from mmcv.cnn import ConvModule
+from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+
+
+def make_vgg_layer(in_channels,
+ out_channels,
+ num_blocks,
+ conv_cfg=None,
+ norm_cfg=None,
+ act_cfg=dict(type='ReLU'),
+ dilation=1,
+ with_norm=False,
+ ceil_mode=False):
+ layers = []
+ for _ in range(num_blocks):
+ layer = ConvModule(
+ in_channels=in_channels,
+ out_channels=out_channels,
+ kernel_size=3,
+ dilation=dilation,
+ padding=dilation,
+ bias=True,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg)
+ layers.append(layer)
+ in_channels = out_channels
+ layers.append(nn.MaxPool2d(kernel_size=2, stride=2, ceil_mode=ceil_mode))
+
+ return layers
+
+
+@MODELS.register_module()
+class VGG(BaseBackbone):
+ """VGG backbone.
+
+ Args:
+ depth (int): Depth of vgg, from {11, 13, 16, 19}.
+ with_norm (bool): Use BatchNorm or not.
+ num_classes (int): number of classes for classification.
+ num_stages (int): VGG stages, normally 5.
+ dilations (Sequence[int]): Dilation of each stage.
+ out_indices (Sequence[int]): Output from which stages. If only one
+ stage is specified, a single tensor (feature map) is returned,
+ otherwise multiple stages are specified, a tuple of tensors will
+ be returned. When it is None, the default behavior depends on
+ whether num_classes is specified. If num_classes <= 0, the default
+ value is (4, ), outputting the last feature map before classifier.
+ If num_classes > 0, the default value is (5, ), outputting the
+ classification score. Default: None.
+ frozen_stages (int): Stages to be frozen (all param fixed). -1 means
+ not freezing any parameters.
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False.
+ ceil_mode (bool): Whether to use ceil_mode of MaxPool. Default: False.
+ with_last_pool (bool): Whether to keep the last pooling before
+ classifier. Default: True.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm']),
+ dict(
+ type='Normal',
+ std=0.01,
+ layer=['Linear']),
+ ]``
+ """
+
+ # Parameters to build layers. Each element specifies the number of conv in
+ # each stage. For example, VGG11 contains 11 layers with learnable
+ # parameters. 11 is computed as 11 = (1 + 1 + 2 + 2 + 2) + 3,
+ # where 3 indicates the last three fully-connected layers.
+ arch_settings = {
+ 11: (1, 1, 2, 2, 2),
+ 13: (2, 2, 2, 2, 2),
+ 16: (2, 2, 3, 3, 3),
+ 19: (2, 2, 4, 4, 4)
+ }
+
+ def __init__(self,
+ depth,
+ num_classes=-1,
+ num_stages=5,
+ dilations=(1, 1, 1, 1, 1),
+ out_indices=None,
+ frozen_stages=-1,
+ conv_cfg=None,
+ norm_cfg=None,
+ act_cfg=dict(type='ReLU'),
+ norm_eval=False,
+ ceil_mode=False,
+ with_last_pool=True,
+ init_cfg=[
+ dict(type='Kaiming', layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm']),
+ dict(type='Normal', std=0.01, layer=['Linear']),
+ ]):
+ super().__init__(init_cfg=init_cfg)
+ if depth not in self.arch_settings:
+ raise KeyError(f'invalid depth {depth} for vgg')
+ assert num_stages >= 1 and num_stages <= 5
+ stage_blocks = self.arch_settings[depth]
+ self.stage_blocks = stage_blocks[:num_stages]
+ assert len(dilations) == num_stages
+
+ self.num_classes = num_classes
+ self.frozen_stages = frozen_stages
+ self.norm_eval = norm_eval
+ with_norm = norm_cfg is not None
+
+ if out_indices is None:
+ out_indices = (5, ) if num_classes > 0 else (4, )
+ assert max(out_indices) <= num_stages
+ self.out_indices = out_indices
+
+ self.in_channels = 3
+ start_idx = 0
+ vgg_layers = []
+ self.range_sub_modules = []
+ for i, num_blocks in enumerate(self.stage_blocks):
+ num_modules = num_blocks + 1
+ end_idx = start_idx + num_modules
+ dilation = dilations[i]
+ out_channels = 64 * 2**i if i < 4 else 512
+ vgg_layer = make_vgg_layer(
+ self.in_channels,
+ out_channels,
+ num_blocks,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg,
+ dilation=dilation,
+ with_norm=with_norm,
+ ceil_mode=ceil_mode)
+ vgg_layers.extend(vgg_layer)
+ self.in_channels = out_channels
+ self.range_sub_modules.append([start_idx, end_idx])
+ start_idx = end_idx
+ if not with_last_pool:
+ vgg_layers.pop(-1)
+ self.range_sub_modules[-1][1] -= 1
+ self.module_name = 'features'
+ self.add_module(self.module_name, nn.Sequential(*vgg_layers))
+
+ if self.num_classes > 0:
+ self.classifier = nn.Sequential(
+ nn.Linear(512 * 7 * 7, 4096),
+ nn.ReLU(True),
+ nn.Dropout(),
+ nn.Linear(4096, 4096),
+ nn.ReLU(True),
+ nn.Dropout(),
+ nn.Linear(4096, num_classes),
+ )
+
+ def forward(self, x):
+ outs = []
+ vgg_layers = getattr(self, self.module_name)
+ for i in range(len(self.stage_blocks)):
+ for j in range(*self.range_sub_modules[i]):
+ vgg_layer = vgg_layers[j]
+ x = vgg_layer(x)
+ if i in self.out_indices:
+ outs.append(x)
+ if self.num_classes > 0:
+ x = x.view(x.size(0), -1)
+ x = self.classifier(x)
+ outs.append(x)
+
+ return tuple(outs)
+
+ def _freeze_stages(self):
+ vgg_layers = getattr(self, self.module_name)
+ for i in range(self.frozen_stages):
+ for j in range(*self.range_sub_modules[i]):
+ m = vgg_layers[j]
+ m.eval()
+ for param in m.parameters():
+ param.requires_grad = False
+
+ def train(self, mode=True):
+ super().train(mode)
+ self._freeze_stages()
+ if mode and self.norm_eval:
+ for m in self.modules():
+ # trick: eval have effect on BatchNorm only
+ if isinstance(m, _BatchNorm):
+ m.eval()
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/vipnas_mbv3.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/vipnas_mbv3.py
new file mode 100644
index 0000000000000000000000000000000000000000..f096283da97fb914e4f06063aa96c79e7d977843
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/vipnas_mbv3.py
@@ -0,0 +1,178 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+
+from mmcv.cnn import ConvModule
+from torch.nn.modules.batchnorm import _BatchNorm
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+from .utils import InvertedResidual
+
+
+@MODELS.register_module()
+class ViPNAS_MobileNetV3(BaseBackbone):
+ """ViPNAS_MobileNetV3 backbone.
+
+ "ViPNAS: Efficient Video Pose Estimation via Neural Architecture Search"
+ More details can be found in the `paper
+ `__ .
+
+ Args:
+ wid (list(int)): Searched width config for each stage.
+ expan (list(int)): Searched expansion ratio config for each stage.
+ dep (list(int)): Searched depth config for each stage.
+ ks (list(int)): Searched kernel size config for each stage.
+ group (list(int)): Searched group number config for each stage.
+ att (list(bool)): Searched attention config for each stage.
+ stride (list(int)): Stride config for each stage.
+ act (list(dict)): Activation config for each stage.
+ conv_cfg (dict): Config dict for convolution layer.
+ Default: None, which means using conv2d.
+ norm_cfg (dict): Config dict for normalization layer.
+ Default: dict(type='BN').
+ frozen_stages (int): Stages to be frozen (all param fixed).
+ Default: -1, which means not freezing any parameters.
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False.
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save
+ some memory while slowing down the training speed.
+ Default: False.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+ """
+
+ def __init__(
+ self,
+ wid=[16, 16, 24, 40, 80, 112, 160],
+ expan=[None, 1, 5, 4, 5, 5, 6],
+ dep=[None, 1, 4, 4, 4, 4, 4],
+ ks=[3, 3, 7, 7, 5, 7, 5],
+ group=[None, 8, 120, 20, 100, 280, 240],
+ att=[None, True, True, False, True, True, True],
+ stride=[2, 1, 2, 2, 2, 1, 2],
+ act=['HSwish', 'ReLU', 'ReLU', 'ReLU', 'HSwish', 'HSwish', 'HSwish'],
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ frozen_stages=-1,
+ norm_eval=False,
+ with_cp=False,
+ init_cfg=[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(type='Constant', val=1, layer=['_BatchNorm', 'GroupNorm'])
+ ],
+ ):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ self.wid = wid
+ self.expan = expan
+ self.dep = dep
+ self.ks = ks
+ self.group = group
+ self.att = att
+ self.stride = stride
+ self.act = act
+ self.conv_cfg = conv_cfg
+ self.norm_cfg = norm_cfg
+ self.frozen_stages = frozen_stages
+ self.norm_eval = norm_eval
+ self.with_cp = with_cp
+
+ self.conv1 = ConvModule(
+ in_channels=3,
+ out_channels=self.wid[0],
+ kernel_size=self.ks[0],
+ stride=self.stride[0],
+ padding=self.ks[0] // 2,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=dict(type=self.act[0]))
+
+ self.layers = self._make_layer()
+
+ def _make_layer(self):
+ layers = []
+ layer_index = 0
+ for i, dep in enumerate(self.dep[1:]):
+ mid_channels = self.wid[i + 1] * self.expan[i + 1]
+
+ if self.att[i + 1]:
+ se_cfg = dict(
+ channels=mid_channels,
+ ratio=4,
+ act_cfg=(dict(type='ReLU'),
+ dict(type='HSigmoid', bias=1.0, divisor=2.0)))
+ else:
+ se_cfg = None
+
+ if self.expan[i + 1] == 1:
+ with_expand_conv = False
+ else:
+ with_expand_conv = True
+
+ for j in range(dep):
+ if j == 0:
+ stride = self.stride[i + 1]
+ in_channels = self.wid[i]
+ else:
+ stride = 1
+ in_channels = self.wid[i + 1]
+
+ layer = InvertedResidual(
+ in_channels=in_channels,
+ out_channels=self.wid[i + 1],
+ mid_channels=mid_channels,
+ kernel_size=self.ks[i + 1],
+ groups=self.group[i + 1],
+ stride=stride,
+ se_cfg=se_cfg,
+ with_expand_conv=with_expand_conv,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ act_cfg=dict(type=self.act[i + 1]),
+ with_cp=self.with_cp)
+ layer_index += 1
+ layer_name = f'layer{layer_index}'
+ self.add_module(layer_name, layer)
+ layers.append(layer_name)
+ return layers
+
+ def forward(self, x):
+ x = self.conv1(x)
+
+ for i, layer_name in enumerate(self.layers):
+ layer = getattr(self, layer_name)
+ x = layer(x)
+
+ return (x, )
+
+ def _freeze_stages(self):
+ if self.frozen_stages >= 0:
+ for param in self.conv1.parameters():
+ param.requires_grad = False
+ for i in range(1, self.frozen_stages + 1):
+ layer = getattr(self, f'layer{i}')
+ layer.eval()
+ for param in layer.parameters():
+ param.requires_grad = False
+
+ def train(self, mode=True):
+ super().train(mode)
+ self._freeze_stages()
+ if mode and self.norm_eval:
+ for m in self.modules():
+ if isinstance(m, _BatchNorm):
+ m.eval()
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/vipnas_resnet.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/vipnas_resnet.py
new file mode 100644
index 0000000000000000000000000000000000000000..2b7ec3946a520711650bca466a49aa06d4688a7a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/backbones/vipnas_resnet.py
@@ -0,0 +1,601 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+
+import torch.nn as nn
+import torch.utils.checkpoint as cp
+from mmcv.cnn import ConvModule, build_conv_layer, build_norm_layer
+from mmcv.cnn.bricks import ContextBlock
+from mmengine.model import BaseModule, Sequential
+from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm
+
+from mmpose.registry import MODELS
+from .base_backbone import BaseBackbone
+
+
+class ViPNAS_Bottleneck(BaseModule):
+ """Bottleneck block for ViPNAS_ResNet.
+
+ Args:
+ in_channels (int): Input channels of this block.
+ out_channels (int): Output channels of this block.
+ expansion (int): The ratio of ``out_channels/mid_channels`` where
+ ``mid_channels`` is the input/output channels of conv2. Default: 4.
+ stride (int): stride of the block. Default: 1
+ dilation (int): dilation of convolution. Default: 1
+ downsample (nn.Module): downsample operation on identity branch.
+ Default: None.
+ style (str): ``"pytorch"`` or ``"caffe"``. If set to "pytorch", the
+ stride-two layer is the 3x3 conv layer, otherwise the stride-two
+ layer is the first 1x1 conv layer. Default: "pytorch".
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed.
+ conv_cfg (dict): dictionary to construct and config conv layer.
+ Default: None
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ kernel_size (int): kernel size of conv2 searched in ViPANS.
+ groups (int): group number of conv2 searched in ViPNAS.
+ attention (bool): whether to use attention module in the end of
+ the block.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ expansion=4,
+ stride=1,
+ dilation=1,
+ downsample=None,
+ style='pytorch',
+ with_cp=False,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ kernel_size=3,
+ groups=1,
+ attention=False,
+ init_cfg=None):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ assert style in ['pytorch', 'caffe']
+
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+ self.expansion = expansion
+ assert out_channels % expansion == 0
+ self.mid_channels = out_channels // expansion
+ self.stride = stride
+ self.dilation = dilation
+ self.style = style
+ self.with_cp = with_cp
+ self.conv_cfg = conv_cfg
+ self.norm_cfg = norm_cfg
+
+ if self.style == 'pytorch':
+ self.conv1_stride = 1
+ self.conv2_stride = stride
+ else:
+ self.conv1_stride = stride
+ self.conv2_stride = 1
+
+ self.norm1_name, norm1 = build_norm_layer(
+ norm_cfg, self.mid_channels, postfix=1)
+ self.norm2_name, norm2 = build_norm_layer(
+ norm_cfg, self.mid_channels, postfix=2)
+ self.norm3_name, norm3 = build_norm_layer(
+ norm_cfg, out_channels, postfix=3)
+
+ self.conv1 = build_conv_layer(
+ conv_cfg,
+ in_channels,
+ self.mid_channels,
+ kernel_size=1,
+ stride=self.conv1_stride,
+ bias=False)
+ self.add_module(self.norm1_name, norm1)
+ self.conv2 = build_conv_layer(
+ conv_cfg,
+ self.mid_channels,
+ self.mid_channels,
+ kernel_size=kernel_size,
+ stride=self.conv2_stride,
+ padding=kernel_size // 2,
+ groups=groups,
+ dilation=dilation,
+ bias=False)
+
+ self.add_module(self.norm2_name, norm2)
+ self.conv3 = build_conv_layer(
+ conv_cfg,
+ self.mid_channels,
+ out_channels,
+ kernel_size=1,
+ bias=False)
+ self.add_module(self.norm3_name, norm3)
+
+ if attention:
+ self.attention = ContextBlock(out_channels,
+ max(1.0 / 16, 16.0 / out_channels))
+ else:
+ self.attention = None
+
+ self.relu = nn.ReLU(inplace=True)
+ self.downsample = downsample
+
+ @property
+ def norm1(self):
+ """nn.Module: the normalization layer named "norm1" """
+ return getattr(self, self.norm1_name)
+
+ @property
+ def norm2(self):
+ """nn.Module: the normalization layer named "norm2" """
+ return getattr(self, self.norm2_name)
+
+ @property
+ def norm3(self):
+ """nn.Module: the normalization layer named "norm3" """
+ return getattr(self, self.norm3_name)
+
+ def forward(self, x):
+ """Forward function."""
+
+ def _inner_forward(x):
+ identity = x
+
+ out = self.conv1(x)
+ out = self.norm1(out)
+ out = self.relu(out)
+
+ out = self.conv2(out)
+ out = self.norm2(out)
+ out = self.relu(out)
+
+ out = self.conv3(out)
+ out = self.norm3(out)
+
+ if self.attention is not None:
+ out = self.attention(out)
+
+ if self.downsample is not None:
+ identity = self.downsample(x)
+
+ out += identity
+
+ return out
+
+ if self.with_cp and x.requires_grad:
+ out = cp.checkpoint(_inner_forward, x)
+ else:
+ out = _inner_forward(x)
+
+ out = self.relu(out)
+
+ return out
+
+
+def get_expansion(block, expansion=None):
+ """Get the expansion of a residual block.
+
+ The block expansion will be obtained by the following order:
+
+ 1. If ``expansion`` is given, just return it.
+ 2. If ``block`` has the attribute ``expansion``, then return
+ ``block.expansion``.
+ 3. Return the default value according the the block type:
+ 4 for ``ViPNAS_Bottleneck``.
+
+ Args:
+ block (class): The block class.
+ expansion (int | None): The given expansion ratio.
+
+ Returns:
+ int: The expansion of the block.
+ """
+ if isinstance(expansion, int):
+ assert expansion > 0
+ elif expansion is None:
+ if hasattr(block, 'expansion'):
+ expansion = block.expansion
+ elif issubclass(block, ViPNAS_Bottleneck):
+ expansion = 1
+ else:
+ raise TypeError(f'expansion is not specified for {block.__name__}')
+ else:
+ raise TypeError('expansion must be an integer or None')
+
+ return expansion
+
+
+class ViPNAS_ResLayer(Sequential):
+ """ViPNAS_ResLayer to build ResNet style backbone.
+
+ Args:
+ block (nn.Module): Residual block used to build ViPNAS ResLayer.
+ num_blocks (int): Number of blocks.
+ in_channels (int): Input channels of this block.
+ out_channels (int): Output channels of this block.
+ expansion (int, optional): The expansion for BasicBlock/Bottleneck.
+ If not specified, it will firstly be obtained via
+ ``block.expansion``. If the block has no attribute "expansion",
+ the following default values will be used: 1 for BasicBlock and
+ 4 for Bottleneck. Default: None.
+ stride (int): stride of the first block. Default: 1.
+ avg_down (bool): Use AvgPool instead of stride conv when
+ downsampling in the bottleneck. Default: False
+ conv_cfg (dict): dictionary to construct and config conv layer.
+ Default: None
+ norm_cfg (dict): dictionary to construct and config norm layer.
+ Default: dict(type='BN')
+ downsample_first (bool): Downsample at the first block or last block.
+ False for Hourglass, True for ResNet. Default: True
+ kernel_size (int): Kernel Size of the corresponding convolution layer
+ searched in the block.
+ groups (int): Group number of the corresponding convolution layer
+ searched in the block.
+ attention (bool): Whether to use attention module in the end of the
+ block.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default: None
+ """
+
+ def __init__(self,
+ block,
+ num_blocks,
+ in_channels,
+ out_channels,
+ expansion=None,
+ stride=1,
+ avg_down=False,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN'),
+ downsample_first=True,
+ kernel_size=3,
+ groups=1,
+ attention=False,
+ init_cfg=None,
+ **kwargs):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ self.block = block
+ self.expansion = get_expansion(block, expansion)
+
+ downsample = None
+ if stride != 1 or in_channels != out_channels:
+ downsample = []
+ conv_stride = stride
+ if avg_down and stride != 1:
+ conv_stride = 1
+ downsample.append(
+ nn.AvgPool2d(
+ kernel_size=stride,
+ stride=stride,
+ ceil_mode=True,
+ count_include_pad=False))
+ downsample.extend([
+ build_conv_layer(
+ conv_cfg,
+ in_channels,
+ out_channels,
+ kernel_size=1,
+ stride=conv_stride,
+ bias=False),
+ build_norm_layer(norm_cfg, out_channels)[1]
+ ])
+ downsample = nn.Sequential(*downsample)
+
+ layers = []
+ if downsample_first:
+ layers.append(
+ block(
+ in_channels=in_channels,
+ out_channels=out_channels,
+ expansion=self.expansion,
+ stride=stride,
+ downsample=downsample,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ kernel_size=kernel_size,
+ groups=groups,
+ attention=attention,
+ **kwargs))
+ in_channels = out_channels
+ for _ in range(1, num_blocks):
+ layers.append(
+ block(
+ in_channels=in_channels,
+ out_channels=out_channels,
+ expansion=self.expansion,
+ stride=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ kernel_size=kernel_size,
+ groups=groups,
+ attention=attention,
+ **kwargs))
+ else: # downsample_first=False is for HourglassModule
+ for i in range(0, num_blocks - 1):
+ layers.append(
+ block(
+ in_channels=in_channels,
+ out_channels=in_channels,
+ expansion=self.expansion,
+ stride=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ kernel_size=kernel_size,
+ groups=groups,
+ attention=attention,
+ **kwargs))
+ layers.append(
+ block(
+ in_channels=in_channels,
+ out_channels=out_channels,
+ expansion=self.expansion,
+ stride=stride,
+ downsample=downsample,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ kernel_size=kernel_size,
+ groups=groups,
+ attention=attention,
+ **kwargs))
+
+ super().__init__(*layers, init_cfg=init_cfg)
+
+
+@MODELS.register_module()
+class ViPNAS_ResNet(BaseBackbone):
+ """ViPNAS_ResNet backbone.
+
+ "ViPNAS: Efficient Video Pose Estimation via Neural Architecture Search"
+ More details can be found in the `paper
+ `__ .
+
+ Args:
+ depth (int): Network depth, from {18, 34, 50, 101, 152}.
+ in_channels (int): Number of input image channels. Default: 3.
+ num_stages (int): Stages of the network. Default: 4.
+ strides (Sequence[int]): Strides of the first block of each stage.
+ Default: ``(1, 2, 2, 2)``.
+ dilations (Sequence[int]): Dilation of each stage.
+ Default: ``(1, 1, 1, 1)``.
+ out_indices (Sequence[int]): Output from which stages. If only one
+ stage is specified, a single tensor (feature map) is returned,
+ otherwise multiple stages are specified, a tuple of tensors will
+ be returned. Default: ``(3, )``.
+ style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two
+ layer is the 3x3 conv layer, otherwise the stride-two layer is
+ the first 1x1 conv layer.
+ deep_stem (bool): Replace 7x7 conv in input stem with 3 3x3 conv.
+ Default: False.
+ avg_down (bool): Use AvgPool instead of stride conv when
+ downsampling in the bottleneck. Default: False.
+ frozen_stages (int): Stages to be frozen (stop grad and set eval mode).
+ -1 means not freezing any parameters. Default: -1.
+ conv_cfg (dict | None): The config dict for conv layers. Default: None.
+ norm_cfg (dict): The config dict for norm layers.
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False.
+ with_cp (bool): Use checkpoint or not. Using checkpoint will save some
+ memory while slowing down the training speed. Default: False.
+ zero_init_residual (bool): Whether to use zero init for last norm layer
+ in resblocks to let them behave as identity. Default: True.
+ wid (list(int)): Searched width config for each stage.
+ expan (list(int)): Searched expansion ratio config for each stage.
+ dep (list(int)): Searched depth config for each stage.
+ ks (list(int)): Searched kernel size config for each stage.
+ group (list(int)): Searched group number config for each stage.
+ att (list(bool)): Searched attention config for each stage.
+ init_cfg (dict or list[dict], optional): Initialization config dict.
+ Default:
+ ``[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]``
+ """
+
+ arch_settings = {
+ 50: ViPNAS_Bottleneck,
+ }
+
+ def __init__(self,
+ depth,
+ in_channels=3,
+ num_stages=4,
+ strides=(1, 2, 2, 2),
+ dilations=(1, 1, 1, 1),
+ out_indices=(3, ),
+ style='pytorch',
+ deep_stem=False,
+ avg_down=False,
+ frozen_stages=-1,
+ conv_cfg=None,
+ norm_cfg=dict(type='BN', requires_grad=True),
+ norm_eval=False,
+ with_cp=False,
+ zero_init_residual=True,
+ wid=[48, 80, 160, 304, 608],
+ expan=[None, 1, 1, 1, 1],
+ dep=[None, 4, 6, 7, 3],
+ ks=[7, 3, 5, 5, 5],
+ group=[None, 16, 16, 16, 16],
+ att=[None, True, False, True, True],
+ init_cfg=[
+ dict(type='Normal', std=0.001, layer=['Conv2d']),
+ dict(
+ type='Constant',
+ val=1,
+ layer=['_BatchNorm', 'GroupNorm'])
+ ]):
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ super().__init__(init_cfg=init_cfg)
+ if depth not in self.arch_settings:
+ raise KeyError(f'invalid depth {depth} for resnet')
+ self.depth = depth
+ self.stem_channels = dep[0]
+ self.num_stages = num_stages
+ assert 1 <= num_stages <= 4
+ self.strides = strides
+ self.dilations = dilations
+ assert len(strides) == len(dilations) == num_stages
+ self.out_indices = out_indices
+ assert max(out_indices) < num_stages
+ self.style = style
+ self.deep_stem = deep_stem
+ self.avg_down = avg_down
+ self.frozen_stages = frozen_stages
+ self.conv_cfg = conv_cfg
+ self.norm_cfg = norm_cfg
+ self.with_cp = with_cp
+ self.norm_eval = norm_eval
+ self.zero_init_residual = zero_init_residual
+ self.block = self.arch_settings[depth]
+ self.stage_blocks = dep[1:1 + num_stages]
+
+ self._make_stem_layer(in_channels, wid[0], ks[0])
+
+ self.res_layers = []
+ _in_channels = wid[0]
+ for i, num_blocks in enumerate(self.stage_blocks):
+ expansion = get_expansion(self.block, expan[i + 1])
+ _out_channels = wid[i + 1] * expansion
+ stride = strides[i]
+ dilation = dilations[i]
+ res_layer = self.make_res_layer(
+ block=self.block,
+ num_blocks=num_blocks,
+ in_channels=_in_channels,
+ out_channels=_out_channels,
+ expansion=expansion,
+ stride=stride,
+ dilation=dilation,
+ style=self.style,
+ avg_down=self.avg_down,
+ with_cp=with_cp,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ kernel_size=ks[i + 1],
+ groups=group[i + 1],
+ attention=att[i + 1])
+ _in_channels = _out_channels
+ layer_name = f'layer{i + 1}'
+ self.add_module(layer_name, res_layer)
+ self.res_layers.append(layer_name)
+
+ self._freeze_stages()
+
+ self.feat_dim = res_layer[-1].out_channels
+
+ def make_res_layer(self, **kwargs):
+ """Make a ViPNAS ResLayer."""
+ return ViPNAS_ResLayer(**kwargs)
+
+ @property
+ def norm1(self):
+ """nn.Module: the normalization layer named "norm1" """
+ return getattr(self, self.norm1_name)
+
+ def _make_stem_layer(self, in_channels, stem_channels, kernel_size):
+ """Make stem layer."""
+ if self.deep_stem:
+ self.stem = nn.Sequential(
+ ConvModule(
+ in_channels,
+ stem_channels // 2,
+ kernel_size=3,
+ stride=2,
+ padding=1,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ inplace=True),
+ ConvModule(
+ stem_channels // 2,
+ stem_channels // 2,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ inplace=True),
+ ConvModule(
+ stem_channels // 2,
+ stem_channels,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ conv_cfg=self.conv_cfg,
+ norm_cfg=self.norm_cfg,
+ inplace=True))
+ else:
+ self.conv1 = build_conv_layer(
+ self.conv_cfg,
+ in_channels,
+ stem_channels,
+ kernel_size=kernel_size,
+ stride=2,
+ padding=kernel_size // 2,
+ bias=False)
+ self.norm1_name, norm1 = build_norm_layer(
+ self.norm_cfg, stem_channels, postfix=1)
+ self.add_module(self.norm1_name, norm1)
+ self.relu = nn.ReLU(inplace=True)
+ self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
+
+ def _freeze_stages(self):
+ """Freeze parameters."""
+ if self.frozen_stages >= 0:
+ if self.deep_stem:
+ self.stem.eval()
+ for param in self.stem.parameters():
+ param.requires_grad = False
+ else:
+ self.norm1.eval()
+ for m in [self.conv1, self.norm1]:
+ for param in m.parameters():
+ param.requires_grad = False
+
+ for i in range(1, self.frozen_stages + 1):
+ m = getattr(self, f'layer{i}')
+ m.eval()
+ for param in m.parameters():
+ param.requires_grad = False
+
+ def forward(self, x):
+ """Forward function."""
+ if self.deep_stem:
+ x = self.stem(x)
+ else:
+ x = self.conv1(x)
+ x = self.norm1(x)
+ x = self.relu(x)
+ x = self.maxpool(x)
+ outs = []
+ for i, layer_name in enumerate(self.res_layers):
+ res_layer = getattr(self, layer_name)
+ x = res_layer(x)
+ if i in self.out_indices:
+ outs.append(x)
+ return tuple(outs)
+
+ def train(self, mode=True):
+ """Convert the model into training mode."""
+ super().train(mode)
+ self._freeze_stages()
+ if mode and self.norm_eval:
+ for m in self.modules():
+ # trick: eval have effect on BatchNorm only
+ if isinstance(m, _BatchNorm):
+ m.eval()
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/builder.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/builder.py
new file mode 100644
index 0000000000000000000000000000000000000000..d94672c04d72248650e65b0cc7ea89fc02825df5
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/builder.py
@@ -0,0 +1,48 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import warnings
+
+from mmpose.registry import MODELS
+
+BACKBONES = MODELS
+NECKS = MODELS
+HEADS = MODELS
+LOSSES = MODELS
+POSE_ESTIMATORS = MODELS
+
+
+def build_backbone(cfg):
+ """Build backbone."""
+ return BACKBONES.build(cfg)
+
+
+def build_neck(cfg):
+ """Build neck."""
+ return NECKS.build(cfg)
+
+
+def build_head(cfg):
+ """Build head."""
+ return HEADS.build(cfg)
+
+
+def build_loss(cfg):
+ """Build loss."""
+ return LOSSES.build(cfg)
+
+
+def build_pose_estimator(cfg):
+ """Build pose estimator."""
+ return POSE_ESTIMATORS.build(cfg)
+
+
+def build_posenet(cfg):
+ """Build posenet."""
+ warnings.warn(
+ '``build_posenet`` will be deprecated soon, '
+ 'please use ``build_pose_estimator`` instead.', DeprecationWarning)
+ return build_pose_estimator(cfg)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/data_preprocessors/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/data_preprocessors/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..4967596c86e111de86b2f634f93f8e690cce7e8b
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/data_preprocessors/__init__.py
@@ -0,0 +1,9 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .data_preprocessor import PoseDataPreprocessor
+
+__all__ = ['PoseDataPreprocessor']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/data_preprocessors/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/data_preprocessors/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..68d108dd3cb184c49b45b8538153819b066bed48
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/data_preprocessors/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/data_preprocessors/__pycache__/data_preprocessor.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/data_preprocessors/__pycache__/data_preprocessor.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9ec1eb86ba6cfacfba50ce2cc07596b255f8b5f9
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/data_preprocessors/__pycache__/data_preprocessor.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/data_preprocessors/data_preprocessor.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/data_preprocessors/data_preprocessor.py
new file mode 100644
index 0000000000000000000000000000000000000000..b1cbaed118fe3ef7c62f75b1cc70dc5b50dd8cd3
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/data_preprocessors/data_preprocessor.py
@@ -0,0 +1,14 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmengine.model import ImgDataPreprocessor
+
+from mmpose.registry import MODELS
+
+
+@MODELS.register_module()
+class PoseDataPreprocessor(ImgDataPreprocessor):
+ """Image pre-processor for pose estimation tasks."""
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..7f96900c41d00cad5021909825704eeaa44621f4
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/__init__.py
@@ -0,0 +1,22 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .base_head import BaseHead
+from .coord_cls_heads import RTMCCHead, SimCCHead
+from .heatmap_heads import (AssociativeEmbeddingHead, CIDHead, CPMHead,
+ HeatmapHead, MSPNHead, ViPNASHead)
+from .hybrid_heads import DEKRHead, VisPredictHead
+from .regression_heads import (DSNTHead, IntegralRegressionHead,
+ RegressionHead, RLEHead, TemporalRegressionHead,
+ TrajectoryRegressionHead)
+
+__all__ = [
+ 'BaseHead', 'HeatmapHead', 'CPMHead', 'MSPNHead', 'ViPNASHead',
+ 'RegressionHead', 'IntegralRegressionHead', 'SimCCHead', 'RLEHead',
+ 'DSNTHead', 'AssociativeEmbeddingHead', 'DEKRHead', 'VisPredictHead',
+ 'CIDHead', 'RTMCCHead', 'TemporalRegressionHead',
+ 'TrajectoryRegressionHead',
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b743a1ffe6adff72a9522b4b503243637d4abf4c
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/__pycache__/base_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/__pycache__/base_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5553a77d3a1c89e4e744b6f38ed240d82bfb4ec5
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/__pycache__/base_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/base_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/base_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..2c7d7609d1d7e33e34b5945897e7e3cf204f425f
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/base_head.py
@@ -0,0 +1,88 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from abc import ABCMeta, abstractmethod
+from typing import Tuple, Union
+
+from mmengine.model import BaseModule
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmpose.utils.tensor_utils import to_numpy
+from mmpose.utils.typing import (Features, InstanceList, OptConfigType,
+ OptSampleList, Predictions)
+
+
+class BaseHead(BaseModule, metaclass=ABCMeta):
+ """Base head. A subclass should override :meth:`predict` and :meth:`loss`.
+
+ Args:
+ init_cfg (dict, optional): The extra init config of layers.
+ Defaults to None.
+ """
+
+ @abstractmethod
+ def forward(self, feats: Tuple[Tensor]):
+ """Forward the network."""
+
+ @abstractmethod
+ def predict(self,
+ feats: Features,
+ batch_data_samples: OptSampleList,
+ test_cfg: OptConfigType = {}) -> Predictions:
+ """Predict results from features."""
+
+ @abstractmethod
+ def loss(self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ train_cfg: OptConfigType = {}) -> dict:
+ """Calculate losses from a batch of inputs and data samples."""
+
+ def decode(self, batch_outputs: Union[Tensor,
+ Tuple[Tensor]]) -> InstanceList:
+ """Decode keypoints from outputs.
+
+ Args:
+ batch_outputs (Tensor | Tuple[Tensor]): The network outputs of
+ a data batch
+
+ Returns:
+ List[InstanceData]: A list of InstanceData, each contains the
+ decoded pose information of the instances of one data sample.
+ """
+
+ def _pack_and_call(args, func):
+ if not isinstance(args, tuple):
+ args = (args, )
+ return func(*args)
+
+ if self.decoder is None:
+ raise RuntimeError(
+ f'The decoder has not been set in {self.__class__.__name__}. '
+ 'Please set the decoder configs in the init parameters to '
+ 'enable head methods `head.predict()` and `head.decode()`')
+
+ if self.decoder.support_batch_decoding:
+ batch_keypoints, batch_scores = _pack_and_call(
+ batch_outputs, self.decoder.batch_decode)
+
+ else:
+ batch_output_np = to_numpy(batch_outputs, unzip=True)
+ batch_keypoints = []
+ batch_scores = []
+ for outputs in batch_output_np:
+ keypoints, scores = _pack_and_call(outputs,
+ self.decoder.decode)
+ batch_keypoints.append(keypoints)
+ batch_scores.append(scores)
+
+ preds = [
+ InstanceData(keypoints=keypoints, keypoint_scores=scores)
+ for keypoints, scores in zip(batch_keypoints, batch_scores)
+ ]
+
+ return preds
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..7b57b70294d07959e698f6a385b6827f2804e111
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/__init__.py
@@ -0,0 +1,10 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .rtmcc_head import RTMCCHead
+from .simcc_head import SimCCHead
+
+__all__ = ['SimCCHead', 'RTMCCHead']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ea2aa8adf0d0dcf40190a382a03775e9fbe7676b
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/__pycache__/rtmcc_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/__pycache__/rtmcc_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c8b2ed0790a912f7e5f42d2d05a3ef304d9ddd16
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/__pycache__/rtmcc_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/__pycache__/simcc_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/__pycache__/simcc_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2ca54e29a6165b604086c9c065b53994b954fb51
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/__pycache__/simcc_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/rtmcc_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/rtmcc_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..583edc70183559ca2f55385382006007d680a648
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/rtmcc_head.py
@@ -0,0 +1,308 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import warnings
+from typing import Optional, Sequence, Tuple, Union
+
+import torch
+from mmengine.dist import get_dist_info
+from mmengine.structures import PixelData
+from torch import Tensor, nn
+
+from mmpose.codecs.utils import get_simcc_normalized
+from mmpose.evaluation.functional import simcc_pck_accuracy
+from mmpose.models.utils.rtmcc_block import RTMCCBlock, ScaleNorm
+from mmpose.models.utils.tta import flip_vectors
+from mmpose.registry import KEYPOINT_CODECS, MODELS
+from mmpose.utils.tensor_utils import to_numpy
+from mmpose.utils.typing import (ConfigType, InstanceList, OptConfigType,
+ OptSampleList)
+from ..base_head import BaseHead
+
+OptIntSeq = Optional[Sequence[int]]
+
+
+@MODELS.register_module()
+class RTMCCHead(BaseHead):
+ """Top-down head introduced in RTMPose (2023). The head is composed of a
+ large-kernel convolutional layer, a fully-connected layer and a Gated
+ Attention Unit to generate 1d representation from low-resolution feature
+ maps.
+
+ Args:
+ in_channels (int | sequence[int]): Number of channels in the input
+ feature map.
+ out_channels (int): Number of channels in the output heatmap.
+ input_size (tuple): Size of input image in shape [w, h].
+ in_featuremap_size (int | sequence[int]): Size of input feature map.
+ simcc_split_ratio (float): Split ratio of pixels.
+ Default: 2.0.
+ final_layer_kernel_size (int): Kernel size of the convolutional layer.
+ Default: 1.
+ gau_cfg (Config): Config dict for the Gated Attention Unit.
+ Default: dict(
+ hidden_dims=256,
+ s=128,
+ expansion_factor=2,
+ dropout_rate=0.,
+ drop_path=0.,
+ act_fn='ReLU',
+ use_rel_bias=False,
+ pos_enc=False).
+ loss (Config): Config of the keypoint loss. Defaults to use
+ :class:`KLDiscretLoss`
+ decoder (Config, optional): The decoder config that controls decoding
+ keypoint coordinates from the network output. Defaults to ``None``
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+ """
+
+ def __init__(
+ self,
+ in_channels: Union[int, Sequence[int]],
+ out_channels: int,
+ input_size: Tuple[int, int],
+ in_featuremap_size: Tuple[int, int],
+ simcc_split_ratio: float = 2.0,
+ final_layer_kernel_size: int = 1,
+ gau_cfg: ConfigType = dict(
+ hidden_dims=256,
+ s=128,
+ expansion_factor=2,
+ dropout_rate=0.,
+ drop_path=0.,
+ act_fn='ReLU',
+ use_rel_bias=False,
+ pos_enc=False),
+ loss: ConfigType = dict(type='KLDiscretLoss', use_target_weight=True),
+ decoder: OptConfigType = None,
+ init_cfg: OptConfigType = None,
+ ):
+
+ if init_cfg is None:
+ init_cfg = self.default_init_cfg
+
+ super().__init__(init_cfg)
+
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+ self.input_size = input_size
+ self.in_featuremap_size = in_featuremap_size
+ self.simcc_split_ratio = simcc_split_ratio
+
+ self.loss_module = MODELS.build(loss)
+ if decoder is not None:
+ self.decoder = KEYPOINT_CODECS.build(decoder)
+ else:
+ self.decoder = None
+
+ if isinstance(in_channels, (tuple, list)):
+ raise ValueError(
+ f'{self.__class__.__name__} does not support selecting '
+ 'multiple input features.')
+
+ # Define SimCC layers
+ flatten_dims = self.in_featuremap_size[0] * self.in_featuremap_size[1]
+
+ self.final_layer = nn.Conv2d(
+ in_channels,
+ out_channels,
+ kernel_size=final_layer_kernel_size,
+ stride=1,
+ padding=final_layer_kernel_size // 2)
+ self.mlp = nn.Sequential(
+ ScaleNorm(flatten_dims),
+ nn.Linear(flatten_dims, gau_cfg['hidden_dims'], bias=False))
+
+ W = int(self.input_size[0] * self.simcc_split_ratio)
+ H = int(self.input_size[1] * self.simcc_split_ratio)
+
+ self.gau = RTMCCBlock(
+ self.out_channels,
+ gau_cfg['hidden_dims'],
+ gau_cfg['hidden_dims'],
+ s=gau_cfg['s'],
+ expansion_factor=gau_cfg['expansion_factor'],
+ dropout_rate=gau_cfg['dropout_rate'],
+ drop_path=gau_cfg['drop_path'],
+ attn_type='self-attn',
+ act_fn=gau_cfg['act_fn'],
+ use_rel_bias=gau_cfg['use_rel_bias'],
+ pos_enc=gau_cfg['pos_enc'])
+
+ self.cls_x = nn.Linear(gau_cfg['hidden_dims'], W, bias=False)
+ self.cls_y = nn.Linear(gau_cfg['hidden_dims'], H, bias=False)
+
+ def forward(self, feats: Tuple[Tensor]) -> Tuple[Tensor, Tensor]:
+ """Forward the network.
+
+ The input is the featuremap extracted by backbone and the
+ output is the simcc representation.
+
+ Args:
+ feats (Tuple[Tensor]): Multi scale feature maps.
+
+ Returns:
+ pred_x (Tensor): 1d representation of x.
+ pred_y (Tensor): 1d representation of y.
+ """
+ feats = feats[-1]
+
+ feats = self.final_layer(feats) # -> B, K, H, W
+
+ # flatten the output heatmap
+ feats = torch.flatten(feats, 2)
+
+ feats = self.mlp(feats) # -> B, K, hidden
+
+ feats = self.gau(feats)
+
+ pred_x = self.cls_x(feats)
+ pred_y = self.cls_y(feats)
+
+ return pred_x, pred_y
+
+ def predict(
+ self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ test_cfg: OptConfigType = {},
+ ) -> InstanceList:
+ """Predict results from features.
+
+ Args:
+ feats (Tuple[Tensor] | List[Tuple[Tensor]]): The multi-stage
+ features (or multiple multi-stage features in TTA)
+ batch_data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+ test_cfg (dict): The runtime config for testing process. Defaults
+ to {}
+
+ Returns:
+ List[InstanceData]: The pose predictions, each contains
+ the following fields:
+ - keypoints (np.ndarray): predicted keypoint coordinates in
+ shape (num_instances, K, D) where K is the keypoint number
+ and D is the keypoint dimension
+ - keypoint_scores (np.ndarray): predicted keypoint scores in
+ shape (num_instances, K)
+ - keypoint_x_labels (np.ndarray, optional): The predicted 1-D
+ intensity distribution in the x direction
+ - keypoint_y_labels (np.ndarray, optional): The predicted 1-D
+ intensity distribution in the y direction
+ """
+
+ if test_cfg.get('flip_test', False):
+ # TTA: flip test -> feats = [orig, flipped]
+ assert isinstance(feats, list) and len(feats) == 2
+ flip_indices = batch_data_samples[0].metainfo['flip_indices']
+ _feats, _feats_flip = feats
+
+ _batch_pred_x, _batch_pred_y = self.forward(_feats)
+
+ _batch_pred_x_flip, _batch_pred_y_flip = self.forward(_feats_flip)
+ _batch_pred_x_flip, _batch_pred_y_flip = flip_vectors(
+ _batch_pred_x_flip,
+ _batch_pred_y_flip,
+ flip_indices=flip_indices)
+
+ batch_pred_x = (_batch_pred_x + _batch_pred_x_flip) * 0.5
+ batch_pred_y = (_batch_pred_y + _batch_pred_y_flip) * 0.5
+ else:
+ batch_pred_x, batch_pred_y = self.forward(feats)
+
+ preds = self.decode((batch_pred_x, batch_pred_y))
+
+ if test_cfg.get('output_heatmaps', False):
+ rank, _ = get_dist_info()
+ if rank == 0:
+ warnings.warn('The predicted simcc values are normalized for '
+ 'visualization. This may cause discrepancy '
+ 'between the keypoint scores and the 1D heatmaps'
+ '.')
+
+ # normalize the predicted 1d distribution
+ batch_pred_x = get_simcc_normalized(batch_pred_x)
+ batch_pred_y = get_simcc_normalized(batch_pred_y)
+
+ B, K, _ = batch_pred_x.shape
+ # B, K, Wx -> B, K, Wx, 1
+ x = batch_pred_x.reshape(B, K, 1, -1)
+ # B, K, Wy -> B, K, 1, Wy
+ y = batch_pred_y.reshape(B, K, -1, 1)
+ # B, K, Wx, Wy
+ batch_heatmaps = torch.matmul(y, x)
+ pred_fields = [
+ PixelData(heatmaps=hm) for hm in batch_heatmaps.detach()
+ ]
+
+ for pred_instances, pred_x, pred_y in zip(preds,
+ to_numpy(batch_pred_x),
+ to_numpy(batch_pred_y)):
+
+ pred_instances.keypoint_x_labels = pred_x[None]
+ pred_instances.keypoint_y_labels = pred_y[None]
+
+ return preds, pred_fields
+ else:
+ return preds
+
+ def loss(
+ self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ train_cfg: OptConfigType = {},
+ ) -> dict:
+ """Calculate losses from a batch of inputs and data samples."""
+
+ pred_x, pred_y = self.forward(feats)
+
+ gt_x = torch.cat([
+ d.gt_instance_labels.keypoint_x_labels for d in batch_data_samples
+ ],
+ dim=0)
+ gt_y = torch.cat([
+ d.gt_instance_labels.keypoint_y_labels for d in batch_data_samples
+ ],
+ dim=0)
+ keypoint_weights = torch.cat(
+ [
+ d.gt_instance_labels.keypoint_weights
+ for d in batch_data_samples
+ ],
+ dim=0,
+ )
+
+ pred_simcc = (pred_x, pred_y)
+ gt_simcc = (gt_x, gt_y)
+
+ # calculate losses
+ losses = dict()
+ loss = self.loss_module(pred_simcc, gt_simcc, keypoint_weights)
+
+ losses.update(loss_kpt=loss)
+
+ # calculate accuracy
+ _, avg_acc, _ = simcc_pck_accuracy(
+ output=to_numpy(pred_simcc),
+ target=to_numpy(gt_simcc),
+ simcc_split_ratio=self.simcc_split_ratio,
+ mask=to_numpy(keypoint_weights) > 0,
+ )
+
+ acc_pose = torch.tensor(avg_acc, device=gt_x.device)
+ losses.update(acc_pose=acc_pose)
+
+ return losses
+
+ @property
+ def default_init_cfg(self):
+ init_cfg = [
+ dict(type='Normal', layer=['Conv2d'], std=0.001),
+ dict(type='Constant', layer='BatchNorm2d', val=1),
+ dict(type='Normal', layer=['Linear'], std=0.01, bias=0),
+ ]
+ return init_cfg
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/simcc_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/simcc_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..70e4f8a617b8574dc4073d5e98fa5adcf244ab4a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/coord_cls_heads/simcc_head.py
@@ -0,0 +1,376 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import warnings
+from typing import Optional, Sequence, Tuple, Union
+
+import torch
+from mmcv.cnn import build_conv_layer
+from mmengine.dist import get_dist_info
+from mmengine.structures import PixelData
+from torch import Tensor, nn
+
+from mmpose.codecs.utils import get_simcc_normalized
+from mmpose.evaluation.functional import simcc_pck_accuracy
+from mmpose.models.utils.tta import flip_vectors
+from mmpose.registry import KEYPOINT_CODECS, MODELS
+from mmpose.utils.tensor_utils import to_numpy
+from mmpose.utils.typing import (ConfigType, InstanceList, OptConfigType,
+ OptSampleList)
+from ..base_head import BaseHead
+
+OptIntSeq = Optional[Sequence[int]]
+
+
+@MODELS.register_module()
+class SimCCHead(BaseHead):
+ """Top-down heatmap head introduced in `SimCC`_ by Li et al (2022). The
+ head is composed of a few deconvolutional layers followed by a fully-
+ connected layer to generate 1d representation from low-resolution feature
+ maps.
+
+ Args:
+ in_channels (int | sequence[int]): Number of channels in the input
+ feature map
+ out_channels (int): Number of channels in the output heatmap
+ input_size (tuple): Input image size in shape [w, h]
+ in_featuremap_size (int | sequence[int]): Size of input feature map
+ simcc_split_ratio (float): Split ratio of pixels
+ deconv_type (str, optional): The type of deconv head which should
+ be one of the following options:
+
+ - ``'heatmap'``: make deconv layers in `HeatmapHead`
+ - ``'vipnas'``: make deconv layers in `ViPNASHead`
+
+ Defaults to ``'Heatmap'``
+ deconv_out_channels (sequence[int]): The output channel number of each
+ deconv layer. Defaults to ``(256, 256, 256)``
+ deconv_kernel_sizes (sequence[int | tuple], optional): The kernel size
+ of each deconv layer. Each element should be either an integer for
+ both height and width dimensions, or a tuple of two integers for
+ the height and the width dimension respectively.Defaults to
+ ``(4, 4, 4)``
+ deconv_num_groups (Sequence[int], optional): The group number of each
+ deconv layer. Defaults to ``(16, 16, 16)``
+ conv_out_channels (sequence[int], optional): The output channel number
+ of each intermediate conv layer. ``None`` means no intermediate
+ conv layer between deconv layers and the final conv layer.
+ Defaults to ``None``
+ conv_kernel_sizes (sequence[int | tuple], optional): The kernel size
+ of each intermediate conv layer. Defaults to ``None``
+ final_layer (dict): Arguments of the final Conv2d layer.
+ Defaults to ``dict(kernel_size=1)``
+ loss (Config): Config of the keypoint loss. Defaults to use
+ :class:`KLDiscretLoss`
+ decoder (Config, optional): The decoder config that controls decoding
+ keypoint coordinates from the network output. Defaults to ``None``
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+
+ .. _`SimCC`: https://arxiv.org/abs/2107.03332
+ """
+
+ _version = 2
+
+ def __init__(
+ self,
+ in_channels: Union[int, Sequence[int]],
+ out_channels: int,
+ input_size: Tuple[int, int],
+ in_featuremap_size: Tuple[int, int],
+ simcc_split_ratio: float = 2.0,
+ deconv_type: str = 'heatmap',
+ deconv_out_channels: OptIntSeq = (256, 256, 256),
+ deconv_kernel_sizes: OptIntSeq = (4, 4, 4),
+ deconv_num_groups: OptIntSeq = (16, 16, 16),
+ conv_out_channels: OptIntSeq = None,
+ conv_kernel_sizes: OptIntSeq = None,
+ final_layer: dict = dict(kernel_size=1),
+ loss: ConfigType = dict(type='KLDiscretLoss', use_target_weight=True),
+ decoder: OptConfigType = None,
+ init_cfg: OptConfigType = None,
+ ):
+
+ if init_cfg is None:
+ init_cfg = self.default_init_cfg
+
+ super().__init__(init_cfg)
+
+ if deconv_type not in {'heatmap', 'vipnas'}:
+ raise ValueError(
+ f'{self.__class__.__name__} got invalid `deconv_type` value'
+ f'{deconv_type}. Should be one of '
+ '{"heatmap", "vipnas"}')
+
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+ self.input_size = input_size
+ self.in_featuremap_size = in_featuremap_size
+ self.simcc_split_ratio = simcc_split_ratio
+ self.loss_module = MODELS.build(loss)
+ if decoder is not None:
+ self.decoder = KEYPOINT_CODECS.build(decoder)
+ else:
+ self.decoder = None
+
+ num_deconv = len(deconv_out_channels) if deconv_out_channels else 0
+ if num_deconv != 0:
+ self.heatmap_size = tuple(
+ [s * (2**num_deconv) for s in in_featuremap_size])
+
+ # deconv layers + 1x1 conv
+ self.deconv_head = self._make_deconv_head(
+ in_channels=in_channels,
+ out_channels=out_channels,
+ deconv_type=deconv_type,
+ deconv_out_channels=deconv_out_channels,
+ deconv_kernel_sizes=deconv_kernel_sizes,
+ deconv_num_groups=deconv_num_groups,
+ conv_out_channels=conv_out_channels,
+ conv_kernel_sizes=conv_kernel_sizes,
+ final_layer=final_layer)
+
+ if final_layer is not None:
+ in_channels = out_channels
+ else:
+ in_channels = deconv_out_channels[-1]
+
+ else:
+ self.deconv_head = None
+
+ if final_layer is not None:
+ cfg = dict(
+ type='Conv2d',
+ in_channels=in_channels,
+ out_channels=out_channels,
+ kernel_size=1)
+ cfg.update(final_layer)
+ self.final_layer = build_conv_layer(cfg)
+ else:
+ self.final_layer = None
+
+ self.heatmap_size = in_featuremap_size
+
+ # Define SimCC layers
+ flatten_dims = self.heatmap_size[0] * self.heatmap_size[1]
+
+ W = int(self.input_size[0] * self.simcc_split_ratio)
+ H = int(self.input_size[1] * self.simcc_split_ratio)
+
+ self.mlp_head_x = nn.Linear(flatten_dims, W)
+ self.mlp_head_y = nn.Linear(flatten_dims, H)
+
+ def _make_deconv_head(
+ self,
+ in_channels: Union[int, Sequence[int]],
+ out_channels: int,
+ deconv_type: str = 'heatmap',
+ deconv_out_channels: OptIntSeq = (256, 256, 256),
+ deconv_kernel_sizes: OptIntSeq = (4, 4, 4),
+ deconv_num_groups: OptIntSeq = (16, 16, 16),
+ conv_out_channels: OptIntSeq = None,
+ conv_kernel_sizes: OptIntSeq = None,
+ final_layer: dict = dict(kernel_size=1)
+ ) -> nn.Module:
+ """Create deconvolutional layers by given parameters."""
+
+ if deconv_type == 'heatmap':
+ deconv_head = MODELS.build(
+ dict(
+ type='HeatmapHead',
+ in_channels=self.in_channels,
+ out_channels=out_channels,
+ deconv_out_channels=deconv_out_channels,
+ deconv_kernel_sizes=deconv_kernel_sizes,
+ conv_out_channels=conv_out_channels,
+ conv_kernel_sizes=conv_kernel_sizes,
+ final_layer=final_layer))
+ else:
+ deconv_head = MODELS.build(
+ dict(
+ type='ViPNASHead',
+ in_channels=in_channels,
+ out_channels=out_channels,
+ deconv_out_channels=deconv_out_channels,
+ deconv_num_groups=deconv_num_groups,
+ conv_out_channels=conv_out_channels,
+ conv_kernel_sizes=conv_kernel_sizes,
+ final_layer=final_layer))
+
+ return deconv_head
+
+ def forward(self, feats: Tuple[Tensor]) -> Tuple[Tensor, Tensor]:
+ """Forward the network.
+
+ The input is the featuremap extracted by backbone and the
+ output is the simcc representation.
+
+ Args:
+ feats (Tuple[Tensor]): Multi scale feature maps.
+
+ Returns:
+ pred_x (Tensor): 1d representation of x.
+ pred_y (Tensor): 1d representation of y.
+ """
+ if self.deconv_head is None:
+ feats = feats[-1]
+ if self.final_layer is not None:
+ feats = self.final_layer(feats)
+ else:
+ feats = self.deconv_head(feats)
+
+ # flatten the output heatmap
+ x = torch.flatten(feats, 2)
+
+ pred_x = self.mlp_head_x(x)
+ pred_y = self.mlp_head_y(x)
+
+ return pred_x, pred_y
+
+ def predict(
+ self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ test_cfg: OptConfigType = {},
+ ) -> InstanceList:
+ """Predict results from features.
+
+ Args:
+ feats (Tuple[Tensor] | List[Tuple[Tensor]]): The multi-stage
+ features (or multiple multi-stage features in TTA)
+ batch_data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+ test_cfg (dict): The runtime config for testing process. Defaults
+ to {}
+
+ Returns:
+ List[InstanceData]: The pose predictions, each contains
+ the following fields:
+
+ - keypoints (np.ndarray): predicted keypoint coordinates in
+ shape (num_instances, K, D) where K is the keypoint number
+ and D is the keypoint dimension
+ - keypoint_scores (np.ndarray): predicted keypoint scores in
+ shape (num_instances, K)
+ - keypoint_x_labels (np.ndarray, optional): The predicted 1-D
+ intensity distribution in the x direction
+ - keypoint_y_labels (np.ndarray, optional): The predicted 1-D
+ intensity distribution in the y direction
+ """
+
+ if test_cfg.get('flip_test', False):
+ # TTA: flip test -> feats = [orig, flipped]
+ assert isinstance(feats, list) and len(feats) == 2
+ flip_indices = batch_data_samples[0].metainfo['flip_indices']
+ _feats, _feats_flip = feats
+
+ _batch_pred_x, _batch_pred_y = self.forward(_feats)
+
+ _batch_pred_x_flip, _batch_pred_y_flip = self.forward(_feats_flip)
+ _batch_pred_x_flip, _batch_pred_y_flip = flip_vectors(
+ _batch_pred_x_flip,
+ _batch_pred_y_flip,
+ flip_indices=flip_indices)
+
+ batch_pred_x = (_batch_pred_x + _batch_pred_x_flip) * 0.5
+ batch_pred_y = (_batch_pred_y + _batch_pred_y_flip) * 0.5
+ else:
+ batch_pred_x, batch_pred_y = self.forward(feats)
+
+ preds = self.decode((batch_pred_x, batch_pred_y))
+
+ if test_cfg.get('output_heatmaps', False):
+ rank, _ = get_dist_info()
+ if rank == 0:
+ warnings.warn('The predicted simcc values are normalized for '
+ 'visualization. This may cause discrepancy '
+ 'between the keypoint scores and the 1D heatmaps'
+ '.')
+
+ # normalize the predicted 1d distribution
+ sigma = self.decoder.sigma
+ batch_pred_x = get_simcc_normalized(batch_pred_x, sigma[0])
+ batch_pred_y = get_simcc_normalized(batch_pred_y, sigma[1])
+
+ B, K, _ = batch_pred_x.shape
+ # B, K, Wx -> B, K, Wx, 1
+ x = batch_pred_x.reshape(B, K, 1, -1)
+ # B, K, Wy -> B, K, 1, Wy
+ y = batch_pred_y.reshape(B, K, -1, 1)
+ # B, K, Wx, Wy
+ batch_heatmaps = torch.matmul(y, x)
+ pred_fields = [
+ PixelData(heatmaps=hm) for hm in batch_heatmaps.detach()
+ ]
+
+ for pred_instances, pred_x, pred_y in zip(preds,
+ to_numpy(batch_pred_x),
+ to_numpy(batch_pred_y)):
+
+ pred_instances.keypoint_x_labels = pred_x[None]
+ pred_instances.keypoint_y_labels = pred_y[None]
+
+ return preds, pred_fields
+ else:
+ return preds
+
+ def loss(
+ self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ train_cfg: OptConfigType = {},
+ ) -> dict:
+ """Calculate losses from a batch of inputs and data samples."""
+
+ pred_x, pred_y = self.forward(feats)
+
+ gt_x = torch.cat([
+ d.gt_instance_labels.keypoint_x_labels for d in batch_data_samples
+ ],
+ dim=0)
+ gt_y = torch.cat([
+ d.gt_instance_labels.keypoint_y_labels for d in batch_data_samples
+ ],
+ dim=0)
+ keypoint_weights = torch.cat(
+ [
+ d.gt_instance_labels.keypoint_weights
+ for d in batch_data_samples
+ ],
+ dim=0,
+ )
+
+ pred_simcc = (pred_x, pred_y)
+ gt_simcc = (gt_x, gt_y)
+
+ # calculate losses
+ losses = dict()
+ loss = self.loss_module(pred_simcc, gt_simcc, keypoint_weights)
+
+ losses.update(loss_kpt=loss)
+
+ # calculate accuracy
+ _, avg_acc, _ = simcc_pck_accuracy(
+ output=to_numpy(pred_simcc),
+ target=to_numpy(gt_simcc),
+ simcc_split_ratio=self.simcc_split_ratio,
+ mask=to_numpy(keypoint_weights) > 0,
+ )
+
+ acc_pose = torch.tensor(avg_acc, device=gt_x.device)
+ losses.update(acc_pose=acc_pose)
+
+ return losses
+
+ @property
+ def default_init_cfg(self):
+ init_cfg = [
+ dict(
+ type='Normal', layer=['Conv2d', 'ConvTranspose2d'], std=0.001),
+ dict(type='Constant', layer='BatchNorm2d', val=1),
+ dict(type='Normal', layer=['Linear'], std=0.01, bias=0),
+ ]
+ return init_cfg
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..558a4dafd59537891c288be332d5f67ae4edebde
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__init__.py
@@ -0,0 +1,18 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .ae_head import AssociativeEmbeddingHead
+from .cid_head import CIDHead
+from .cpm_head import CPMHead
+from .heatmap_head import HeatmapHead
+from .mspn_head import MSPNHead
+from .vipnas_head import ViPNASHead
+from .pose3d_heatmap_head import Pose3dHeatmapHead
+
+__all__ = [
+ 'HeatmapHead', 'CPMHead', 'MSPNHead', 'ViPNASHead',
+ 'AssociativeEmbeddingHead', 'CIDHead', 'Pose3dHeatmapHead'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d092862004f143fee97e2dd28d81addeaa196e0a
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/ae_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/ae_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0bd96112a973ed8eae476b0af07c8347342273f0
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/ae_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/cid_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/cid_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..40bb84244a83642f628bf940ae633dd0aba268c8
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/cid_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/cpm_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/cpm_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2d0bf9922e736494377d3cfcff580b5fef53c210
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/cpm_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/heatmap_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/heatmap_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2cdab75bc9481173b59448ce9747b45e9d7c6569
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/heatmap_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/mspn_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/mspn_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..429ff73c237a54f5a8d2dcb46fd63d6598d4d65c
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/mspn_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/pose3d_heatmap_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/pose3d_heatmap_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..17eb228435d4adfbbcde4619d4e816574a6d3605
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/pose3d_heatmap_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/vipnas_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/vipnas_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e3f68453106e80ab0a96500db0f1b3c4085405ac
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/__pycache__/vipnas_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/ae_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/ae_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..1697632b2492231416ee8639b2455318ecc3a20e
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/ae_head.py
@@ -0,0 +1,296 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import List, Optional, Sequence, Tuple, Union
+
+import torch
+from mmengine.structures import PixelData
+from mmengine.utils import is_list_of
+from torch import Tensor
+
+from mmpose.models.utils.tta import aggregate_heatmaps, flip_heatmaps
+from mmpose.registry import MODELS
+from mmpose.utils.typing import (ConfigType, Features, OptConfigType,
+ OptSampleList, Predictions)
+from .heatmap_head import HeatmapHead
+
+OptIntSeq = Optional[Sequence[int]]
+
+
+@MODELS.register_module()
+class AssociativeEmbeddingHead(HeatmapHead):
+
+ def __init__(self,
+ in_channels: Union[int, Sequence[int]],
+ num_keypoints: int,
+ tag_dim: int = 1,
+ tag_per_keypoint: bool = True,
+ deconv_out_channels: OptIntSeq = (256, 256, 256),
+ deconv_kernel_sizes: OptIntSeq = (4, 4, 4),
+ conv_out_channels: OptIntSeq = None,
+ conv_kernel_sizes: OptIntSeq = None,
+ final_layer: dict = dict(kernel_size=1),
+ keypoint_loss: ConfigType = dict(type='KeypointMSELoss'),
+ tag_loss: ConfigType = dict(type='AssociativeEmbeddingLoss'),
+ decoder: OptConfigType = None,
+ init_cfg: OptConfigType = None):
+
+ if tag_per_keypoint:
+ out_channels = num_keypoints * (1 + tag_dim)
+ else:
+ out_channels = num_keypoints + tag_dim
+
+ loss = dict(
+ type='CombinedLoss',
+ losses=dict(keypoint_loss=keypoint_loss, tag_loss=tag_loss))
+
+ super().__init__(
+ in_channels=in_channels,
+ out_channels=out_channels,
+ deconv_out_channels=deconv_out_channels,
+ deconv_kernel_sizes=deconv_kernel_sizes,
+ conv_out_channels=conv_out_channels,
+ conv_kernel_sizes=conv_kernel_sizes,
+ final_layer=final_layer,
+ loss=loss,
+ decoder=decoder,
+ init_cfg=init_cfg)
+
+ self.num_keypoints = num_keypoints
+ self.tag_dim = tag_dim
+ self.tag_per_keypoint = tag_per_keypoint
+
+ def predict(self,
+ feats: Features,
+ batch_data_samples: OptSampleList,
+ test_cfg: ConfigType = {}) -> Predictions:
+ """Predict results from features.
+
+ Args:
+ feats (Features): The features which could be in following forms:
+
+ - Tuple[Tensor]: multi-stage features from the backbone
+ - List[Tuple[Tensor]]: multiple features for TTA where either
+ `flip_test` or `multiscale_test` is applied
+ - List[List[Tuple[Tensor]]]: multiple features for TTA where
+ both `flip_test` and `multiscale_test` are applied
+
+ batch_data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+ test_cfg (dict): The runtime config for testing process. Defaults
+ to {}
+
+ Returns:
+ Union[InstanceList | Tuple[InstanceList | PixelDataList]]: If
+ ``test_cfg['output_heatmap']==True``, return both pose and heatmap
+ prediction; otherwise only return the pose prediction.
+
+ The pose prediction is a list of ``InstanceData``, each contains
+ the following fields:
+
+ - keypoints (np.ndarray): predicted keypoint coordinates in
+ shape (num_instances, K, D) where K is the keypoint number
+ and D is the keypoint dimension
+ - keypoint_scores (np.ndarray): predicted keypoint scores in
+ shape (num_instances, K)
+
+ The heatmap prediction is a list of ``PixelData``, each contains
+ the following fields:
+
+ - heatmaps (Tensor): The predicted heatmaps in shape (K, h, w)
+ """
+ # test configs
+ multiscale_test = test_cfg.get('multiscale_test', False)
+ flip_test = test_cfg.get('flip_test', False)
+ shift_heatmap = test_cfg.get('shift_heatmap', False)
+ align_corners = test_cfg.get('align_corners', False)
+ restore_heatmap_size = test_cfg.get('restore_heatmap_size', False)
+ output_heatmaps = test_cfg.get('output_heatmaps', False)
+
+ # enable multi-scale test
+ if multiscale_test:
+ # TTA: multi-scale test
+ assert is_list_of(feats, list if flip_test else tuple)
+ else:
+ assert is_list_of(feats, tuple if flip_test else Tensor)
+ feats = [feats]
+
+ # resize heatmaps to align with with input size
+ if restore_heatmap_size:
+ img_shape = batch_data_samples[0].metainfo['img_shape']
+ assert all(d.metainfo['img_shape'] == img_shape
+ for d in batch_data_samples)
+ img_h, img_w = img_shape
+ heatmap_size = (img_w, img_h)
+ else:
+ heatmap_size = None
+
+ multiscale_heatmaps = []
+ multiscale_tags = []
+
+ for scale_idx, _feats in enumerate(feats):
+ if not flip_test:
+ _heatmaps, _tags = self.forward(_feats)
+
+ else:
+ # TTA: flip test
+ assert isinstance(_feats, list) and len(_feats) == 2
+ flip_indices = batch_data_samples[0].metainfo['flip_indices']
+ # original
+ _feats_orig, _feats_flip = _feats
+ _heatmaps_orig, _tags_orig = self.forward(_feats_orig)
+
+ # flipped
+ _heatmaps_flip, _tags_flip = self.forward(_feats_flip)
+ _heatmaps_flip = flip_heatmaps(
+ _heatmaps_flip,
+ flip_mode='heatmap',
+ flip_indices=flip_indices,
+ shift_heatmap=shift_heatmap)
+ _tags_flip = self._flip_tags(
+ _tags_flip,
+ flip_indices=flip_indices,
+ shift_heatmap=shift_heatmap)
+
+ # aggregated heatmaps
+ _heatmaps = aggregate_heatmaps(
+ [_heatmaps_orig, _heatmaps_flip],
+ size=heatmap_size,
+ align_corners=align_corners,
+ mode='average')
+
+ # aggregated tags (only at original scale)
+ if scale_idx == 0:
+ _tags = aggregate_heatmaps([_tags_orig, _tags_flip],
+ size=heatmap_size,
+ align_corners=align_corners,
+ mode='concat')
+ else:
+ _tags = None
+
+ multiscale_heatmaps.append(_heatmaps)
+ multiscale_tags.append(_tags)
+
+ # aggregate multi-scale heatmaps
+ if len(feats) > 1:
+ batch_heatmaps = aggregate_heatmaps(
+ multiscale_heatmaps,
+ align_corners=align_corners,
+ mode='average')
+ else:
+ batch_heatmaps = multiscale_heatmaps[0]
+ # only keep tags at original scale
+ batch_tags = multiscale_tags[0]
+
+ batch_outputs = tuple([batch_heatmaps, batch_tags])
+ preds = self.decode(batch_outputs)
+
+ if output_heatmaps:
+ pred_fields = []
+ for _heatmaps, _tags in zip(batch_heatmaps.detach(),
+ batch_tags.detach()):
+ pred_fields.append(PixelData(heatmaps=_heatmaps, tags=_tags))
+
+ return preds, pred_fields
+ else:
+ return preds
+
+ def _flip_tags(self,
+ tags: Tensor,
+ flip_indices: List[int],
+ shift_heatmap: bool = True):
+ """Flip the tagging heatmaps horizontally for test-time augmentation.
+
+ Args:
+ tags (Tensor): batched tagging heatmaps to flip
+ flip_indices (List[int]): The indices of each keypoint's symmetric
+ keypoint
+ shift_heatmap (bool): Shift the flipped heatmaps to align with the
+ original heatmaps and improve accuracy. Defaults to ``True``
+
+ Returns:
+ Tensor: flipped tagging heatmaps
+ """
+ B, C, H, W = tags.shape
+ K = self.num_keypoints
+ L = self.tag_dim
+
+ tags = tags.flip(-1)
+
+ if self.tag_per_keypoint:
+ assert C == K * L
+ tags = tags.view(B, L, K, H, W)
+ tags = tags[:, :, flip_indices]
+ tags = tags.view(B, C, H, W)
+
+ if shift_heatmap:
+ tags[..., 1:] = tags[..., :-1].clone()
+
+ return tags
+
+ def forward(self, feats: Tuple[Tensor]) -> Tuple[Tensor, Tensor]:
+ """Forward the network. The input is multi scale feature maps and the
+ output is the heatmaps and tags.
+
+ Args:
+ feats (Tuple[Tensor]): Multi scale feature maps.
+
+ Returns:
+ tuple:
+ - heatmaps (Tensor): output heatmaps
+ - tags (Tensor): output tags
+ """
+
+ output = super().forward(feats)
+ heatmaps = output[:, :self.num_keypoints]
+ tags = output[:, self.num_keypoints:]
+ return heatmaps, tags
+
+ def loss(self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ train_cfg: ConfigType = {}) -> dict:
+ """Calculate losses from a batch of inputs and data samples.
+
+ Args:
+ feats (Tuple[Tensor]): The multi-stage features
+ batch_data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+ train_cfg (dict): The runtime config for training process.
+ Defaults to {}
+
+ Returns:
+ dict: A dictionary of losses.
+ """
+ pred_heatmaps, pred_tags = self.forward(feats)
+
+ if not self.tag_per_keypoint:
+ pred_tags = pred_tags.repeat((1, self.num_keypoints, 1, 1))
+
+ gt_heatmaps = torch.stack(
+ [d.gt_fields.heatmaps for d in batch_data_samples])
+ gt_masks = torch.stack(
+ [d.gt_fields.heatmap_mask for d in batch_data_samples])
+ keypoint_weights = torch.cat([
+ d.gt_instance_labels.keypoint_weights for d in batch_data_samples
+ ])
+ keypoint_indices = [
+ d.gt_instance_labels.keypoint_indices for d in batch_data_samples
+ ]
+
+ loss_kpt = self.loss_module.keypoint_loss(pred_heatmaps, gt_heatmaps,
+ keypoint_weights, gt_masks)
+
+ loss_pull, loss_push = self.loss_module.tag_loss(
+ pred_tags, keypoint_indices)
+
+ losses = {
+ 'loss_kpt': loss_kpt,
+ 'loss_pull': loss_pull,
+ 'loss_push': loss_push
+ }
+
+ return losses
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/cid_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/cid_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..cac1b8a71c7f0f2447ce90821e710847902b55f1
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/cid_head.py
@@ -0,0 +1,748 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import math
+from typing import Dict, Optional, Sequence, Tuple, Union
+
+import numpy as np
+import torch
+import torch.nn as nn
+from mmcv.cnn import build_conv_layer
+from mmengine.model import BaseModule, ModuleDict
+from mmengine.structures import InstanceData, PixelData
+from torch import Tensor
+
+from mmpose.models.utils.tta import flip_heatmaps
+from mmpose.registry import KEYPOINT_CODECS, MODELS
+from mmpose.utils.typing import (ConfigType, Features, OptConfigType,
+ OptSampleList, Predictions)
+from ..base_head import BaseHead
+
+
+def smooth_heatmaps(heatmaps: Tensor, blur_kernel_size: int) -> Tensor:
+ """Smooth the heatmaps by blurring and averaging.
+
+ Args:
+ heatmaps (Tensor): The heatmaps to smooth.
+ blur_kernel_size (int): The kernel size for blurring the heatmaps.
+
+ Returns:
+ Tensor: The smoothed heatmaps.
+ """
+ smoothed_heatmaps = torch.nn.functional.avg_pool2d(
+ heatmaps, blur_kernel_size, 1, (blur_kernel_size - 1) // 2)
+ smoothed_heatmaps = (heatmaps + smoothed_heatmaps) / 2.0
+ return smoothed_heatmaps
+
+
+class TruncSigmoid(nn.Sigmoid):
+ """A sigmoid activation function that truncates the output to the given
+ range.
+
+ Args:
+ min (float, optional): The minimum value to clamp the output to.
+ Defaults to 0.0
+ max (float, optional): The maximum value to clamp the output to.
+ Defaults to 1.0
+ """
+
+ def __init__(self, min: float = 0.0, max: float = 1.0):
+ super(TruncSigmoid, self).__init__()
+ self.min = min
+ self.max = max
+
+ def forward(self, input: Tensor) -> Tensor:
+ """Computes the truncated sigmoid activation of the input tensor."""
+ output = torch.sigmoid(input)
+ output = output.clamp(min=self.min, max=self.max)
+ return output
+
+
+class IIAModule(BaseModule):
+ """Instance Information Abstraction module introduced in `CID`. This module
+ extracts the feature representation vectors for each instance.
+
+ Args:
+ in_channels (int): Number of channels in the input feature tensor
+ out_channels (int): Number of channels of the output heatmaps
+ clamp_delta (float, optional): A small value that prevents the sigmoid
+ activation from becoming saturated. Defaults to 1e-4.
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+ """
+
+ def __init__(
+ self,
+ in_channels: int,
+ out_channels: int,
+ clamp_delta: float = 1e-4,
+ init_cfg: OptConfigType = None,
+ ):
+ super().__init__(init_cfg=init_cfg)
+
+ self.keypoint_root_conv = build_conv_layer(
+ dict(
+ type='Conv2d',
+ in_channels=in_channels,
+ out_channels=out_channels,
+ kernel_size=1))
+ self.sigmoid = TruncSigmoid(min=clamp_delta, max=1 - clamp_delta)
+
+ def forward(self, feats: Tensor):
+ heatmaps = self.keypoint_root_conv(feats)
+ heatmaps = self.sigmoid(heatmaps)
+ return heatmaps
+
+ def _sample_feats(self, feats: Tensor, indices: Tensor) -> Tensor:
+ """Extract feature vectors at the specified indices from the input
+ feature map.
+
+ Args:
+ feats (Tensor): Input feature map.
+ indices (Tensor): Indices of the feature vectors to extract.
+
+ Returns:
+ Tensor: Extracted feature vectors.
+ """
+ assert indices.dtype == torch.long
+ if indices.shape[1] == 3:
+ b, w, h = [ind.squeeze(-1) for ind in indices.split(1, -1)]
+ instance_feats = feats[b, :, h, w]
+ elif indices.shape[1] == 2:
+ w, h = [ind.squeeze(-1) for ind in indices.split(1, -1)]
+ instance_feats = feats[:, :, h, w]
+ instance_feats = instance_feats.permute(0, 2, 1)
+ instance_feats = instance_feats.reshape(-1,
+ instance_feats.shape[-1])
+
+ else:
+ raise ValueError(f'`indices` should have 2 or 3 channels, '
+ f'but got f{indices.shape[1]}')
+ return instance_feats
+
+ def _hierarchical_pool(self, heatmaps: Tensor) -> Tensor:
+ """Conduct max pooling on the input heatmaps with different kernel size
+ according to the input size.
+
+ Args:
+ heatmaps (Tensor): Input heatmaps.
+
+ Returns:
+ Tensor: Result of hierarchical pooling.
+ """
+ map_size = (heatmaps.shape[-1] + heatmaps.shape[-2]) / 2.0
+ if map_size > 300:
+ maxm = torch.nn.functional.max_pool2d(heatmaps, 7, 1, 3)
+ elif map_size > 200:
+ maxm = torch.nn.functional.max_pool2d(heatmaps, 5, 1, 2)
+ else:
+ maxm = torch.nn.functional.max_pool2d(heatmaps, 3, 1, 1)
+ return maxm
+
+ def forward_train(self, feats: Tensor, instance_coords: Tensor,
+ instance_imgids: Tensor) -> Tuple[Tensor, Tensor]:
+ """Forward pass during training.
+
+ Args:
+ feats (Tensor): Input feature tensor.
+ instance_coords (Tensor): Coordinates of the instance roots.
+ instance_imgids (Tensor): Sample indices of each instances
+ in the batch.
+
+ Returns:
+ Tuple[Tensor, Tensor]: Extracted feature vectors and heatmaps
+ for the instances.
+ """
+ heatmaps = self.forward(feats)
+ indices = torch.cat((instance_imgids[:, None], instance_coords), dim=1)
+ instance_feats = self._sample_feats(feats, indices)
+
+ return instance_feats, heatmaps
+
+ def forward_test(
+ self, feats: Tensor, test_cfg: Dict
+ ) -> Tuple[Optional[Tensor], Optional[Tensor], Optional[Tensor]]:
+ """Forward pass during testing.
+
+ Args:
+ feats (Tensor): Input feature tensor.
+ test_cfg (Dict): Testing configuration, including:
+ - blur_kernel_size (int, optional): Kernel size for blurring
+ the heatmaps. Defaults to 3.
+ - max_instances (int, optional): Maximum number of instances
+ to extract. Defaults to 30.
+ - score_threshold (float, optional): Minimum score for
+ extracting an instance. Defaults to 0.01.
+ - flip_test (bool, optional): Whether to compute the average
+ of the heatmaps across the batch dimension.
+ Defaults to False.
+
+ Returns:
+ A tuple of Tensor including extracted feature vectors,
+ coordinates, and scores of the instances. Any of these can be
+ empty Tensor if no instances are extracted.
+ """
+ blur_kernel_size = test_cfg.get('blur_kernel_size', 3)
+ max_instances = test_cfg.get('max_instances', 30)
+ score_threshold = test_cfg.get('score_threshold', 0.01)
+ H, W = feats.shape[-2:]
+
+ # compute heatmaps
+ heatmaps = self.forward(feats).narrow(1, -1, 1)
+ if test_cfg.get('flip_test', False):
+ heatmaps = heatmaps.mean(dim=0, keepdims=True)
+ smoothed_heatmaps = smooth_heatmaps(heatmaps, blur_kernel_size)
+
+ # decode heatmaps
+ maximums = self._hierarchical_pool(smoothed_heatmaps)
+ maximums = torch.eq(maximums, smoothed_heatmaps).float()
+ maximums = (smoothed_heatmaps * maximums).reshape(-1)
+ scores, pos_ind = maximums.topk(max_instances, dim=0)
+ select_ind = (scores > (score_threshold)).nonzero().squeeze(1)
+ scores, pos_ind = scores[select_ind], pos_ind[select_ind]
+
+ # sample feature vectors from feature map
+ instance_coords = torch.stack((pos_ind % W, pos_ind // W), dim=1)
+ instance_feats = self._sample_feats(feats, instance_coords)
+
+ return instance_feats, instance_coords, scores
+
+
+class ChannelAttention(nn.Module):
+ """Channel-wise attention module introduced in `CID`.
+
+ Args:
+ in_channels (int): The number of channels of the input instance
+ vectors.
+ out_channels (int): The number of channels of the transformed instance
+ vectors.
+ """
+
+ def __init__(self, in_channels: int, out_channels: int):
+ super(ChannelAttention, self).__init__()
+ self.atn = nn.Linear(in_channels, out_channels)
+
+ def forward(self, global_feats: Tensor, instance_feats: Tensor) -> Tensor:
+ """Applies attention to the channel dimension of the input tensor."""
+
+ instance_feats = self.atn(instance_feats).unsqueeze(2).unsqueeze(3)
+ return global_feats * instance_feats
+
+
+class SpatialAttention(nn.Module):
+ """Spatial-wise attention module introduced in `CID`.
+
+ Args:
+ in_channels (int): The number of channels of the input instance
+ vectors.
+ out_channels (int): The number of channels of the transformed instance
+ vectors.
+ """
+
+ def __init__(self, in_channels, out_channels):
+ super(SpatialAttention, self).__init__()
+ self.atn = nn.Linear(in_channels, out_channels)
+ self.feat_stride = 4
+ self.conv = nn.Conv2d(3, 1, 5, 1, 2)
+
+ def _get_pixel_coords(self, heatmap_size: Tuple, device: str = 'cpu'):
+ """Get pixel coordinates for each element in the heatmap.
+
+ Args:
+ heatmap_size (tuple): Size of the heatmap in (W, H) format.
+ device (str): Device to put the resulting tensor on.
+
+ Returns:
+ Tensor of shape (batch_size, num_pixels, 2) containing the pixel
+ coordinates for each element in the heatmap.
+ """
+ w, h = heatmap_size
+ y, x = torch.meshgrid(torch.arange(h), torch.arange(w))
+ pixel_coords = torch.stack((x, y), dim=-1).reshape(-1, 2)
+ pixel_coords = pixel_coords.float().to(device) + 0.5
+ return pixel_coords
+
+ def forward(self, global_feats: Tensor, instance_feats: Tensor,
+ instance_coords: Tensor) -> Tensor:
+ """Perform spatial attention.
+
+ Args:
+ global_feats (Tensor): Tensor containing the global features.
+ instance_feats (Tensor): Tensor containing the instance feature
+ vectors.
+ instance_coords (Tensor): Tensor containing the root coordinates
+ of the instances.
+
+ Returns:
+ Tensor containing the modulated global features.
+ """
+ B, C, H, W = global_feats.size()
+
+ instance_feats = self.atn(instance_feats).reshape(B, C, 1, 1)
+ feats = global_feats * instance_feats.expand_as(global_feats)
+ fsum = torch.sum(feats, dim=1, keepdim=True)
+
+ pixel_coords = self._get_pixel_coords((W, H), feats.device)
+ relative_coords = instance_coords.reshape(
+ -1, 1, 2) - pixel_coords.reshape(1, -1, 2)
+ relative_coords = relative_coords.permute(0, 2, 1) / 32.0
+ relative_coords = relative_coords.reshape(B, 2, H, W)
+
+ input_feats = torch.cat((fsum, relative_coords), dim=1)
+ mask = self.conv(input_feats).sigmoid()
+ return global_feats * mask
+
+
+class GFDModule(BaseModule):
+ """Global Feature Decoupling module introduced in `CID`. This module
+ extracts the decoupled heatmaps for each instance.
+
+ Args:
+ in_channels (int): Number of channels in the input feature map
+ out_channels (int): Number of channels of the output heatmaps
+ for each instance
+ gfd_channels (int): Number of channels in the transformed feature map
+ clamp_delta (float, optional): A small value that prevents the sigmoid
+ activation from becoming saturated. Defaults to 1e-4.
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+ """
+
+ def __init__(
+ self,
+ in_channels: int,
+ out_channels: int,
+ gfd_channels: int,
+ clamp_delta: float = 1e-4,
+ init_cfg: OptConfigType = None,
+ ):
+ super().__init__(init_cfg=init_cfg)
+
+ self.conv_down = build_conv_layer(
+ dict(
+ type='Conv2d',
+ in_channels=in_channels,
+ out_channels=gfd_channels,
+ kernel_size=1))
+
+ self.channel_attention = ChannelAttention(in_channels, gfd_channels)
+ self.spatial_attention = SpatialAttention(in_channels, gfd_channels)
+ self.fuse_attention = build_conv_layer(
+ dict(
+ type='Conv2d',
+ in_channels=gfd_channels * 2,
+ out_channels=gfd_channels,
+ kernel_size=1))
+ self.heatmap_conv = build_conv_layer(
+ dict(
+ type='Conv2d',
+ in_channels=gfd_channels,
+ out_channels=out_channels,
+ kernel_size=1))
+ self.sigmoid = TruncSigmoid(min=clamp_delta, max=1 - clamp_delta)
+
+ def forward(
+ self,
+ feats: Tensor,
+ instance_feats: Tensor,
+ instance_coords: Tensor,
+ instance_imgids: Tensor,
+ ) -> Tensor:
+ """Extract decoupled heatmaps for each instance.
+
+ Args:
+ feats (Tensor): Input feature maps.
+ instance_feats (Tensor): Tensor containing the instance feature
+ vectors.
+ instance_coords (Tensor): Tensor containing the root coordinates
+ of the instances.
+ instance_imgids (Tensor): Sample indices of each instances
+ in the batch.
+
+ Returns:
+ A tensor containing decoupled heatmaps.
+ """
+
+ global_feats = self.conv_down(feats)
+ global_feats = global_feats[instance_imgids]
+ cond_instance_feats = torch.cat(
+ (self.channel_attention(global_feats, instance_feats),
+ self.spatial_attention(global_feats, instance_feats,
+ instance_coords)),
+ dim=1)
+
+ cond_instance_feats = self.fuse_attention(cond_instance_feats)
+ cond_instance_feats = torch.nn.functional.relu(cond_instance_feats)
+ cond_instance_feats = self.heatmap_conv(cond_instance_feats)
+ heatmaps = self.sigmoid(cond_instance_feats)
+
+ return heatmaps
+
+
+@MODELS.register_module()
+class CIDHead(BaseHead):
+ """Contextual Instance Decoupling head introduced in `Contextual Instance
+ Decoupling for Robust Multi-Person Pose Estimation (CID)`_ by Wang et al
+ (2022). The head is composed of an Instance Information Abstraction (IIA)
+ module and a Global Feature Decoupling (GFD) module.
+
+ Args:
+ in_channels (int | Sequence[int]): Number of channels in the input
+ feature map
+ num_keypoints (int): Number of keypoints
+ gfd_channels (int): Number of filters in GFD module
+ max_train_instances (int): Maximum number of instances in a batch
+ during training. Defaults to 200
+ heatmap_loss (Config): Config of the heatmap loss. Defaults to use
+ :class:`KeypointMSELoss`
+ coupled_heatmap_loss (Config): Config of the loss for coupled heatmaps.
+ Defaults to use :class:`SoftWeightSmoothL1Loss`
+ decoupled_heatmap_loss (Config): Config of the loss for decoupled
+ heatmaps. Defaults to use :class:`SoftWeightSmoothL1Loss`
+ contrastive_loss (Config): Config of the contrastive loss for
+ representation vectors of instances. Defaults to use
+ :class:`InfoNCELoss`
+ decoder (Config, optional): The decoder config that controls decoding
+ keypoint coordinates from the network output. Defaults to ``None``
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+
+ .. _`CID`: https://openaccess.thecvf.com/content/CVPR2022/html/Wang_
+ Contextual_Instance_Decoupling_for_Robust_Multi-Person_Pose_Estimation_
+ CVPR_2022_paper.html
+ """
+ _version = 2
+
+ def __init__(self,
+ in_channels: Union[int, Sequence[int]],
+ gfd_channels: int,
+ num_keypoints: int,
+ prior_prob: float = 0.01,
+ coupled_heatmap_loss: OptConfigType = dict(
+ type='FocalHeatmapLoss'),
+ decoupled_heatmap_loss: OptConfigType = dict(
+ type='FocalHeatmapLoss'),
+ contrastive_loss: OptConfigType = dict(type='InfoNCELoss'),
+ decoder: OptConfigType = None,
+ init_cfg: OptConfigType = None):
+
+ if init_cfg is None:
+ init_cfg = self.default_init_cfg
+
+ super().__init__(init_cfg)
+
+ self.in_channels = in_channels
+ self.num_keypoints = num_keypoints
+ if decoder is not None:
+ self.decoder = KEYPOINT_CODECS.build(decoder)
+ else:
+ self.decoder = None
+
+ # build sub-modules
+ bias_value = -math.log((1 - prior_prob) / prior_prob)
+ self.iia_module = IIAModule(
+ in_channels,
+ num_keypoints + 1,
+ init_cfg=init_cfg + [
+ dict(
+ type='Normal',
+ layer=['Conv2d', 'Linear'],
+ std=0.001,
+ override=dict(
+ name='keypoint_root_conv',
+ type='Normal',
+ std=0.001,
+ bias=bias_value))
+ ])
+ self.gfd_module = GFDModule(
+ in_channels,
+ num_keypoints,
+ gfd_channels,
+ init_cfg=init_cfg + [
+ dict(
+ type='Normal',
+ layer=['Conv2d', 'Linear'],
+ std=0.001,
+ override=dict(
+ name='heatmap_conv',
+ type='Normal',
+ std=0.001,
+ bias=bias_value))
+ ])
+
+ # build losses
+ self.loss_module = ModuleDict(
+ dict(
+ heatmap_coupled=MODELS.build(coupled_heatmap_loss),
+ heatmap_decoupled=MODELS.build(decoupled_heatmap_loss),
+ contrastive=MODELS.build(contrastive_loss),
+ ))
+
+ # Register the hook to automatically convert old version state dicts
+ self._register_load_state_dict_pre_hook(self._load_state_dict_pre_hook)
+
+ @property
+ def default_init_cfg(self):
+ init_cfg = [
+ dict(type='Normal', layer=['Conv2d', 'Linear'], std=0.001),
+ dict(type='Constant', layer='BatchNorm2d', val=1)
+ ]
+ return init_cfg
+
+ def forward(self, feats: Tuple[Tensor]) -> Tensor:
+ """Forward the network. The input is multi scale feature maps and the
+ output is the heatmap.
+
+ Args:
+ feats (Tuple[Tensor]): Multi scale feature maps.
+
+ Returns:
+ Tensor: output heatmap.
+ """
+ feats = feats[-1]
+ instance_info = self.iia_module.forward_test(feats, {})
+ instance_feats, instance_coords, instance_scores = instance_info
+ instance_imgids = torch.zeros(
+ instance_coords.size(0), dtype=torch.long, device=feats.device)
+ instance_heatmaps = self.gfd_module(feats, instance_feats,
+ instance_coords, instance_imgids)
+
+ return instance_heatmaps
+
+ def predict(self,
+ feats: Features,
+ batch_data_samples: OptSampleList,
+ test_cfg: ConfigType = {}) -> Predictions:
+ """Predict results from features.
+
+ Args:
+ feats (Tuple[Tensor] | List[Tuple[Tensor]]): The multi-stage
+ features (or multiple multi-stage features in TTA)
+ batch_data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+ test_cfg (dict): The runtime config for testing process. Defaults
+ to {}
+
+ Returns:
+ Union[InstanceList | Tuple[InstanceList | PixelDataList]]: If
+ ``test_cfg['output_heatmap']==True``, return both pose and heatmap
+ prediction; otherwise only return the pose prediction.
+
+ The pose prediction is a list of ``InstanceData``, each contains
+ the following fields:
+
+ - keypoints (np.ndarray): predicted keypoint coordinates in
+ shape (num_instances, K, D) where K is the keypoint number
+ and D is the keypoint dimension
+ - keypoint_scores (np.ndarray): predicted keypoint scores in
+ shape (num_instances, K)
+
+ The heatmap prediction is a list of ``PixelData``, each contains
+ the following fields:
+
+ - heatmaps (Tensor): The predicted heatmaps in shape (K, h, w)
+ """
+ metainfo = batch_data_samples[0].metainfo
+
+ if test_cfg.get('flip_test', False):
+ assert isinstance(feats, list) and len(feats) == 2
+
+ feats_flipped = flip_heatmaps(feats[1][-1], shift_heatmap=False)
+ feats = torch.cat((feats[0][-1], feats_flipped))
+ else:
+ feats = feats[-1]
+
+ instance_info = self.iia_module.forward_test(feats, test_cfg)
+ instance_feats, instance_coords, instance_scores = instance_info
+ if len(instance_coords) > 0:
+ instance_imgids = torch.zeros(
+ instance_coords.size(0), dtype=torch.long, device=feats.device)
+ if test_cfg.get('flip_test', False):
+ instance_coords = torch.cat((instance_coords, instance_coords))
+ instance_imgids = torch.cat(
+ (instance_imgids, instance_imgids + 1))
+ instance_heatmaps = self.gfd_module(feats, instance_feats,
+ instance_coords,
+ instance_imgids)
+ if test_cfg.get('flip_test', False):
+ flip_indices = batch_data_samples[0].metainfo['flip_indices']
+ instance_heatmaps, instance_heatmaps_flip = torch.chunk(
+ instance_heatmaps, 2, dim=0)
+ instance_heatmaps_flip = \
+ instance_heatmaps_flip[:, flip_indices, :, :]
+ instance_heatmaps = (instance_heatmaps +
+ instance_heatmaps_flip) / 2.0
+ instance_heatmaps = smooth_heatmaps(
+ instance_heatmaps, test_cfg.get('blur_kernel_size', 3))
+
+ preds = self.decode((instance_heatmaps, instance_scores[:, None]))
+ preds = InstanceData.cat(preds)
+ preds.keypoints[..., 0] += metainfo['input_size'][
+ 0] / instance_heatmaps.shape[-1] / 2.0
+ preds.keypoints[..., 1] += metainfo['input_size'][
+ 1] / instance_heatmaps.shape[-2] / 2.0
+ preds = [preds]
+
+ else:
+ preds = [
+ InstanceData(
+ keypoints=np.empty((0, self.num_keypoints, 2)),
+ keypoint_scores=np.empty((0, self.num_keypoints)))
+ ]
+ instance_heatmaps = torch.empty(0, self.num_keypoints,
+ *feats.shape[-2:])
+
+ if test_cfg.get('output_heatmaps', False):
+ pred_fields = [
+ PixelData(
+ heatmaps=instance_heatmaps.reshape(
+ -1, *instance_heatmaps.shape[-2:]))
+ ]
+ return preds, pred_fields
+ else:
+ return preds
+
+ def loss(self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ train_cfg: ConfigType = {}) -> dict:
+ """Calculate losses from a batch of inputs and data samples.
+
+ Args:
+ feats (Tuple[Tensor]): The multi-stage features
+ batch_data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+ train_cfg (dict): The runtime config for training process.
+ Defaults to {}
+
+ Returns:
+ dict: A dictionary of losses.
+ """
+
+ # load targets
+ gt_heatmaps, gt_instance_coords, keypoint_weights = [], [], []
+ heatmap_mask = []
+ instance_imgids, gt_instance_heatmaps = [], []
+ for i, d in enumerate(batch_data_samples):
+ gt_heatmaps.append(d.gt_fields.heatmaps)
+ gt_instance_coords.append(d.gt_instance_labels.instance_coords)
+ keypoint_weights.append(d.gt_instance_labels.keypoint_weights)
+ instance_imgids.append(
+ torch.ones(
+ len(d.gt_instance_labels.instance_coords),
+ dtype=torch.long) * i)
+
+ instance_heatmaps = d.gt_fields.instance_heatmaps.reshape(
+ -1, self.num_keypoints,
+ *d.gt_fields.instance_heatmaps.shape[1:])
+ gt_instance_heatmaps.append(instance_heatmaps)
+
+ if 'heatmap_mask' in d.gt_fields:
+ heatmap_mask.append(d.gt_fields.heatmap_mask)
+
+ gt_heatmaps = torch.stack(gt_heatmaps)
+ heatmap_mask = torch.stack(heatmap_mask) if heatmap_mask else None
+
+ gt_instance_coords = torch.cat(gt_instance_coords, dim=0)
+ gt_instance_heatmaps = torch.cat(gt_instance_heatmaps, dim=0)
+ keypoint_weights = torch.cat(keypoint_weights, dim=0)
+ instance_imgids = torch.cat(instance_imgids).to(gt_heatmaps.device)
+
+ # feed-forward
+ feats = feats[-1]
+ pred_instance_feats, pred_heatmaps = self.iia_module.forward_train(
+ feats, gt_instance_coords, instance_imgids)
+
+ # conpute contrastive loss
+ contrastive_loss = 0
+ for i in range(len(batch_data_samples)):
+ pred_instance_feat = pred_instance_feats[instance_imgids == i]
+ contrastive_loss += self.loss_module['contrastive'](
+ pred_instance_feat)
+ contrastive_loss = contrastive_loss / max(1, len(instance_imgids))
+
+ # limit the number of instances
+ max_train_instances = train_cfg.get('max_train_instances', -1)
+ if (max_train_instances > 0
+ and len(instance_imgids) > max_train_instances):
+ selected_indices = torch.randperm(
+ len(instance_imgids),
+ device=gt_heatmaps.device,
+ dtype=torch.long)[:max_train_instances]
+ gt_instance_coords = gt_instance_coords[selected_indices]
+ keypoint_weights = keypoint_weights[selected_indices]
+ gt_instance_heatmaps = gt_instance_heatmaps[selected_indices]
+ instance_imgids = instance_imgids[selected_indices]
+ pred_instance_feats = pred_instance_feats[selected_indices]
+
+ # calculate the decoupled heatmaps for each instance
+ pred_instance_heatmaps = self.gfd_module(feats, pred_instance_feats,
+ gt_instance_coords,
+ instance_imgids)
+
+ # calculate losses
+ losses = {
+ 'loss/heatmap_coupled':
+ self.loss_module['heatmap_coupled'](pred_heatmaps, gt_heatmaps,
+ None, heatmap_mask)
+ }
+ if len(instance_imgids) > 0:
+ losses.update({
+ 'loss/heatmap_decoupled':
+ self.loss_module['heatmap_decoupled'](pred_instance_heatmaps,
+ gt_instance_heatmaps,
+ keypoint_weights),
+ 'loss/contrastive':
+ contrastive_loss
+ })
+
+ return losses
+
+ def _load_state_dict_pre_hook(self, state_dict, prefix, local_meta, *args,
+ **kwargs):
+ """A hook function to convert old-version state dict of
+ :class:`CIDHead` (before MMPose v1.0.0) to a compatible format
+ of :class:`CIDHead`.
+
+ The hook will be automatically registered during initialization.
+ """
+ version = local_meta.get('version', None)
+ if version and version >= self._version:
+ return
+
+ # convert old-version state dict
+ keys = list(state_dict.keys())
+ for k in keys:
+ if 'keypoint_center_conv' in k:
+ v = state_dict.pop(k)
+ k = k.replace('keypoint_center_conv',
+ 'iia_module.keypoint_root_conv')
+ state_dict[k] = v
+
+ if 'conv_down' in k:
+ v = state_dict.pop(k)
+ k = k.replace('conv_down', 'gfd_module.conv_down')
+ state_dict[k] = v
+
+ if 'c_attn' in k:
+ v = state_dict.pop(k)
+ k = k.replace('c_attn', 'gfd_module.channel_attention')
+ state_dict[k] = v
+
+ if 's_attn' in k:
+ v = state_dict.pop(k)
+ k = k.replace('s_attn', 'gfd_module.spatial_attention')
+ state_dict[k] = v
+
+ if 'fuse_attn' in k:
+ v = state_dict.pop(k)
+ k = k.replace('fuse_attn', 'gfd_module.fuse_attention')
+ state_dict[k] = v
+
+ if 'heatmap_conv' in k:
+ v = state_dict.pop(k)
+ k = k.replace('heatmap_conv', 'gfd_module.heatmap_conv')
+ state_dict[k] = v
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/cpm_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/cpm_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..c8d71774e8960d22290549c5f698f4e5735f00ed
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/cpm_head.py
@@ -0,0 +1,312 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import List, Optional, Sequence, Union
+
+import torch
+from mmcv.cnn import build_conv_layer, build_upsample_layer
+from mmengine.structures import PixelData
+from torch import Tensor, nn
+
+from mmpose.evaluation.functional import pose_pck_accuracy
+from mmpose.models.utils.tta import flip_heatmaps
+from mmpose.registry import KEYPOINT_CODECS, MODELS
+from mmpose.utils.tensor_utils import to_numpy
+from mmpose.utils.typing import (Features, MultiConfig, OptConfigType,
+ OptSampleList, Predictions)
+from ..base_head import BaseHead
+
+OptIntSeq = Optional[Sequence[int]]
+
+
+@MODELS.register_module()
+class CPMHead(BaseHead):
+ """Multi-stage heatmap head introduced in `Convolutional Pose Machines`_ by
+ Wei et al (2016) and used by `Stacked Hourglass Networks`_ by Newell et al
+ (2016). The head consists of multiple branches, each of which has some
+ deconv layers and a simple conv2d layer.
+
+ Args:
+ in_channels (int | Sequence[int]): Number of channels in the input
+ feature maps.
+ out_channels (int): Number of channels in the output heatmaps.
+ num_stages (int): Number of stages.
+ deconv_out_channels (Sequence[int], optional): The output channel
+ number of each deconv layer. Defaults to ``(256, 256, 256)``
+ deconv_kernel_sizes (Sequence[int | tuple], optional): The kernel size
+ of each deconv layer. Each element should be either an integer for
+ both height and width dimensions, or a tuple of two integers for
+ the height and the width dimension respectively.
+ Defaults to ``(4, 4, 4)``
+ final_layer (dict): Arguments of the final Conv2d layer.
+ Defaults to ``dict(kernel_size=1)``
+ loss (Config | List[Config]): Config of the keypoint loss of different
+ stages. Defaults to use :class:`KeypointMSELoss`.
+ decoder (Config, optional): The decoder config that controls decoding
+ keypoint coordinates from the network output. Defaults to ``None``
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+
+ .. _`Convolutional Pose Machines`: https://arxiv.org/abs/1602.00134
+ .. _`Stacked Hourglass Networks`: https://arxiv.org/abs/1603.06937
+ """
+
+ _version = 2
+
+ def __init__(self,
+ in_channels: Union[int, Sequence[int]],
+ out_channels: int,
+ num_stages: int,
+ deconv_out_channels: OptIntSeq = None,
+ deconv_kernel_sizes: OptIntSeq = None,
+ final_layer: dict = dict(kernel_size=1),
+ loss: MultiConfig = dict(
+ type='KeypointMSELoss', use_target_weight=True),
+ decoder: OptConfigType = None,
+ init_cfg: OptConfigType = None):
+
+ if init_cfg is None:
+ init_cfg = self.default_init_cfg
+ super().__init__(init_cfg)
+
+ self.num_stages = num_stages
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+
+ if isinstance(loss, list):
+ if len(loss) != num_stages:
+ raise ValueError(
+ f'The length of loss_module({len(loss)}) did not match '
+ f'`num_stages`({num_stages})')
+ self.loss_module = nn.ModuleList(
+ MODELS.build(_loss) for _loss in loss)
+ else:
+ self.loss_module = MODELS.build(loss)
+
+ if decoder is not None:
+ self.decoder = KEYPOINT_CODECS.build(decoder)
+ else:
+ self.decoder = None
+
+ # build multi-stage deconv layers
+ self.multi_deconv_layers = nn.ModuleList([])
+ if deconv_out_channels:
+ if deconv_kernel_sizes is None or len(deconv_out_channels) != len(
+ deconv_kernel_sizes):
+ raise ValueError(
+ '"deconv_out_channels" and "deconv_kernel_sizes" should '
+ 'be integer sequences with the same length. Got '
+ f'mismatched lengths {deconv_out_channels} and '
+ f'{deconv_kernel_sizes}')
+
+ for _ in range(self.num_stages):
+ deconv_layers = self._make_deconv_layers(
+ in_channels=in_channels,
+ layer_out_channels=deconv_out_channels,
+ layer_kernel_sizes=deconv_kernel_sizes,
+ )
+ self.multi_deconv_layers.append(deconv_layers)
+ in_channels = deconv_out_channels[-1]
+ else:
+ for _ in range(self.num_stages):
+ self.multi_deconv_layers.append(nn.Identity())
+
+ # build multi-stage final layers
+ self.multi_final_layers = nn.ModuleList([])
+ if final_layer is not None:
+ cfg = dict(
+ type='Conv2d',
+ in_channels=in_channels,
+ out_channels=out_channels,
+ kernel_size=1)
+ cfg.update(final_layer)
+ for _ in range(self.num_stages):
+ self.multi_final_layers.append(build_conv_layer(cfg))
+ else:
+ for _ in range(self.num_stages):
+ self.multi_final_layers.append(nn.Identity())
+
+ @property
+ def default_init_cfg(self):
+ init_cfg = [
+ dict(
+ type='Normal', layer=['Conv2d', 'ConvTranspose2d'], std=0.001),
+ dict(type='Constant', layer='BatchNorm2d', val=1)
+ ]
+ return init_cfg
+
+ def _make_deconv_layers(self, in_channels: int,
+ layer_out_channels: Sequence[int],
+ layer_kernel_sizes: Sequence[int]) -> nn.Module:
+ """Create deconvolutional layers by given parameters."""
+
+ layers = []
+ for out_channels, kernel_size in zip(layer_out_channels,
+ layer_kernel_sizes):
+ if kernel_size == 4:
+ padding = 1
+ output_padding = 0
+ elif kernel_size == 3:
+ padding = 1
+ output_padding = 1
+ elif kernel_size == 2:
+ padding = 0
+ output_padding = 0
+ else:
+ raise ValueError(f'Unsupported kernel size {kernel_size} for'
+ 'deconvlutional layers in '
+ f'{self.__class__.__name__}')
+ cfg = dict(
+ type='deconv',
+ in_channels=in_channels,
+ out_channels=out_channels,
+ kernel_size=kernel_size,
+ stride=2,
+ padding=padding,
+ output_padding=output_padding,
+ bias=False)
+ layers.append(build_upsample_layer(cfg))
+ layers.append(nn.BatchNorm2d(num_features=out_channels))
+ layers.append(nn.ReLU(inplace=True))
+ in_channels = out_channels
+
+ return nn.Sequential(*layers)
+
+ def forward(self, feats: Sequence[Tensor]) -> List[Tensor]:
+ """Forward the network. The input is multi-stage feature maps and the
+ output is a list of heatmaps from multiple stages.
+
+ Args:
+ feats (Sequence[Tensor]): Multi-stage feature maps.
+
+ Returns:
+ List[Tensor]: A list of output heatmaps from multiple stages.
+ """
+ out = []
+ assert len(feats) == self.num_stages, (
+ f'The length of feature maps did not match the '
+ f'`num_stages` in {self.__class__.__name__}')
+ for i in range(self.num_stages):
+ y = self.multi_deconv_layers[i](feats[i])
+ y = self.multi_final_layers[i](y)
+ out.append(y)
+
+ return out
+
+ def predict(self,
+ feats: Features,
+ batch_data_samples: OptSampleList,
+ test_cfg: OptConfigType = {}) -> Predictions:
+ """Predict results from multi-stage feature maps.
+
+ Args:
+ feats (Tuple[Tensor] | List[Tuple[Tensor]]): The multi-stage
+ features (or multiple multi-stage features in TTA)
+ batch_data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+ test_cfg (dict): The runtime config for testing process. Defaults
+ to {}
+
+ Returns:
+ Union[InstanceList | Tuple[InstanceList | PixelDataList]]: If
+ ``test_cfg['output_heatmap']==True``, return both pose and heatmap
+ prediction; otherwise only return the pose prediction.
+
+ The pose prediction is a list of ``InstanceData``, each contains
+ the following fields:
+
+ - keypoints (np.ndarray): predicted keypoint coordinates in
+ shape (num_instances, K, D) where K is the keypoint number
+ and D is the keypoint dimension
+ - keypoint_scores (np.ndarray): predicted keypoint scores in
+ shape (num_instances, K)
+
+ The heatmap prediction is a list of ``PixelData``, each contains
+ the following fields:
+
+ - heatmaps (Tensor): The predicted heatmaps in shape (K, h, w)
+ """
+
+ if test_cfg.get('flip_test', False):
+ # TTA: flip test
+ assert isinstance(feats, list) and len(feats) == 2
+ flip_indices = batch_data_samples[0].metainfo['flip_indices']
+ _feats, _feats_flip = feats
+ _batch_heatmaps = self.forward(_feats)[-1]
+ _batch_heatmaps_flip = flip_heatmaps(
+ self.forward(_feats_flip)[-1],
+ flip_mode=test_cfg.get('flip_mode', 'heatmap'),
+ flip_indices=flip_indices,
+ shift_heatmap=test_cfg.get('shift_heatmap', False))
+ batch_heatmaps = (_batch_heatmaps + _batch_heatmaps_flip) * 0.5
+ else:
+ multi_stage_heatmaps = self.forward(feats)
+ batch_heatmaps = multi_stage_heatmaps[-1]
+
+ preds = self.decode(batch_heatmaps)
+
+ if test_cfg.get('output_heatmaps', False):
+ pred_fields = [
+ PixelData(heatmaps=hm) for hm in batch_heatmaps.detach()
+ ]
+ return preds, pred_fields
+ else:
+ return preds
+
+ def loss(self,
+ feats: Sequence[Tensor],
+ batch_data_samples: OptSampleList,
+ train_cfg: OptConfigType = {}) -> dict:
+ """Calculate losses from a batch of inputs and data samples.
+
+ Args:
+ feats (Sequence[Tensor]): Multi-stage feature maps.
+ batch_data_samples (List[:obj:`PoseDataSample`]): The Data
+ Samples. It usually includes information such as
+ `gt_instances`.
+ train_cfg (Config, optional): The training config.
+
+ Returns:
+ dict: A dictionary of loss components.
+ """
+ multi_stage_pred_heatmaps = self.forward(feats)
+
+ gt_heatmaps = torch.stack(
+ [d.gt_fields.heatmaps for d in batch_data_samples])
+ keypoint_weights = torch.cat([
+ d.gt_instance_labels.keypoint_weights for d in batch_data_samples
+ ])
+
+ # calculate losses over multiple stages
+ losses = dict()
+ for i in range(self.num_stages):
+ if isinstance(self.loss_module, nn.ModuleList):
+ # use different loss_module over different stages
+ loss_func = self.loss_module[i]
+ else:
+ # use the same loss_module over different stages
+ loss_func = self.loss_module
+
+ # the `gt_heatmaps` and `keypoint_weights` used to calculate loss
+ # for different stages are the same
+ loss_i = loss_func(multi_stage_pred_heatmaps[i], gt_heatmaps,
+ keypoint_weights)
+
+ if 'loss_kpt' not in losses:
+ losses['loss_kpt'] = loss_i
+ else:
+ losses['loss_kpt'] += loss_i
+
+ # calculate accuracy
+ _, avg_acc, _ = pose_pck_accuracy(
+ output=to_numpy(multi_stage_pred_heatmaps[-1]),
+ target=to_numpy(gt_heatmaps),
+ mask=to_numpy(keypoint_weights) > 0)
+
+ acc_pose = torch.tensor(avg_acc, device=gt_heatmaps.device)
+ losses.update(acc_pose=acc_pose)
+
+ return losses
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/heatmap_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/heatmap_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..ed4228a9d5b80924fd365500af9759fb34906361
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/heatmap_head.py
@@ -0,0 +1,389 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional, Sequence, Tuple, Union
+
+import torch
+from mmcv.cnn import build_conv_layer, build_upsample_layer
+from mmengine.structures import PixelData
+from torch import Tensor, nn
+
+from mmpose.evaluation.functional import pose_pck_accuracy
+from mmpose.models.utils.tta import flip_heatmaps
+from mmpose.registry import KEYPOINT_CODECS, MODELS
+from mmpose.utils.tensor_utils import to_numpy
+from mmpose.utils.typing import (ConfigType, Features, OptConfigType,
+ OptSampleList, Predictions)
+from ..base_head import BaseHead
+
+OptIntSeq = Optional[Sequence[int]]
+
+
+@MODELS.register_module()
+class HeatmapHead(BaseHead):
+ """Top-down heatmap head introduced in `Simple Baselines`_ by Xiao et al
+ (2018). The head is composed of a few deconvolutional layers followed by a
+ convolutional layer to generate heatmaps from low-resolution feature maps.
+
+ Args:
+ in_channels (int | Sequence[int]): Number of channels in the input
+ feature map
+ out_channels (int): Number of channels in the output heatmap
+ deconv_out_channels (Sequence[int], optional): The output channel
+ number of each deconv layer. Defaults to ``(256, 256, 256)``
+ deconv_kernel_sizes (Sequence[int | tuple], optional): The kernel size
+ of each deconv layer. Each element should be either an integer for
+ both height and width dimensions, or a tuple of two integers for
+ the height and the width dimension respectively.Defaults to
+ ``(4, 4, 4)``
+ conv_out_channels (Sequence[int], optional): The output channel number
+ of each intermediate conv layer. ``None`` means no intermediate
+ conv layer between deconv layers and the final conv layer.
+ Defaults to ``None``
+ conv_kernel_sizes (Sequence[int | tuple], optional): The kernel size
+ of each intermediate conv layer. Defaults to ``None``
+ final_layer (dict): Arguments of the final Conv2d layer.
+ Defaults to ``dict(kernel_size=1)``
+ loss (Config): Config of the keypoint loss. Defaults to use
+ :class:`KeypointMSELoss`
+ decoder (Config, optional): The decoder config that controls decoding
+ keypoint coordinates from the network output. Defaults to ``None``
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+ extra (dict, optional): Extra configurations.
+ Defaults to ``None``
+
+ .. _`Simple Baselines`: https://arxiv.org/abs/1804.06208
+ """
+
+ _version = 2
+
+ def __init__(self,
+ in_channels: Union[int, Sequence[int]],
+ out_channels: int,
+ deconv_out_channels: OptIntSeq = (256, 256, 256),
+ deconv_kernel_sizes: OptIntSeq = (4, 4, 4),
+ conv_out_channels: OptIntSeq = None,
+ conv_kernel_sizes: OptIntSeq = None,
+ final_layer: dict = dict(kernel_size=1),
+ use_silu: bool = True,
+ loss: ConfigType = dict(
+ type='KeypointMSELoss', use_target_weight=True),
+ decoder: OptConfigType = None,
+ init_cfg: OptConfigType = None):
+
+ if init_cfg is None:
+ init_cfg = self.default_init_cfg
+
+ super().__init__(init_cfg)
+
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+ self.loss_module = MODELS.build(loss)
+ if decoder is not None:
+ self.decoder = KEYPOINT_CODECS.build(decoder)
+ else:
+ self.decoder = None
+
+ self.use_silu = use_silu ## instance norm + silu instead of batchnorm + relu
+
+ if deconv_out_channels:
+ if deconv_kernel_sizes is None or len(deconv_out_channels) != len(
+ deconv_kernel_sizes):
+ raise ValueError(
+ '"deconv_out_channels" and "deconv_kernel_sizes" should '
+ 'be integer sequences with the same length. Got '
+ f'mismatched lengths {deconv_out_channels} and '
+ f'{deconv_kernel_sizes}')
+
+ self.deconv_layers = self._make_deconv_layers(
+ in_channels=in_channels,
+ layer_out_channels=deconv_out_channels,
+ layer_kernel_sizes=deconv_kernel_sizes,
+ )
+ in_channels = deconv_out_channels[-1]
+ else:
+ self.deconv_layers = nn.Identity()
+
+ if conv_out_channels:
+ if conv_kernel_sizes is None or len(conv_out_channels) != len(
+ conv_kernel_sizes):
+ raise ValueError(
+ '"conv_out_channels" and "conv_kernel_sizes" should '
+ 'be integer sequences with the same length. Got '
+ f'mismatched lengths {conv_out_channels} and '
+ f'{conv_kernel_sizes}')
+
+ self.conv_layers = self._make_conv_layers(
+ in_channels=in_channels,
+ layer_out_channels=conv_out_channels,
+ layer_kernel_sizes=conv_kernel_sizes)
+ in_channels = conv_out_channels[-1]
+ else:
+ self.conv_layers = nn.Identity()
+
+ if final_layer is not None:
+ cfg = dict(
+ type='Conv2d',
+ in_channels=in_channels,
+ out_channels=out_channels,
+ kernel_size=1)
+ cfg.update(final_layer)
+ self.final_layer = build_conv_layer(cfg)
+ else:
+ self.final_layer = nn.Identity()
+
+ # Register the hook to automatically convert old version state dicts
+ self._register_load_state_dict_pre_hook(self._load_state_dict_pre_hook)
+
+ def _make_conv_layers(self, in_channels: int,
+ layer_out_channels: Sequence[int],
+ layer_kernel_sizes: Sequence[int]) -> nn.Module:
+ """Create convolutional layers by given parameters."""
+
+ layers = []
+ for out_channels, kernel_size in zip(layer_out_channels,
+ layer_kernel_sizes):
+ padding = (kernel_size - 1) // 2
+ cfg = dict(
+ type='Conv2d',
+ in_channels=in_channels,
+ out_channels=out_channels,
+ kernel_size=kernel_size,
+ stride=1,
+ padding=padding)
+ layers.append(build_conv_layer(cfg))
+
+ if self.use_silu:
+ layers.append(nn.InstanceNorm2d(out_channels))
+ layers.append(nn.SiLU(inplace=True))
+ else:
+ layers.append(nn.BatchNorm2d(num_features=out_channels))
+ layers.append(nn.ReLU(inplace=True))
+
+ in_channels = out_channels
+
+ return nn.Sequential(*layers)
+
+ def _make_deconv_layers(self, in_channels: int,
+ layer_out_channels: Sequence[int],
+ layer_kernel_sizes: Sequence[int]) -> nn.Module:
+ """Create deconvolutional layers by given parameters."""
+
+ layers = []
+ for out_channels, kernel_size in zip(layer_out_channels,
+ layer_kernel_sizes):
+ if kernel_size == 4:
+ padding = 1
+ output_padding = 0
+ elif kernel_size == 3:
+ padding = 1
+ output_padding = 1
+ elif kernel_size == 2:
+ padding = 0
+ output_padding = 0
+ else:
+ raise ValueError(f'Unsupported kernel size {kernel_size} for'
+ 'deconvlutional layers in '
+ f'{self.__class__.__name__}')
+ cfg = dict(
+ type='deconv',
+ in_channels=in_channels,
+ out_channels=out_channels,
+ kernel_size=kernel_size,
+ stride=2,
+ padding=padding,
+ output_padding=output_padding,
+ bias=False)
+ layers.append(build_upsample_layer(cfg))
+
+ if self.use_silu:
+ layers.append(nn.InstanceNorm2d(out_channels))
+ layers.append(nn.SiLU(inplace=True))
+ else:
+ layers.append(nn.BatchNorm2d(num_features=out_channels))
+ layers.append(nn.ReLU(inplace=True))
+
+ in_channels = out_channels
+
+ return nn.Sequential(*layers)
+
+ @property
+ def default_init_cfg(self):
+ init_cfg = [
+ dict(
+ type='Normal', layer=['Conv2d', 'ConvTranspose2d'], std=0.001),
+ dict(type='Constant', layer='BatchNorm2d', val=1),
+ dict(type='Constant', layer='InstanceNorm2d', val=1, bias=0) # Initialize gamma to 1 and beta to 0
+ ]
+ return init_cfg
+
+ def forward(self, feats: Tuple[Tensor]) -> Tensor:
+ """Forward the network. The input is multi scale feature maps and the
+ output is the heatmap.
+
+ Args:
+ feats (Tuple[Tensor]): Multi scale feature maps.
+
+ Returns:
+ Tensor: output heatmap.
+ """
+ x = feats[-1]
+
+ x = self.deconv_layers(x)
+ x = self.conv_layers(x)
+ x = self.final_layer(x)
+ return x
+
+ def predict(self,
+ feats: Features,
+ batch_data_samples: OptSampleList,
+ test_cfg: ConfigType = {}) -> Predictions:
+ """Predict results from features.
+
+ Args:
+ feats (Tuple[Tensor] | List[Tuple[Tensor]]): The multi-stage
+ features (or multiple multi-stage features in TTA)
+ batch_data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+ test_cfg (dict): The runtime config for testing process. Defaults
+ to {}
+
+ Returns:
+ Union[InstanceList | Tuple[InstanceList | PixelDataList]]: If
+ ``test_cfg['output_heatmap']==True``, return both pose and heatmap
+ prediction; otherwise only return the pose prediction.
+
+ The pose prediction is a list of ``InstanceData``, each contains
+ the following fields:
+
+ - keypoints (np.ndarray): predicted keypoint coordinates in
+ shape (num_instances, K, D) where K is the keypoint number
+ and D is the keypoint dimension
+ - keypoint_scores (np.ndarray): predicted keypoint scores in
+ shape (num_instances, K)
+
+ The heatmap prediction is a list of ``PixelData``, each contains
+ the following fields:
+
+ - heatmaps (Tensor): The predicted heatmaps in shape (K, h, w)
+ """
+
+ if test_cfg.get('flip_test', False):
+ # TTA: flip test -> feats = [orig, flipped]
+ assert isinstance(feats, list) and len(feats) == 2
+ flip_indices = batch_data_samples[0].metainfo['flip_indices']
+ _feats, _feats_flip = feats
+ _batch_heatmaps = self.forward(_feats)
+ _batch_heatmaps_flip = flip_heatmaps(
+ self.forward(_feats_flip),
+ flip_mode=test_cfg.get('flip_mode', 'heatmap'),
+ flip_indices=flip_indices,
+ shift_heatmap=test_cfg.get('shift_heatmap', False))
+ batch_heatmaps = (_batch_heatmaps + _batch_heatmaps_flip) * 0.5
+ else:
+ batch_heatmaps = self.forward(feats)
+
+ preds = self.decode(batch_heatmaps)
+
+ if test_cfg.get('output_heatmaps', False):
+ pred_fields = [
+ PixelData(heatmaps=hm) for hm in batch_heatmaps.detach()
+ ]
+ return preds, pred_fields
+ else:
+ return preds
+
+ def loss(self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ train_cfg: ConfigType = {}) -> dict:
+ """Calculate losses from a batch of inputs and data samples.
+
+ Args:
+ feats (Tuple[Tensor]): The multi-stage features
+ batch_data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+ train_cfg (dict): The runtime config for training process.
+ Defaults to {}
+
+ Returns:
+ dict: A dictionary of losses.
+ """
+ pred_fields = self.forward(feats)
+ gt_heatmaps = torch.stack(
+ [d.gt_fields.heatmaps for d in batch_data_samples])
+ keypoint_weights = torch.cat([
+ d.gt_instance_labels.keypoint_weights for d in batch_data_samples
+ ])
+
+ # calculate losses
+ losses = dict()
+ loss = self.loss_module(pred_fields, gt_heatmaps, keypoint_weights)
+
+ losses.update(loss_kpt=loss)
+
+ # calculate accuracy
+ if train_cfg.get('compute_acc', True):
+ _, avg_acc, _ = pose_pck_accuracy(
+ output=to_numpy(pred_fields),
+ target=to_numpy(gt_heatmaps),
+ mask=to_numpy(keypoint_weights) > 0)
+
+ acc_pose = torch.tensor(avg_acc, device=gt_heatmaps.device)
+ losses.update(acc_pose=acc_pose)
+
+ return losses, pred_fields
+
+ def _load_state_dict_pre_hook(self, state_dict, prefix, local_meta, *args,
+ **kwargs):
+ """A hook function to convert old-version state dict of
+ :class:`DeepposeRegressionHead` (before MMPose v1.0.0) to a
+ compatible format of :class:`RegressionHead`.
+
+ The hook will be automatically registered during initialization.
+ """
+ version = local_meta.get('version', None)
+ if version and version >= self._version:
+ return
+
+ # convert old-version state dict
+ keys = list(state_dict.keys())
+ for _k in keys:
+ if not _k.startswith(prefix):
+ continue
+ v = state_dict.pop(_k)
+ k = _k[len(prefix):]
+ # In old version, "final_layer" includes both intermediate
+ # conv layers (new "conv_layers") and final conv layers (new
+ # "final_layer").
+ #
+ # If there is no intermediate conv layer, old "final_layer" will
+ # have keys like "final_layer.xxx", which should be still
+ # named "final_layer.xxx";
+ #
+ # If there are intermediate conv layers, old "final_layer" will
+ # have keys like "final_layer.n.xxx", where the weights of the last
+ # one should be renamed "final_layer.xxx", and others should be
+ # renamed "conv_layers.n.xxx"
+ k_parts = k.split('.')
+ if k_parts[0] == 'final_layer':
+ if len(k_parts) == 3:
+ assert isinstance(self.conv_layers, nn.Sequential)
+ idx = int(k_parts[1])
+ if idx < len(self.conv_layers):
+ # final_layer.n.xxx -> conv_layers.n.xxx
+ k_new = 'conv_layers.' + '.'.join(k_parts[1:])
+ else:
+ # final_layer.n.xxx -> final_layer.xxx
+ k_new = 'final_layer.' + k_parts[2]
+ else:
+ # final_layer.xxx remains final_layer.xxx
+ k_new = k
+ else:
+ k_new = k
+
+ state_dict[prefix + k_new] = v
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/mspn_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/mspn_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..23b272bcfec76401c0612d02e9b39f57bb8f32a4
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/mspn_head.py
@@ -0,0 +1,437 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import copy
+from typing import List, Optional, Sequence, Union
+
+import torch
+from mmcv.cnn import (ConvModule, DepthwiseSeparableConvModule, Linear,
+ build_activation_layer, build_norm_layer)
+from mmengine.structures import PixelData
+from torch import Tensor, nn
+
+from mmpose.evaluation.functional import pose_pck_accuracy
+from mmpose.models.utils.tta import flip_heatmaps
+from mmpose.registry import KEYPOINT_CODECS, MODELS
+from mmpose.utils.tensor_utils import to_numpy
+from mmpose.utils.typing import (ConfigType, MultiConfig, OptConfigType,
+ OptSampleList, Predictions)
+from ..base_head import BaseHead
+
+OptIntSeq = Optional[Sequence[int]]
+MSMUFeatures = Sequence[Sequence[Tensor]] # Multi-stage multi-unit features
+
+
+class PRM(nn.Module):
+ """Pose Refine Machine.
+
+ Please refer to "Learning Delicate Local Representations
+ for Multi-Person Pose Estimation" (ECCV 2020).
+
+ Args:
+ out_channels (int): Number of the output channels, equals to
+ the number of keypoints.
+ norm_cfg (Config): Config to construct the norm layer.
+ Defaults to ``dict(type='BN')``
+ """
+
+ def __init__(self,
+ out_channels: int,
+ norm_cfg: ConfigType = dict(type='BN')):
+ super().__init__()
+
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ self.out_channels = out_channels
+ self.global_pooling = nn.AdaptiveAvgPool2d((1, 1))
+ self.middle_path = nn.Sequential(
+ Linear(self.out_channels, self.out_channels),
+ build_norm_layer(dict(type='BN1d'), out_channels)[1],
+ build_activation_layer(dict(type='ReLU')),
+ Linear(self.out_channels, self.out_channels),
+ build_norm_layer(dict(type='BN1d'), out_channels)[1],
+ build_activation_layer(dict(type='ReLU')),
+ build_activation_layer(dict(type='Sigmoid')))
+
+ self.bottom_path = nn.Sequential(
+ ConvModule(
+ self.out_channels,
+ self.out_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ norm_cfg=norm_cfg,
+ inplace=False),
+ DepthwiseSeparableConvModule(
+ self.out_channels,
+ 1,
+ kernel_size=9,
+ stride=1,
+ padding=4,
+ norm_cfg=norm_cfg,
+ inplace=False), build_activation_layer(dict(type='Sigmoid')))
+ self.conv_bn_relu_prm_1 = ConvModule(
+ self.out_channels,
+ self.out_channels,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ norm_cfg=norm_cfg,
+ inplace=False)
+
+ def forward(self, x: Tensor) -> Tensor:
+ """Forward the network. The input heatmaps will be refined.
+
+ Args:
+ x (Tensor): The input heatmaps.
+
+ Returns:
+ Tensor: output heatmaps.
+ """
+ out = self.conv_bn_relu_prm_1(x)
+ out_1 = out
+
+ out_2 = self.global_pooling(out_1)
+ out_2 = out_2.view(out_2.size(0), -1)
+ out_2 = self.middle_path(out_2)
+ out_2 = out_2.unsqueeze(2)
+ out_2 = out_2.unsqueeze(3)
+
+ out_3 = self.bottom_path(out_1)
+ out = out_1 * (1 + out_2 * out_3)
+
+ return out
+
+
+class PredictHeatmap(nn.Module):
+ """Predict the heatmap for an input feature.
+
+ Args:
+ unit_channels (int): Number of input channels.
+ out_channels (int): Number of output channels.
+ out_shape (tuple): Shape of the output heatmaps.
+ use_prm (bool): Whether to use pose refine machine. Default: False.
+ norm_cfg (Config): Config to construct the norm layer.
+ Defaults to ``dict(type='BN')``
+ """
+
+ def __init__(self,
+ unit_channels: int,
+ out_channels: int,
+ out_shape: tuple,
+ use_prm: bool = False,
+ norm_cfg: ConfigType = dict(type='BN')):
+
+ super().__init__()
+
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+ self.unit_channels = unit_channels
+ self.out_channels = out_channels
+ self.out_shape = out_shape
+ self.use_prm = use_prm
+ if use_prm:
+ self.prm = PRM(out_channels, norm_cfg=norm_cfg)
+ self.conv_layers = nn.Sequential(
+ ConvModule(
+ unit_channels,
+ unit_channels,
+ kernel_size=1,
+ stride=1,
+ padding=0,
+ norm_cfg=norm_cfg,
+ inplace=False),
+ ConvModule(
+ unit_channels,
+ out_channels,
+ kernel_size=3,
+ stride=1,
+ padding=1,
+ norm_cfg=norm_cfg,
+ act_cfg=None,
+ inplace=False))
+
+ def forward(self, feature: Tensor) -> Tensor:
+ """Forward the network.
+
+ Args:
+ feature (Tensor): The input feature maps.
+
+ Returns:
+ Tensor: output heatmaps.
+ """
+ feature = self.conv_layers(feature)
+ output = nn.functional.interpolate(
+ feature, size=self.out_shape, mode='bilinear', align_corners=True)
+ if self.use_prm:
+ output = self.prm(output)
+ return output
+
+
+@MODELS.register_module()
+class MSPNHead(BaseHead):
+ """Multi-stage multi-unit heatmap head introduced in `Multi-Stage Pose
+ estimation Network (MSPN)`_ by Li et al (2019), and used by `Residual Steps
+ Networks (RSN)`_ by Cai et al (2020). The head consists of multiple stages
+ and each stage consists of multiple units. Each unit of each stage has some
+ conv layers.
+
+ Args:
+ num_stages (int): Number of stages.
+ num_units (int): Number of units in each stage.
+ out_shape (tuple): The output shape of the output heatmaps.
+ unit_channels (int): Number of input channels.
+ out_channels (int): Number of output channels.
+ out_shape (tuple): Shape of the output heatmaps.
+ use_prm (bool): Whether to use pose refine machine (PRM).
+ Defaults to ``False``.
+ norm_cfg (Config): Config to construct the norm layer.
+ Defaults to ``dict(type='BN')``
+ loss (Config | List[Config]): Config of the keypoint loss for
+ different stages and different units.
+ Defaults to use :class:`KeypointMSELoss`.
+ level_indices (Sequence[int]): The indices that specified the level
+ of target heatmaps.
+ decoder (Config, optional): The decoder config that controls decoding
+ keypoint coordinates from the network output. Defaults to ``None``
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+
+ .. _`MSPN`: https://arxiv.org/abs/1901.00148
+ .. _`RSN`: https://arxiv.org/abs/2003.04030
+ """
+ _version = 2
+
+ def __init__(self,
+ num_stages: int = 4,
+ num_units: int = 4,
+ out_shape: tuple = (64, 48),
+ unit_channels: int = 256,
+ out_channels: int = 17,
+ use_prm: bool = False,
+ norm_cfg: ConfigType = dict(type='BN'),
+ level_indices: Sequence[int] = [],
+ loss: MultiConfig = dict(
+ type='KeypointMSELoss', use_target_weight=True),
+ decoder: OptConfigType = None,
+ init_cfg: OptConfigType = None):
+ if init_cfg is None:
+ init_cfg = self.default_init_cfg
+ super().__init__(init_cfg)
+
+ self.num_stages = num_stages
+ self.num_units = num_units
+ self.out_shape = out_shape
+ self.unit_channels = unit_channels
+ self.out_channels = out_channels
+ if len(level_indices) != num_stages * num_units:
+ raise ValueError(
+ f'The length of level_indices({len(level_indices)}) did not '
+ f'match `num_stages`({num_stages}) * `num_units`({num_units})')
+
+ self.level_indices = level_indices
+
+ if isinstance(loss, list) and len(loss) != num_stages * num_units:
+ raise ValueError(
+ f'The length of loss_module({len(loss)}) did not match '
+ f'`num_stages`({num_stages}) * `num_units`({num_units})')
+
+ if isinstance(loss, list):
+ if len(loss) != num_stages * num_units:
+ raise ValueError(
+ f'The length of loss_module({len(loss)}) did not match '
+ f'`num_stages`({num_stages}) * `num_units`({num_units})')
+ self.loss_module = nn.ModuleList(
+ MODELS.build(_loss) for _loss in loss)
+ else:
+ self.loss_module = MODELS.build(loss)
+
+ if decoder is not None:
+ self.decoder = KEYPOINT_CODECS.build(decoder)
+ else:
+ self.decoder = None
+
+ # Protect mutable default arguments
+ norm_cfg = copy.deepcopy(norm_cfg)
+
+ self.predict_layers = nn.ModuleList([])
+ for i in range(self.num_stages):
+ for j in range(self.num_units):
+ self.predict_layers.append(
+ PredictHeatmap(
+ unit_channels,
+ out_channels,
+ out_shape,
+ use_prm,
+ norm_cfg=norm_cfg))
+
+ @property
+ def default_init_cfg(self):
+ """Default config for weight initialization."""
+ init_cfg = [
+ dict(type='Kaiming', layer='Conv2d'),
+ dict(type='Normal', layer='Linear', std=0.01),
+ dict(type='Constant', layer='BatchNorm2d', val=1),
+ ]
+ return init_cfg
+
+ def forward(self, feats: Sequence[Sequence[Tensor]]) -> List[Tensor]:
+ """Forward the network. The input is multi-stage multi-unit feature
+ maps and the output is a list of heatmaps from multiple stages.
+
+ Args:
+ feats (Sequence[Sequence[Tensor]]): Feature maps from multiple
+ stages and units.
+
+ Returns:
+ List[Tensor]: A list of output heatmaps from multiple stages
+ and units.
+ """
+ out = []
+ assert len(feats) == self.num_stages, (
+ f'The length of feature maps did not match the '
+ f'`num_stages` in {self.__class__.__name__}')
+ for feat in feats:
+ assert len(feat) == self.num_units, (
+ f'The length of feature maps did not match the '
+ f'`num_units` in {self.__class__.__name__}')
+ for f in feat:
+ assert f.shape[1] == self.unit_channels, (
+ f'The number of feature map channels did not match the '
+ f'`unit_channels` in {self.__class__.__name__}')
+
+ for i in range(self.num_stages):
+ for j in range(self.num_units):
+ y = self.predict_layers[i * self.num_units + j](feats[i][j])
+ out.append(y)
+ return out
+
+ def predict(self,
+ feats: Union[MSMUFeatures, List[MSMUFeatures]],
+ batch_data_samples: OptSampleList,
+ test_cfg: OptConfigType = {}) -> Predictions:
+ """Predict results from multi-stage feature maps.
+
+ Args:
+ feats (Sequence[Sequence[Tensor]]): Multi-stage multi-unit
+ features (or multiple MSMU features for TTA)
+ batch_data_samples (List[:obj:`PoseDataSample`]): The Data
+ Samples. It usually includes information such as
+ `gt_instance_labels`.
+ test_cfg (Config, optional): The testing/inference config
+
+ Returns:
+ Union[InstanceList | Tuple[InstanceList | PixelDataList]]: If
+ ``test_cfg['output_heatmap']==True``, return both pose and heatmap
+ prediction; otherwise only return the pose prediction.
+
+ The pose prediction is a list of ``InstanceData``, each contains
+ the following fields:
+
+ - keypoints (np.ndarray): predicted keypoint coordinates in
+ shape (num_instances, K, D) where K is the keypoint number
+ and D is the keypoint dimension
+ - keypoint_scores (np.ndarray): predicted keypoint scores in
+ shape (num_instances, K)
+
+ The heatmap prediction is a list of ``PixelData``, each contains
+ the following fields:
+
+ - heatmaps (Tensor): The predicted heatmaps in shape (K, h, w)
+ """
+ # multi-stage multi-unit batch heatmaps
+ if test_cfg.get('flip_test', False):
+ # TTA: flip test
+ assert isinstance(feats, list) and len(feats) == 2
+ flip_indices = batch_data_samples[0].metainfo['flip_indices']
+ _feats, _feats_flip = feats
+ _batch_heatmaps = self.forward(_feats)[-1]
+ _batch_heatmaps_flip = flip_heatmaps(
+ self.forward(_feats_flip)[-1],
+ flip_mode=test_cfg.get('flip_mode', 'heatmap'),
+ flip_indices=flip_indices,
+ shift_heatmap=test_cfg.get('shift_heatmap', False))
+ batch_heatmaps = (_batch_heatmaps + _batch_heatmaps_flip) * 0.5
+ else:
+ msmu_batch_heatmaps = self.forward(feats)
+ batch_heatmaps = msmu_batch_heatmaps[-1]
+
+ preds = self.decode(batch_heatmaps)
+
+ if test_cfg.get('output_heatmaps', False):
+ pred_fields = [
+ PixelData(heatmaps=hm) for hm in batch_heatmaps.detach()
+ ]
+ return preds, pred_fields
+ else:
+ return preds
+
+ def loss(self,
+ feats: MSMUFeatures,
+ batch_data_samples: OptSampleList,
+ train_cfg: OptConfigType = {}) -> dict:
+ """Calculate losses from a batch of inputs and data samples.
+
+ Note:
+ - batch_size: B
+ - num_output_heatmap_levels: L
+ - num_keypoints: K
+ - heatmaps height: H
+ - heatmaps weight: W
+ - num_instances: N (usually 1 in topdown heatmap heads)
+
+ Args:
+ feats (Sequence[Sequence[Tensor]]): Feature maps from multiple
+ stages and units
+ batch_data_samples (List[:obj:`PoseDataSample`]): The Data
+ Samples. It usually includes information such as
+ `gt_instance_labels` and `gt_fields`.
+ train_cfg (Config, optional): The training config
+
+ Returns:
+ dict: A dictionary of loss components.
+ """
+ # multi-stage multi-unit predict heatmaps
+ msmu_pred_heatmaps = self.forward(feats)
+
+ keypoint_weights = torch.cat([
+ d.gt_instance_labels.keypoint_weights for d in batch_data_samples
+ ]) # shape: [B*N, L, K]
+
+ # calculate losses over multiple stages and multiple units
+ losses = dict()
+ for i in range(self.num_stages * self.num_units):
+ if isinstance(self.loss_module, nn.ModuleList):
+ # use different loss_module over different stages and units
+ loss_func = self.loss_module[i]
+ else:
+ # use the same loss_module over different stages and units
+ loss_func = self.loss_module
+
+ # select `gt_heatmaps` and `keypoint_weights` for different level
+ # according to `self.level_indices` to calculate loss
+ gt_heatmaps = torch.stack([
+ d.gt_fields[self.level_indices[i]].heatmaps
+ for d in batch_data_samples
+ ])
+ loss_i = loss_func(msmu_pred_heatmaps[i], gt_heatmaps,
+ keypoint_weights[:, self.level_indices[i]])
+
+ if 'loss_kpt' not in losses:
+ losses['loss_kpt'] = loss_i
+ else:
+ losses['loss_kpt'] += loss_i
+
+ # calculate accuracy
+ _, avg_acc, _ = pose_pck_accuracy(
+ output=to_numpy(msmu_pred_heatmaps[-1]),
+ target=to_numpy(gt_heatmaps),
+ mask=to_numpy(keypoint_weights[:, -1]) > 0)
+
+ acc_pose = torch.tensor(avg_acc, device=gt_heatmaps.device)
+ losses.update(acc_pose=acc_pose)
+
+ return losses
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/pose3d_heatmap_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/pose3d_heatmap_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..0892433c31aa7424e8a047bcd02b1642ed2bdc51
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/pose3d_heatmap_head.py
@@ -0,0 +1,507 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional, Sequence, Tuple, Union
+
+import torch
+from mmcv.cnn import build_conv_layer, build_upsample_layer
+from mmengine.structures import PixelData, InstanceData
+from torch import Tensor, nn
+import numpy as np
+from mmpose.evaluation.functional import pose_pck_accuracy
+from mmpose.models.utils.tta import flip_heatmaps
+from mmpose.registry import KEYPOINT_CODECS, MODELS
+from mmpose.utils.tensor_utils import to_numpy
+from mmpose.utils.typing import (ConfigType, Features, OptConfigType,
+ OptSampleList, Predictions)
+from ..base_head import BaseHead
+from torch.nn import functional as F
+
+OptIntSeq = Optional[Sequence[int]]
+
+@MODELS.register_module()
+class Pose3dHeatmapHead(BaseHead):
+ _version = 2
+
+ def __init__(self,
+ in_channels: Union[int, Sequence[int]],
+ num_keypoints: int,
+ image_to_heatmap_ratio: float = 4.0,
+ depth_conv_out_channels: OptIntSeq = (256, 256, 256),
+ depth_conv_kernel_sizes: OptIntSeq = (4, 4, 4),
+ depth_final_layer: OptIntSeq = (1536, 1536, 1536),
+ K_conv_out_channels: OptIntSeq = (256, 256, 256),
+ K_conv_kernel_sizes: OptIntSeq = (4, 4, 4),
+ K_final_layer: OptIntSeq = (1536, 1536, 1536),
+ loss: ConfigType = dict(type='KeypointMSELoss', use_target_weight=True),
+ init_cfg: OptConfigType = None):
+
+ if init_cfg is None:
+ init_cfg = self.default_init_cfg
+
+ super().__init__(init_cfg)
+
+ self.in_channels = in_channels
+ self.num_keypoints = num_keypoints
+ self.image_to_heatmap_ratio = image_to_heatmap_ratio
+
+ if isinstance(loss, dict):
+ self.loss_module = MODELS.build(loss)
+ elif isinstance(loss, (list, tuple)):
+ self.loss_module = nn.ModuleList()
+ for this_loss in loss:
+ self.loss_module.append(MODELS.build(this_loss))
+ else:
+ raise TypeError(f'loss must be a dict or sequence of dict,\
+ but got {type(loss)}')
+
+ self.decoder = None
+
+ self.depth_conv_layers = self._make_conv_layers(
+ in_channels=in_channels,
+ layer_out_channels=depth_conv_out_channels,
+ layer_kernel_sizes=depth_conv_kernel_sizes)
+ self.depth_final_layer = self._make_final_layer(depth_final_layer)
+
+ self.K_conv_layers = self._make_conv_layers(
+ in_channels=in_channels,
+ layer_out_channels=K_conv_out_channels,
+ layer_kernel_sizes=K_conv_kernel_sizes)
+ self.K_final_layer = self._make_final_layer(K_final_layer)
+
+ # Register the hook to automatically convert old version state dicts
+ self._register_load_state_dict_pre_hook(self._load_state_dict_pre_hook)
+
+ def _make_final_layer(self, final_layer: Sequence[int]) -> nn.Module:
+ """Create final layer by given parameters."""
+ layers = [nn.Flatten()]
+ in_features = final_layer[0]
+
+ for i in range(1, len(final_layer)):
+ layers.append(nn.Linear(in_features, final_layer[i]))
+ if i < len(final_layer) - 1: # No activation after the last layer
+ layers.append(nn.SiLU())
+ in_features = final_layer[i]
+
+ return nn.Sequential(*layers)
+
+ def _make_conv_layers(self, in_channels: int,
+ layer_out_channels: Sequence[int],
+ layer_kernel_sizes: Sequence[int]) -> nn.Module:
+ """Create convolutional layers by given parameters."""
+
+ layers = []
+ for out_channels, kernel_size in zip(layer_out_channels,
+ layer_kernel_sizes):
+ stride = 2 # Set stride to 2 to reduce resolution by half
+ padding = (kernel_size - 1) // 2
+ cfg = dict(
+ type='Conv2d',
+ in_channels=in_channels,
+ out_channels=out_channels,
+ kernel_size=kernel_size,
+ stride=stride,
+ padding=padding)
+ layers.append(build_conv_layer(cfg))
+ layers.append(nn.InstanceNorm2d(out_channels))
+ layers.append(nn.SiLU(inplace=True))
+
+ in_channels = out_channels
+
+ return nn.Sequential(*layers)
+
+
+ @property
+ def default_init_cfg(self):
+ init_cfg = [
+ dict(
+ type='Normal', layer=['Conv2d', 'ConvTranspose2d'], std=0.001),
+ dict(type='Constant', layer='BatchNorm2d', val=1),
+ dict(type='Constant', layer='InstanceNorm2d', val=1, bias=0) # Initialize gamma to 1 and beta to 0
+ ]
+ return init_cfg
+
+ def forward(self, feats: Tuple[Tensor]) -> Tensor:
+ """Forward the network. The input is multi scale feature maps and the
+ output is the heatmap.
+
+ Args:
+ feats (Tuple[Tensor]): Multi scale feature maps.
+
+ Returns:
+ Tensor: output heatmap.
+ """
+ x = feats[-1] ## B x C x H x W i.e 1 x 1536 x 64 x 48
+
+ x_depth = self.depth_conv_layers(x)
+ depth = self.depth_final_layer(x_depth) # B x num_keypoints
+
+ x_K = self.K_conv_layers(x)
+ K = self.K_final_layer(x_K) ## B x num_keypoints*4
+ K = K.view(-1, self.num_keypoints, 4) ## B x num_keypoints x 4, fx, fy, cx, cy
+
+ return (depth, K)
+
+ def predict(self,
+ feats: Features,
+ batch_pred_instances: OptSampleList,
+ batch_data_samples: OptSampleList,
+ test_cfg: ConfigType = {}) -> Predictions:
+ (preds_depth, preds_K) = self.forward(feats)
+
+ preds_pose2d = np.stack([pred.keypoints[0] for pred in batch_pred_instances], axis=0) ## B x num_keypoints x 2
+ preds_pose2d = torch.from_numpy(preds_pose2d).to(preds_depth.device) ## B x num_keypoints x
+
+ preds_confidence = np.stack([pred.keypoint_scores[0] for pred in batch_pred_instances], axis=0) ## B x num_keypoints, numpy already
+
+ preds_pose3d = self.compute_pose3d(depth=preds_depth, K=preds_K, pose2d=preds_pose2d) ## B x num_keypoints x 3
+
+ preds_pose3d = to_numpy(preds_pose3d, unzip=True) #B x 308 x 3
+ preds_K = to_numpy(preds_K, unzip=True) #B x 308 x 4
+ preds_pose2d = to_numpy(preds_pose2d, unzip=True) #B x 308 x 2
+
+ ## important to add a dummy batch dimension to add_pred_to_data_sample
+ preds = [
+ InstanceData(keypoints_3d=pred_pose3d[np.newaxis, ...], \
+ keypoints=pred_pose2d[np.newaxis, ...], \
+ keypoint_scores=pred_confidence[np.newaxis, ...], \
+ intrinsics=pred_K[np.newaxis, ...])
+ for pred_pose3d, pred_pose2d, pred_K, pred_confidence in zip(preds_pose3d, preds_pose2d, preds_K, preds_confidence)
+ ]
+
+ return preds
+
+ def compute_pose3d(self, depth: Tensor, K: Tensor, pose2d: Tensor) -> Tensor:
+ """
+ Compute 3D pose from 2D pose, depth, and per-keypoint camera intrinsics.
+
+ Args:
+ depth: Tensor of shape (B, N_keypoints) representing depth values for each keypoint
+ K: Tensor of shape (B, N_keypoints, 4) representing camera intrinsics (fx, fy, cx, cy) per keypoint
+ pose2d: Tensor of shape (B, N_keypoints, 2) representing 2D pose
+
+ Returns:
+ Tensor of shape (B, N_keypoints, 3) representing 3D pose
+ """
+ batch_size, num_keypoints, _ = pose2d.shape
+
+ # Add shape assertions
+ assert depth.shape == (batch_size, num_keypoints), "Depth shape mismatch"
+ assert K.shape == (batch_size, num_keypoints, 4), "Camera intrinsics shape mismatch"
+ assert pose2d.shape == (batch_size, num_keypoints, 2), "2D pose shape mismatch"
+
+ # Unpack camera intrinsics
+ fx = K[..., 0] # Shape: (B, N_keypoints)
+ fy = K[..., 1] # Shape: (B, N_keypoints)
+ cx = K[..., 2] # Shape: (B, N_keypoints)
+ cy = K[..., 3] # Shape: (B, N_keypoints)
+
+ # Extract 2D coordinates
+ x = pose2d[..., 0] # Shape: (B, N_keypoints)
+ y = pose2d[..., 1] # Shape: (B, N_keypoints)
+
+ # Normalize coordinates
+ x_norm = (x - cx) / fx
+ y_norm = (y - cy) / fy
+
+ # Create 3D coordinates
+ z = depth # Shape: (B, N_keypoints)
+ x_3d = x_norm * z
+ y_3d = y_norm * z
+
+ # Combine into 3D coordinates
+ pose3d = torch.stack([x_3d, y_3d, z], dim=-1) # Shape: (B, N_keypoints, 3)
+
+ return pose3d
+
+ def compute_pose2d(self, pose3d: Tensor, K: Tensor) -> Tensor:
+ """
+ Compute 2D pose from 3D pose and per-keypoint camera intrinsics.
+
+ Args:
+ pose3d: Tensor of shape (B, N_keypoints, 3) representing 3D pose
+ K: Tensor of shape (B, N_keypoints, 4) representing camera intrinsics (fx, fy, cx, cy) per keypoint
+
+ Returns:
+ Tensor of shape (B, N_keypoints, 2) representing 2D pose
+ """
+ batch_size, num_keypoints, _ = pose3d.shape
+
+ # Add shape assertions
+ assert pose3d.shape == (batch_size, num_keypoints, 3), "3D pose shape mismatch"
+ assert K.shape == (batch_size, num_keypoints, 4), "Camera intrinsics shape mismatch"
+
+ # Unpack camera intrinsics
+ fx = K[..., 0] # Shape: (B, N_keypoints)
+ fy = K[..., 1] # Shape: (B, N_keypoints)
+ cx = K[..., 2] # Shape: (B, N_keypoints)
+ cy = K[..., 3] # Shape: (B, N_keypoints)
+
+ # Extract 3D coordinates
+ X = pose3d[..., 0] # Shape: (B, N_keypoints)
+ Y = pose3d[..., 1] # Shape: (B, N_keypoints)
+ Z = pose3d[..., 2] # Shape: (B, N_keypoints)
+
+ # Project 3D points to 2D
+ u = X * fx / Z + cx
+ v = Y * fy / Z + cy
+
+ pose2d = torch.stack([u, v], dim=-1) # Shape: (B, N_keypoints, 2)
+
+ return pose2d
+
+ def decode_pose2d_heatmaps(self, heatmaps_original: torch.Tensor) -> Tensor:
+ """Decode the heatmaps to keypoints using a differentiable approximation of argmax.
+ Args:
+ heatmaps (Tensor): B x K x H x W heatmaps with Gaussian targets.
+
+ Returns:
+ Tensor: The decoded keypoints in image coordinates (B x K x 2)
+ """
+
+ B, K, H, W = heatmaps_original.shape
+
+ # Create a copy of heatmaps and detach it
+ heatmaps = heatmaps_original.clone().detach()
+
+ # Create coordinate maps
+ y_range = torch.arange(H, dtype=heatmaps.dtype, device=heatmaps.device)
+ x_range = torch.arange(W, dtype=heatmaps.dtype, device=heatmaps.device)
+ y_map, x_map = torch.meshgrid(y_range, x_range, indexing='ij')
+
+ # Normalize heatmaps
+ heatmaps_normalized = heatmaps / torch.sum(heatmaps.view(B, K, -1), dim=2).view(B, K, 1, 1)
+
+ # Compute weighted sum of coordinates
+ y_coord = torch.sum(heatmaps_normalized * y_map, dim=(2, 3))
+ x_coord = torch.sum(heatmaps_normalized * x_map, dim=(2, 3))
+
+ # Stack coordinates
+ keypoints = torch.stack((x_coord, y_coord), dim=-1)
+
+ # Scale keypoints to image coordinates
+ keypoints = keypoints * self.image_to_heatmap_ratio
+
+ return keypoints
+
+ def decode_softargmax_pose2d_heatmap(self, heatmaps_original: torch.Tensor, beta: float = 100.0) -> torch.Tensor:
+ """Decode the heatmaps to keypoints using softargmax.
+ Args:
+ heatmaps_original (torch.Tensor): B x K x H x W heatmaps with Gaussian targets.
+ beta (float): Temperature parameter for softmax. Higher values make it sharper.
+
+ Returns:
+ torch.Tensor: The decoded keypoints in image coordinates (B x K x 2)
+ """
+ B, K, H, W = heatmaps_original.shape
+
+ # Create a copy of heatmaps and detach it
+ heatmaps = heatmaps_original.clone().detach()
+
+ # Create coordinate maps
+ y_range = torch.arange(H, dtype=heatmaps.dtype, device=heatmaps.device)
+ x_range = torch.arange(W, dtype=heatmaps.dtype, device=heatmaps.device)
+ y_map, x_map = torch.meshgrid(y_range, x_range, indexing='ij')
+
+ # Reshape heatmaps for softmax
+ heatmaps_reshaped = heatmaps.view(B, K, -1)
+
+ # Apply softmax with temperature
+ heatmaps_softmax = F.softmax(beta * heatmaps_reshaped, dim=-1)
+
+ # Reshape coordinate maps
+ y_map_flat = y_map.reshape(-1)
+ x_map_flat = x_map.reshape(-1)
+
+ # Compute weighted sum of coordinates
+ y_coord = torch.sum(heatmaps_softmax * y_map_flat, dim=-1)
+ x_coord = torch.sum(heatmaps_softmax * x_map_flat, dim=-1)
+
+ # Stack coordinates
+ keypoints = torch.stack((x_coord, y_coord), dim=-1)
+
+ # Scale keypoints to image coordinates
+ keypoints = keypoints * self.image_to_heatmap_ratio
+
+ return keypoints
+
+ def decode_argmax_pose2d_heatmap(self, heatmaps: torch.Tensor) -> torch.Tensor:
+ """Decode the heatmaps to keypoints using argmax.
+
+ Args:
+ heatmaps (torch.Tensor): B x K x H x W heatmaps with Gaussian targets.
+
+ Returns:
+ torch.Tensor: The decoded keypoints in image coordinates (B x K x 2)
+ """
+ B, K, H, W = heatmaps.shape
+
+ # Flatten the last two dimensions
+ heatmaps_flat = heatmaps.view(B, K, -1)
+
+ # Get the indices of the maximum values
+ max_indices = torch.argmax(heatmaps_flat, dim=-1)
+
+ # Convert indices to y, x coordinates
+ y_coord = max_indices // W
+ x_coord = max_indices % W
+
+ # Stack coordinates
+ keypoints = torch.stack((x_coord, y_coord), dim=-1).float()
+
+ # Scale keypoints to image coordinates
+ keypoints = keypoints * self.image_to_heatmap_ratio
+
+ return keypoints
+
+ def loss(self,
+ feats: Tuple[Tensor],
+ pose2d_heatmaps: Tensor,
+ batch_data_samples: OptSampleList,
+ train_cfg: ConfigType = {}) -> dict:
+
+ (pred_depth, pred_K) = self.forward(feats) ## pred_depth is B x num_keypoints, pred_K is B x num_keypoints x 4
+
+ device = pred_depth.device
+ gt_pose3d = torch.stack([torch.from_numpy(d.gt_instances.pose3d[0]).to(device) for d in batch_data_samples]) ## B x num_keypoints x 3
+ gt_pose3d_visible = torch.stack([torch.from_numpy(d.gt_instances.pose3d_visible[0]).to(device) for d in batch_data_samples]) ## B x num_keypoints
+
+ ## B x num_keypoints x 2. do not use keypoints. use transformed_keypoints
+ gt_pose2d = torch.stack([torch.from_numpy(d.gt_instances.transformed_keypoints[0].astype(np.float32)).to(device) for d in batch_data_samples])
+
+ ## filtered according to transformed keypoints
+ gt_pose2d_visible = torch.stack([torch.from_numpy(d.gt_instances.keypoints_visible[0]).to(device) for d in batch_data_samples]) ## B x num_keypoints.
+
+ ## remove out of bound keypoints of gt_pose2d_visible
+ gt_K = torch.stack([torch.from_numpy(d.K.astype(np.float32)).to(device) for d in batch_data_samples]) ##
+ gt_fx = gt_K[:, 0, 0]; gt_fy = gt_K[:, 1, 1]; gt_cx = gt_K[:, 0, 2]; gt_cy = gt_K[:, 1, 2]
+ gt_K = torch.stack([gt_fx, gt_fy, gt_cx, gt_cy], dim=1) ## B x 4
+ gt_K = gt_K.view(-1, 1, 4).repeat(1, self.num_keypoints, 1) ## B x num_keypoints x 4. copy per keypoint
+
+ ## compute 2d pose coordinates from the downsamples heatmaps. we clone and detach the heatmaps to avoid backprop
+ # pred_pose2d = self.decode_pose2d_heatmaps(pose2d_heatmaps) ## B x num_keypoints x 2 ## gaussian expectation
+ pred_pose2d = self.decode_softargmax_pose2d_heatmap(pose2d_heatmaps) ## B x num_keypoints x 2 ## soft argmax with beta=100
+ # hard_pred_pose2d = self.decode_argmax_pose2d_heatmap(pose2d_heatmaps) ## B x num_keypoints x 2 ## hard argmax
+
+ ## compute pred_pose2d using pred_pose3d, pred_K
+ pred_pose3d = self.compute_pose3d(depth=pred_depth, K=pred_K, pose2d=pred_pose2d) ## B x num_keypoints x 3
+
+ # calculate losses
+ losses = self.compute_losses(pred_pose3d, gt_pose3d, gt_pose3d_visible, pred_pose2d, gt_pose2d, gt_pose2d_visible, pred_K, gt_K)
+
+ return losses, {'pose3d': pred_pose3d, 'K': pred_K, 'pose2d': pred_pose2d}
+
+ def compute_losses(self, pred_pose3d, gt_pose3d, gt_pose3d_visible, pred_pose2d, gt_pose2d, gt_pose2d_visible, pred_K, gt_K):
+ """
+ pred_pose3d and gt_pose3d: B x N_keypoints x 3
+ gt_pose3d_visible: B x N_keypoints
+ pred_pose2d and gt_pose2d: B x N_keypoints x 2
+ gt_pose2d_visible: B x N_keypoints
+ pred_K and gt_K: B x N_keypoints x 4. fx, fy, cx, cy
+ pred_confidence: B x N_keypoints
+ """
+ losses = dict()
+ if not isinstance(self.loss_module, nn.ModuleList):
+ losses_decode = [self.loss_module]
+ else:
+ losses_decode = self.loss_module
+
+ for loss_decode in losses_decode:
+
+ ## loss on X, Y, Z. computed using pred_depth, pred_K, gt_pose2d
+ if loss_decode.loss_name == 'loss_pose3d_l1':
+ this_loss = loss_decode(
+ output=pred_pose3d,
+ target=gt_pose3d,
+ target_weight=gt_pose3d_visible,
+ )
+
+ ## loss on fx, fy, cx, cy
+ elif loss_decode.loss_name == 'loss_pose3d_K':
+ this_loss = loss_decode(
+ output=pred_K,
+ target=gt_K,
+ target_weight=gt_pose3d_visible,
+ )
+ ## on relative depth Z
+ elif loss_decode.loss_name == 'loss_pose3d_rel_depth':
+ this_loss = loss_decode(
+ output=pred_pose3d[:, :, 2],
+ target=gt_pose3d[:, :, 2],
+ target_weight=gt_pose3d_visible,
+ )
+
+ elif loss_decode.loss_name == 'loss_pose3d_pose2d_l1':
+ this_loss = loss_decode(
+ output=pred_pose2d,
+ target=gt_pose2d,
+ target_weight=gt_pose2d_visible,
+ )
+ elif loss_decode.loss_name == 'loss_pose3d_depth_l1':
+ this_loss = loss_decode(
+ output=pred_pose3d[:, :, 2],
+ target=gt_pose3d[:, :, 2],
+ target_weight=gt_pose3d_visible,
+ )
+
+ if loss_decode.loss_name not in losses:
+ losses[loss_decode.loss_name] = this_loss
+ else:
+ losses[loss_decode.loss_name] += this_loss
+
+ return losses
+
+ def _load_state_dict_pre_hook(self, state_dict, prefix, local_meta, *args,
+ **kwargs):
+ """A hook function to convert old-version state dict of
+ :class:`DeepposeRegressionHead` (before MMPose v1.0.0) to a
+ compatible format of :class:`RegressionHead`.
+
+ The hook will be automatically registered during initialization.
+ """
+ version = local_meta.get('version', None)
+ if version and version >= self._version:
+ return
+
+ # convert old-version state dict
+ keys = list(state_dict.keys())
+ for _k in keys:
+ if not _k.startswith(prefix):
+ continue
+ v = state_dict.pop(_k)
+ k = _k[len(prefix):]
+ # In old version, "final_layer" includes both intermediate
+ # conv layers (new "conv_layers") and final conv layers (new
+ # "final_layer").
+ #
+ # If there is no intermediate conv layer, old "final_layer" will
+ # have keys like "final_layer.xxx", which should be still
+ # named "final_layer.xxx";
+ #
+ # If there are intermediate conv layers, old "final_layer" will
+ # have keys like "final_layer.n.xxx", where the weights of the last
+ # one should be renamed "final_layer.xxx", and others should be
+ # renamed "conv_layers.n.xxx"
+ k_parts = k.split('.')
+ if k_parts[0] == 'final_layer':
+ if len(k_parts) == 3:
+ assert isinstance(self.conv_layers, nn.Sequential)
+ idx = int(k_parts[1])
+ if idx < len(self.conv_layers):
+ # final_layer.n.xxx -> conv_layers.n.xxx
+ k_new = 'conv_layers.' + '.'.join(k_parts[1:])
+ else:
+ # final_layer.n.xxx -> final_layer.xxx
+ k_new = 'final_layer.' + k_parts[2]
+ else:
+ # final_layer.xxx remains final_layer.xxx
+ k_new = k
+ else:
+ k_new = k
+
+ state_dict[prefix + k_new] = v
+
+
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/vipnas_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/vipnas_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..caa7a137ff7c6f2fbe9c609c37fa82771eff3caf
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/heatmap_heads/vipnas_head.py
@@ -0,0 +1,184 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional, Sequence, Union
+
+from mmcv.cnn import build_conv_layer, build_upsample_layer
+from torch import nn
+
+from mmpose.registry import KEYPOINT_CODECS, MODELS
+from mmpose.utils.typing import ConfigType, OptConfigType
+from .heatmap_head import HeatmapHead
+
+OptIntSeq = Optional[Sequence[int]]
+
+
+@MODELS.register_module()
+class ViPNASHead(HeatmapHead):
+ """ViPNAS heatmap head introduced in `ViPNAS`_ by Xu et al (2021). The head
+ is composed of a few deconvolutional layers followed by a convolutional
+ layer to generate heatmaps from low-resolution feature maps. Specifically,
+ different from the :class: `HeatmapHead` introduced by `Simple Baselines`_,
+ the group numbers in the deconvolutional layers are elastic and thus can be
+ optimized by neural architecture search (NAS).
+
+ Args:
+ in_channels (int | Sequence[int]): Number of channels in the input
+ feature map
+ out_channels (int): Number of channels in the output heatmap
+ deconv_out_channels (Sequence[int], optional): The output channel
+ number of each deconv layer. Defaults to ``(144, 144, 144)``
+ deconv_kernel_sizes (Sequence[int | tuple], optional): The kernel size
+ of each deconv layer. Each element should be either an integer for
+ both height and width dimensions, or a tuple of two integers for
+ the height and the width dimension respectively.Defaults to
+ ``(4, 4, 4)``
+ deconv_num_groups (Sequence[int], optional): The group number of each
+ deconv layer. Defaults to ``(16, 16, 16)``
+ conv_out_channels (Sequence[int], optional): The output channel number
+ of each intermediate conv layer. ``None`` means no intermediate
+ conv layer between deconv layers and the final conv layer.
+ Defaults to ``None``
+ conv_kernel_sizes (Sequence[int | tuple], optional): The kernel size
+ of each intermediate conv layer. Defaults to ``None``
+ final_layer (dict): Arguments of the final Conv2d layer.
+ Defaults to ``dict(kernel_size=1)``
+ loss (Config): Config of the keypoint loss. Defaults to use
+ :class:`KeypointMSELoss`
+ decoder (Config, optional): The decoder config that controls decoding
+ keypoint coordinates from the network output. Defaults to ``None``
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+
+ .. _`ViPNAS`: https://arxiv.org/abs/2105.10154
+ .. _`Simple Baselines`: https://arxiv.org/abs/1804.06208
+ """
+
+ _version = 2
+
+ def __init__(self,
+ in_channels: Union[int, Sequence[int]],
+ out_channels: int,
+ deconv_out_channels: OptIntSeq = (144, 144, 144),
+ deconv_kernel_sizes: OptIntSeq = (4, 4, 4),
+ deconv_num_groups: OptIntSeq = (16, 16, 16),
+ conv_out_channels: OptIntSeq = None,
+ conv_kernel_sizes: OptIntSeq = None,
+ final_layer: dict = dict(kernel_size=1),
+ loss: ConfigType = dict(
+ type='KeypointMSELoss', use_target_weight=True),
+ decoder: OptConfigType = None,
+ init_cfg: OptConfigType = None):
+
+ if init_cfg is None:
+ init_cfg = self.default_init_cfg
+
+ super(HeatmapHead, self).__init__(init_cfg)
+
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+ self.loss_module = MODELS.build(loss)
+ if decoder is not None:
+ self.decoder = KEYPOINT_CODECS.build(decoder)
+ else:
+ self.decoder = None
+
+ if deconv_out_channels:
+ if deconv_kernel_sizes is None or len(deconv_out_channels) != len(
+ deconv_kernel_sizes):
+ raise ValueError(
+ '"deconv_out_channels" and "deconv_kernel_sizes" should '
+ 'be integer sequences with the same length. Got '
+ f'mismatched lengths {deconv_out_channels} and '
+ f'{deconv_kernel_sizes}')
+ if deconv_num_groups is None or len(deconv_out_channels) != len(
+ deconv_num_groups):
+ raise ValueError(
+ '"deconv_out_channels" and "deconv_num_groups" should '
+ 'be integer sequences with the same length. Got '
+ f'mismatched lengths {deconv_out_channels} and '
+ f'{deconv_num_groups}')
+
+ self.deconv_layers = self._make_deconv_layers(
+ in_channels=in_channels,
+ layer_out_channels=deconv_out_channels,
+ layer_kernel_sizes=deconv_kernel_sizes,
+ layer_groups=deconv_num_groups,
+ )
+ in_channels = deconv_out_channels[-1]
+ else:
+ self.deconv_layers = nn.Identity()
+
+ if conv_out_channels:
+ if conv_kernel_sizes is None or len(conv_out_channels) != len(
+ conv_kernel_sizes):
+ raise ValueError(
+ '"conv_out_channels" and "conv_kernel_sizes" should '
+ 'be integer sequences with the same length. Got '
+ f'mismatched lengths {conv_out_channels} and '
+ f'{conv_kernel_sizes}')
+
+ self.conv_layers = self._make_conv_layers(
+ in_channels=in_channels,
+ layer_out_channels=conv_out_channels,
+ layer_kernel_sizes=conv_kernel_sizes)
+ in_channels = conv_out_channels[-1]
+ else:
+ self.conv_layers = nn.Identity()
+
+ if final_layer is not None:
+ cfg = dict(
+ type='Conv2d',
+ in_channels=in_channels,
+ out_channels=out_channels,
+ kernel_size=1)
+ cfg.update(final_layer)
+ self.final_layer = build_conv_layer(cfg)
+ else:
+ self.final_layer = nn.Identity()
+
+ # Register the hook to automatically convert old version state dicts
+ self._register_load_state_dict_pre_hook(self._load_state_dict_pre_hook)
+
+ def _make_deconv_layers(self, in_channels: int,
+ layer_out_channels: Sequence[int],
+ layer_kernel_sizes: Sequence[int],
+ layer_groups: Sequence[int]) -> nn.Module:
+ """Create deconvolutional layers by given parameters."""
+
+ layers = []
+ for out_channels, kernel_size, groups in zip(layer_out_channels,
+ layer_kernel_sizes,
+ layer_groups):
+ if kernel_size == 4:
+ padding = 1
+ output_padding = 0
+ elif kernel_size == 3:
+ padding = 1
+ output_padding = 1
+ elif kernel_size == 2:
+ padding = 0
+ output_padding = 0
+ else:
+ raise ValueError(f'Unsupported kernel size {kernel_size} for'
+ 'deconvlutional layers in '
+ f'{self.__class__.__name__}')
+ cfg = dict(
+ type='deconv',
+ in_channels=in_channels,
+ out_channels=out_channels,
+ kernel_size=kernel_size,
+ groups=groups,
+ stride=2,
+ padding=padding,
+ output_padding=output_padding,
+ bias=False)
+ layers.append(build_upsample_layer(cfg))
+ layers.append(nn.BatchNorm2d(num_features=out_channels))
+ layers.append(nn.ReLU(inplace=True))
+ in_channels = out_channels
+
+ return nn.Sequential(*layers)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..23d5082e92d6735e2084416387f03715a4546815
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/__init__.py
@@ -0,0 +1,10 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .dekr_head import DEKRHead
+from .vis_head import VisPredictHead
+
+__all__ = ['DEKRHead', 'VisPredictHead']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..294bcdd73119b59c73b15291a45b987792dc7df2
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/__pycache__/dekr_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/__pycache__/dekr_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2eb0cf8fced870c1f99978dda0f61c623d9054f5
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/__pycache__/dekr_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/__pycache__/vis_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/__pycache__/vis_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a29506bcaa9711f7aca60ab4c84849a321398edd
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/__pycache__/vis_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/dekr_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/dekr_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..b57b4f54a21f73d0ee77df3c5f577c090d4efaa2
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/dekr_head.py
@@ -0,0 +1,586 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Sequence, Tuple, Union
+
+import torch
+from mmcv.cnn import (ConvModule, build_activation_layer, build_conv_layer,
+ build_norm_layer)
+from mmengine.model import BaseModule, ModuleDict, Sequential
+from mmengine.structures import InstanceData, PixelData
+from torch import Tensor
+
+from mmpose.evaluation.functional.nms import nearby_joints_nms
+from mmpose.models.utils.tta import flip_heatmaps
+from mmpose.registry import KEYPOINT_CODECS, MODELS
+from mmpose.utils.tensor_utils import to_numpy
+from mmpose.utils.typing import (ConfigType, Features, InstanceList,
+ OptConfigType, OptSampleList, Predictions)
+from ...backbones.resnet import BasicBlock
+from ..base_head import BaseHead
+
+try:
+ from mmcv.ops import DeformConv2d
+ has_mmcv_full = True
+except (ImportError, ModuleNotFoundError):
+ has_mmcv_full = False
+
+
+class AdaptiveActivationBlock(BaseModule):
+ """Adaptive activation convolution block. "Bottom-up human pose estimation
+ via disentangled keypoint regression", CVPR'2021.
+
+ Args:
+ in_channels (int): Number of input channels
+ out_channels (int): Number of output channels
+ groups (int): Number of groups. Generally equal to the
+ number of joints.
+ norm_cfg (dict): Config for normalization layers.
+ act_cfg (dict): Config for activation layers.
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ groups=1,
+ norm_cfg=dict(type='BN'),
+ act_cfg=dict(type='ReLU'),
+ init_cfg=None):
+ super(AdaptiveActivationBlock, self).__init__(init_cfg=init_cfg)
+
+ assert in_channels % groups == 0 and out_channels % groups == 0
+ self.groups = groups
+
+ regular_matrix = torch.tensor([[-1, -1, -1, 0, 0, 0, 1, 1, 1],
+ [-1, 0, 1, -1, 0, 1, -1, 0, 1],
+ [1, 1, 1, 1, 1, 1, 1, 1, 1]])
+ self.register_buffer('regular_matrix', regular_matrix.float())
+
+ self.transform_matrix_conv = build_conv_layer(
+ dict(type='Conv2d'),
+ in_channels=in_channels,
+ out_channels=6 * groups,
+ kernel_size=3,
+ padding=1,
+ groups=groups,
+ bias=True)
+
+ if has_mmcv_full:
+ self.adapt_conv = DeformConv2d(
+ in_channels,
+ out_channels,
+ kernel_size=3,
+ padding=1,
+ bias=False,
+ groups=groups,
+ deform_groups=groups)
+ else:
+ raise ImportError('Please install the full version of mmcv '
+ 'to use `DeformConv2d`.')
+
+ self.norm = build_norm_layer(norm_cfg, out_channels)[1]
+ self.act = build_activation_layer(act_cfg)
+
+ def forward(self, x):
+ B, _, H, W = x.size()
+ residual = x
+
+ affine_matrix = self.transform_matrix_conv(x)
+ affine_matrix = affine_matrix.permute(0, 2, 3, 1).contiguous()
+ affine_matrix = affine_matrix.view(B, H, W, self.groups, 2, 3)
+ offset = torch.matmul(affine_matrix, self.regular_matrix)
+ offset = offset.transpose(4, 5).reshape(B, H, W, self.groups * 18)
+ offset = offset.permute(0, 3, 1, 2).contiguous()
+
+ x = self.adapt_conv(x, offset)
+ x = self.norm(x)
+ x = self.act(x + residual)
+
+ return x
+
+
+class RescoreNet(BaseModule):
+ """Rescore net used to predict the OKS score of predicted pose. We use the
+ off-the-shelf rescore net pretrained by authors of DEKR.
+
+ Args:
+ in_channels (int): Input channels
+ norm_indexes (Tuple(int)): Indices of torso in skeleton
+ init_cfg (dict, optional): Initialization config dict
+ """
+
+ def __init__(
+ self,
+ in_channels,
+ norm_indexes,
+ init_cfg=None,
+ ):
+ super(RescoreNet, self).__init__(init_cfg=init_cfg)
+
+ self.norm_indexes = norm_indexes
+
+ hidden = 256
+
+ self.l1 = torch.nn.Linear(in_channels, hidden, bias=True)
+ self.l2 = torch.nn.Linear(hidden, hidden, bias=True)
+ self.l3 = torch.nn.Linear(hidden, 1, bias=True)
+ self.relu = torch.nn.ReLU()
+
+ def make_feature(self, keypoints, keypoint_scores, skeleton):
+ """Combine original scores, joint distance and relative distance to
+ make feature.
+
+ Args:
+ keypoints (torch.Tensor): predicetd keypoints
+ keypoint_scores (torch.Tensor): predicetd keypoint scores
+ skeleton (list(list(int))): joint links
+
+ Returns:
+ torch.Tensor: feature for each instance
+ """
+ joint_1, joint_2 = zip(*skeleton)
+ num_link = len(skeleton)
+
+ joint_relate = (keypoints[:, joint_1] -
+ keypoints[:, joint_2])[:, :, :2]
+ joint_length = joint_relate.norm(dim=2)
+
+ # To use the torso distance to normalize
+ normalize = (joint_length[:, self.norm_indexes[0]] +
+ joint_length[:, self.norm_indexes[1]]) / 2
+ normalize = normalize.unsqueeze(1).expand(normalize.size(0), num_link)
+ normalize = normalize.clamp(min=1).contiguous()
+
+ joint_length = joint_length / normalize[:, :]
+ joint_relate = joint_relate / normalize.unsqueeze(-1)
+ joint_relate = joint_relate.flatten(1)
+
+ feature = torch.cat((joint_relate, joint_length, keypoint_scores),
+ dim=1).float()
+ return feature
+
+ def forward(self, keypoints, keypoint_scores, skeleton):
+ feature = self.make_feature(keypoints, keypoint_scores, skeleton)
+ x = self.relu(self.l1(feature))
+ x = self.relu(self.l2(x))
+ x = self.l3(x)
+ return x.squeeze(1)
+
+
+@MODELS.register_module()
+class DEKRHead(BaseHead):
+ """DisEntangled Keypoint Regression head introduced in `Bottom-up human
+ pose estimation via disentangled keypoint regression`_ by Geng et al
+ (2021). The head is composed of a heatmap branch and a displacement branch.
+
+ Args:
+ in_channels (int | Sequence[int]): Number of channels in the input
+ feature map
+ num_joints (int): Number of joints
+ num_heatmap_filters (int): Number of filters for heatmap branch.
+ Defaults to 32
+ num_offset_filters_per_joint (int): Number of filters for each joint
+ in displacement branch. Defaults to 15
+ heatmap_loss (Config): Config of the heatmap loss. Defaults to use
+ :class:`KeypointMSELoss`
+ displacement_loss (Config): Config of the displacement regression loss.
+ Defaults to use :class:`SoftWeightSmoothL1Loss`
+ decoder (Config, optional): The decoder config that controls decoding
+ keypoint coordinates from the network output. Defaults to ``None``
+ rescore_cfg (Config, optional): The config for rescore net which
+ estimates OKS via predicted keypoints and keypoint scores.
+ Defaults to ``None``
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+
+ .. _`Bottom-up human pose estimation via disentangled keypoint regression`:
+ https://arxiv.org/abs/2104.02300
+ """
+
+ _version = 2
+
+ def __init__(self,
+ in_channels: Union[int, Sequence[int]],
+ num_keypoints: int,
+ num_heatmap_filters: int = 32,
+ num_displacement_filters_per_keypoint: int = 15,
+ heatmap_loss: ConfigType = dict(
+ type='KeypointMSELoss', use_target_weight=True),
+ displacement_loss: ConfigType = dict(
+ type='SoftWeightSmoothL1Loss',
+ use_target_weight=True,
+ supervise_empty=False),
+ decoder: OptConfigType = None,
+ rescore_cfg: OptConfigType = None,
+ init_cfg: OptConfigType = None):
+
+ if init_cfg is None:
+ init_cfg = self.default_init_cfg
+
+ super().__init__(init_cfg)
+
+ self.in_channels = in_channels
+ self.num_keypoints = num_keypoints
+
+ # build heatmap branch
+ self.heatmap_conv_layers = self._make_heatmap_conv_layers(
+ in_channels=in_channels,
+ out_channels=1 + num_keypoints,
+ num_filters=num_heatmap_filters,
+ )
+
+ # build displacement branch
+ self.displacement_conv_layers = self._make_displacement_conv_layers(
+ in_channels=in_channels,
+ out_channels=2 * num_keypoints,
+ num_filters=num_keypoints * num_displacement_filters_per_keypoint,
+ groups=num_keypoints)
+
+ # build losses
+ self.loss_module = ModuleDict(
+ dict(
+ heatmap=MODELS.build(heatmap_loss),
+ displacement=MODELS.build(displacement_loss),
+ ))
+
+ # build decoder
+ if decoder is not None:
+ self.decoder = KEYPOINT_CODECS.build(decoder)
+ else:
+ self.decoder = None
+
+ # build rescore net
+ if rescore_cfg is not None:
+ self.rescore_net = RescoreNet(**rescore_cfg)
+ else:
+ self.rescore_net = None
+
+ # Register the hook to automatically convert old version state dicts
+ self._register_load_state_dict_pre_hook(self._load_state_dict_pre_hook)
+
+ @property
+ def default_init_cfg(self):
+ init_cfg = [
+ dict(
+ type='Normal', layer=['Conv2d', 'ConvTranspose2d'], std=0.001),
+ dict(type='Constant', layer='BatchNorm2d', val=1)
+ ]
+ return init_cfg
+
+ def _make_heatmap_conv_layers(self, in_channels: int, out_channels: int,
+ num_filters: int):
+ """Create convolutional layers of heatmap branch by given
+ parameters."""
+ layers = [
+ ConvModule(
+ in_channels=in_channels,
+ out_channels=num_filters,
+ kernel_size=1,
+ norm_cfg=dict(type='BN')),
+ BasicBlock(num_filters, num_filters),
+ build_conv_layer(
+ dict(type='Conv2d'),
+ in_channels=num_filters,
+ out_channels=out_channels,
+ kernel_size=1),
+ ]
+
+ return Sequential(*layers)
+
+ def _make_displacement_conv_layers(self, in_channels: int,
+ out_channels: int, num_filters: int,
+ groups: int):
+ """Create convolutional layers of displacement branch by given
+ parameters."""
+ layers = [
+ ConvModule(
+ in_channels=in_channels,
+ out_channels=num_filters,
+ kernel_size=1,
+ norm_cfg=dict(type='BN')),
+ AdaptiveActivationBlock(num_filters, num_filters, groups=groups),
+ AdaptiveActivationBlock(num_filters, num_filters, groups=groups),
+ build_conv_layer(
+ dict(type='Conv2d'),
+ in_channels=num_filters,
+ out_channels=out_channels,
+ kernel_size=1,
+ groups=groups)
+ ]
+
+ return Sequential(*layers)
+
+ def forward(self, feats: Tuple[Tensor]) -> Tensor:
+ """Forward the network. The input is multi scale feature maps and the
+ output is a tuple of heatmap and displacement.
+
+ Args:
+ feats (Tuple[Tensor]): Multi scale feature maps.
+
+ Returns:
+ Tuple[Tensor]: output heatmap and displacement.
+ """
+ x = feats[-1]
+
+ heatmaps = self.heatmap_conv_layers(x)
+ displacements = self.displacement_conv_layers(x)
+
+ return heatmaps, displacements
+
+ def loss(self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ train_cfg: ConfigType = {}) -> dict:
+ """Calculate losses from a batch of inputs and data samples.
+
+ Args:
+ feats (Tuple[Tensor]): The multi-stage features
+ batch_data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+ train_cfg (dict): The runtime config for training process.
+ Defaults to {}
+
+ Returns:
+ dict: A dictionary of losses.
+ """
+ pred_heatmaps, pred_displacements = self.forward(feats)
+ gt_heatmaps = torch.stack(
+ [d.gt_fields.heatmaps for d in batch_data_samples])
+ heatmap_weights = torch.stack(
+ [d.gt_fields.heatmap_weights for d in batch_data_samples])
+ gt_displacements = torch.stack(
+ [d.gt_fields.displacements for d in batch_data_samples])
+ displacement_weights = torch.stack(
+ [d.gt_fields.displacement_weights for d in batch_data_samples])
+
+ if 'heatmap_mask' in batch_data_samples[0].gt_fields.keys():
+ heatmap_mask = torch.stack(
+ [d.gt_fields.heatmap_mask for d in batch_data_samples])
+ else:
+ heatmap_mask = None
+
+ # calculate losses
+ losses = dict()
+ heatmap_loss = self.loss_module['heatmap'](pred_heatmaps, gt_heatmaps,
+ heatmap_weights,
+ heatmap_mask)
+ displacement_loss = self.loss_module['displacement'](
+ pred_displacements, gt_displacements, displacement_weights)
+
+ losses.update({
+ 'loss/heatmap': heatmap_loss,
+ 'loss/displacement': displacement_loss,
+ })
+
+ return losses
+
+ def predict(self,
+ feats: Features,
+ batch_data_samples: OptSampleList,
+ test_cfg: ConfigType = {}) -> Predictions:
+ """Predict results from features.
+
+ Args:
+ feats (Tuple[Tensor] | List[Tuple[Tensor]]): The multi-stage
+ features (or multiple multi-scale features in TTA)
+ batch_data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+ test_cfg (dict): The runtime config for testing process. Defaults
+ to {}
+
+ Returns:
+ Union[InstanceList | Tuple[InstanceList | PixelDataList]]: If
+ ``test_cfg['output_heatmap']==True``, return both pose and heatmap
+ prediction; otherwise only return the pose prediction.
+
+ The pose prediction is a list of ``InstanceData``, each contains
+ the following fields:
+
+ - keypoints (np.ndarray): predicted keypoint coordinates in
+ shape (num_instances, K, D) where K is the keypoint number
+ and D is the keypoint dimension
+ - keypoint_scores (np.ndarray): predicted keypoint scores in
+ shape (num_instances, K)
+
+ The heatmap prediction is a list of ``PixelData``, each contains
+ the following fields:
+
+ - heatmaps (Tensor): The predicted heatmaps in shape (1, h, w)
+ or (K+1, h, w) if keypoint heatmaps are predicted
+ - displacements (Tensor): The predicted displacement fields
+ in shape (K*2, h, w)
+ """
+
+ assert len(batch_data_samples) == 1, f'DEKRHead only supports ' \
+ f'prediction with batch_size 1, but got {len(batch_data_samples)}'
+
+ multiscale_test = test_cfg.get('multiscale_test', False)
+ flip_test = test_cfg.get('flip_test', False)
+ metainfo = batch_data_samples[0].metainfo
+ aug_scales = [1]
+
+ if not multiscale_test:
+ feats = [feats]
+ else:
+ aug_scales = aug_scales + metainfo['aug_scales']
+
+ heatmaps, displacements = [], []
+ for feat, s in zip(feats, aug_scales):
+ if flip_test:
+ assert isinstance(feat, list) and len(feat) == 2
+ flip_indices = metainfo['flip_indices']
+ _feat, _feat_flip = feat
+ _heatmaps, _displacements = self.forward(_feat)
+ _heatmaps_flip, _displacements_flip = self.forward(_feat_flip)
+
+ _heatmaps_flip = flip_heatmaps(
+ _heatmaps_flip,
+ flip_mode='heatmap',
+ flip_indices=flip_indices + [len(flip_indices)],
+ shift_heatmap=test_cfg.get('shift_heatmap', False))
+ _heatmaps = (_heatmaps + _heatmaps_flip) / 2.0
+
+ _displacements_flip = flip_heatmaps(
+ _displacements_flip,
+ flip_mode='offset',
+ flip_indices=flip_indices,
+ shift_heatmap=False)
+
+ # this is a coordinate amendment.
+ x_scale_factor = s * (
+ metainfo['input_size'][0] / _heatmaps.shape[-1])
+ _displacements_flip[:, ::2] += (x_scale_factor - 1) / (
+ x_scale_factor)
+ _displacements = (_displacements + _displacements_flip) / 2.0
+
+ else:
+ _heatmaps, _displacements = self.forward(feat)
+
+ heatmaps.append(_heatmaps)
+ displacements.append(_displacements)
+
+ preds = self.decode(heatmaps, displacements, test_cfg, metainfo)
+
+ if test_cfg.get('output_heatmaps', False):
+ heatmaps = [hm.detach() for hm in heatmaps]
+ displacements = [dm.detach() for dm in displacements]
+ B = heatmaps[0].shape[0]
+ pred_fields = []
+ for i in range(B):
+ pred_fields.append(
+ PixelData(
+ heatmaps=heatmaps[0][i],
+ displacements=displacements[0][i]))
+ return preds, pred_fields
+ else:
+ return preds
+
+ def decode(self,
+ heatmaps: Tuple[Tensor],
+ displacements: Tuple[Tensor],
+ test_cfg: ConfigType = {},
+ metainfo: dict = {}) -> InstanceList:
+ """Decode keypoints from outputs.
+
+ Args:
+ heatmaps (Tuple[Tensor]): The output heatmaps inferred from one
+ image or multi-scale images.
+ displacements (Tuple[Tensor]): The output displacement fields
+ inferred from one image or multi-scale images.
+ test_cfg (dict): The runtime config for testing process. Defaults
+ to {}
+ metainfo (dict): The metainfo of test dataset. Defaults to {}
+
+ Returns:
+ List[InstanceData]: A list of InstanceData, each contains the
+ decoded pose information of the instances of one data sample.
+ """
+
+ if self.decoder is None:
+ raise RuntimeError(
+ f'The decoder has not been set in {self.__class__.__name__}. '
+ 'Please set the decoder configs in the init parameters to '
+ 'enable head methods `head.predict()` and `head.decode()`')
+
+ multiscale_test = test_cfg.get('multiscale_test', False)
+ skeleton = metainfo.get('skeleton_links', None)
+
+ preds = []
+ batch_size = heatmaps[0].shape[0]
+
+ for b in range(batch_size):
+ if multiscale_test:
+ raise NotImplementedError
+ else:
+ keypoints, (root_scores,
+ keypoint_scores) = self.decoder.decode(
+ heatmaps[0][b], displacements[0][b])
+
+ # rescore each instance
+ if self.rescore_net is not None and skeleton and len(
+ keypoints) > 0:
+ instance_scores = self.rescore_net(keypoints, keypoint_scores,
+ skeleton)
+ instance_scores[torch.isnan(instance_scores)] = 0
+ root_scores = root_scores * instance_scores
+
+ # nms
+ keypoints, keypoint_scores = to_numpy((keypoints, keypoint_scores))
+ scores = to_numpy(root_scores)[..., None] * keypoint_scores
+ if len(keypoints) > 0 and test_cfg.get('nms_dist_thr', 0) > 0:
+ kpts_db = []
+ for i in range(len(keypoints)):
+ kpts_db.append(
+ dict(keypoints=keypoints[i], score=keypoint_scores[i]))
+ keep_instance_inds = nearby_joints_nms(
+ kpts_db,
+ test_cfg['nms_dist_thr'],
+ test_cfg.get('nms_joints_thr', None),
+ score_per_joint=True,
+ max_dets=test_cfg.get('max_num_people', 30))
+ keypoints = keypoints[keep_instance_inds]
+ scores = scores[keep_instance_inds]
+
+ # pack outputs
+ preds.append(
+ InstanceData(keypoints=keypoints, keypoint_scores=scores))
+
+ return preds
+
+ def _load_state_dict_pre_hook(self, state_dict, prefix, local_meta, *args,
+ **kwargs):
+ """A hook function to convert old-version state dict of
+ :class:`DEKRHead` (before MMPose v1.0.0) to a compatible format
+ of :class:`DEKRHead`.
+
+ The hook will be automatically registered during initialization.
+ """
+ version = local_meta.get('version', None)
+ if version and version >= self._version:
+ return
+
+ # convert old-version state dict
+ keys = list(state_dict.keys())
+ for k in keys:
+ if 'offset_conv_layer' in k:
+ v = state_dict.pop(k)
+ k = k.replace('offset_conv_layers', 'displacement_conv_layers')
+ if 'displacement_conv_layers.3.' in k:
+ # the source and target of displacement vectors are
+ # opposite between two versions.
+ v = -v
+ state_dict[k] = v
+
+ if 'heatmap_conv_layers.2' in k:
+ # root heatmap is at the first/last channel of the
+ # heatmap tensor in MMPose v0.x/1.x, respectively.
+ v = state_dict.pop(k)
+ state_dict[k] = torch.cat((v[1:], v[:1]))
+
+ if 'rescore_net' in k:
+ v = state_dict.pop(k)
+ k = k.replace('rescore_net', 'head.rescore_net')
+ state_dict[k] = v
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/vis_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/vis_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..a6aa8fbf3e152370ea5d222fb231ebcfc8511858
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/hybrid_heads/vis_head.py
@@ -0,0 +1,234 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Tuple, Union
+
+import torch
+from torch import Tensor, nn
+
+from mmpose.models.utils.tta import flip_visibility
+from mmpose.registry import MODELS
+from mmpose.utils.tensor_utils import to_numpy
+from mmpose.utils.typing import (ConfigType, InstanceList, OptConfigType,
+ OptSampleList, Predictions)
+from ..base_head import BaseHead
+
+
+@MODELS.register_module()
+class VisPredictHead(BaseHead):
+ """VisPredictHead must be used together with other heads. It can predict
+ keypoints coordinates of and their visibility simultaneously. In the
+ current version, it only supports top-down approaches.
+
+ Args:
+ pose_cfg (Config): Config to construct keypoints prediction head
+ loss (Config): Config for visibility loss. Defaults to use
+ :class:`BCELoss`
+ use_sigmoid (bool): Whether to use sigmoid activation function
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+ """
+
+ def __init__(self,
+ pose_cfg: ConfigType,
+ loss: ConfigType = dict(
+ type='BCELoss', use_target_weight=False,
+ with_logits=True),
+ use_sigmoid: bool = False,
+ init_cfg: OptConfigType = None):
+
+ if init_cfg is None:
+ init_cfg = self.default_init_cfg
+
+ super().__init__(init_cfg)
+
+ self.in_channels = pose_cfg['in_channels']
+ if pose_cfg.get('num_joints', None) is not None:
+ self.out_channels = pose_cfg['num_joints']
+ elif pose_cfg.get('out_channels', None) is not None:
+ self.out_channels = pose_cfg['out_channels']
+ else:
+ raise ValueError('VisPredictHead requires \'num_joints\' or'
+ ' \'out_channels\' in the pose_cfg.')
+
+ self.loss_module = MODELS.build(loss)
+
+ self.pose_head = MODELS.build(pose_cfg)
+ self.pose_cfg = pose_cfg
+
+ self.use_sigmoid = use_sigmoid
+
+ modules = [
+ nn.AdaptiveAvgPool2d(1),
+ nn.Flatten(),
+ nn.Linear(self.in_channels, self.out_channels)
+ ]
+ if use_sigmoid:
+ modules.append(nn.Sigmoid())
+
+ self.vis_head = nn.Sequential(*modules)
+
+ def vis_forward(self, feats: Tuple[Tensor]):
+ """Forward the vis_head. The input is multi scale feature maps and the
+ output is coordinates visibility.
+
+ Args:
+ feats (Tuple[Tensor]): Multi scale feature maps.
+
+ Returns:
+ Tensor: output coordinates visibility.
+ """
+ x = feats[-1]
+ while len(x.shape) < 4:
+ x.unsqueeze_(-1)
+ x = self.vis_head(x)
+ return x.reshape(-1, self.out_channels)
+
+ def forward(self, feats: Tuple[Tensor]):
+ """Forward the network. The input is multi scale feature maps and the
+ output is coordinates and coordinates visibility.
+
+ Args:
+ feats (Tuple[Tensor]): Multi scale feature maps.
+
+ Returns:
+ Tuple[Tensor]: output coordinates and coordinates visibility.
+ """
+ x_pose = self.pose_head.forward(feats)
+ x_vis = self.vis_forward(feats)
+
+ return x_pose, x_vis
+
+ def integrate(self, batch_vis: Tensor,
+ pose_preds: Union[Tuple, Predictions]) -> InstanceList:
+ """Add keypoints visibility prediction to pose prediction.
+
+ Overwrite the original keypoint_scores.
+ """
+ if isinstance(pose_preds, tuple):
+ pose_pred_instances, pose_pred_fields = pose_preds
+ else:
+ pose_pred_instances = pose_preds
+ pose_pred_fields = None
+
+ batch_vis_np = to_numpy(batch_vis, unzip=True)
+
+ assert len(pose_pred_instances) == len(batch_vis_np)
+ for index, _ in enumerate(pose_pred_instances):
+ pose_pred_instances[index].keypoint_scores = batch_vis_np[index]
+
+ return pose_pred_instances, pose_pred_fields
+
+ def predict(self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ test_cfg: ConfigType = {}) -> Predictions:
+ """Predict results from features.
+
+ Args:
+ feats (Tuple[Tensor] | List[Tuple[Tensor]]): The multi-stage
+ features (or multiple multi-stage features in TTA)
+ batch_data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+ test_cfg (dict): The runtime config for testing process. Defaults
+ to {}
+
+ Returns:
+ Union[InstanceList | Tuple[InstanceList | PixelDataList]]: If
+ posehead's ``test_cfg['output_heatmap']==True``, return both
+ pose and heatmap prediction; otherwise only return the pose
+ prediction.
+
+ The pose prediction is a list of ``InstanceData``, each contains
+ the following fields:
+
+ - keypoints (np.ndarray): predicted keypoint coordinates in
+ shape (num_instances, K, D) where K is the keypoint number
+ and D is the keypoint dimension
+ - keypoint_scores (np.ndarray): predicted keypoint scores in
+ shape (num_instances, K)
+ - keypoint_visibility (np.ndarray): predicted keypoints
+ visibility in shape (num_instances, K)
+
+ The heatmap prediction is a list of ``PixelData``, each contains
+ the following fields:
+
+ - heatmaps (Tensor): The predicted heatmaps in shape (K, h, w)
+ """
+ if test_cfg.get('flip_test', False):
+ # TTA: flip test -> feats = [orig, flipped]
+ assert isinstance(feats, list) and len(feats) == 2
+ flip_indices = batch_data_samples[0].metainfo['flip_indices']
+ _feats, _feats_flip = feats
+
+ _batch_vis = self.vis_forward(_feats)
+ _batch_vis_flip = flip_visibility(
+ self.vis_forward(_feats_flip), flip_indices=flip_indices)
+ batch_vis = (_batch_vis + _batch_vis_flip) * 0.5
+ else:
+ batch_vis = self.vis_forward(feats) # (B, K, D)
+
+ batch_vis.unsqueeze_(dim=1) # (B, N, K, D)
+
+ if not self.use_sigmoid:
+ batch_vis = torch.sigmoid(batch_vis)
+
+ batch_pose = self.pose_head.predict(feats, batch_data_samples,
+ test_cfg)
+
+ return self.integrate(batch_vis, batch_pose)
+
+ def vis_accuracy(self, vis_pred_outputs, vis_labels):
+ """Calculate visibility prediction accuracy."""
+ probabilities = torch.sigmoid(torch.flatten(vis_pred_outputs))
+ threshold = 0.5
+ predictions = (probabilities >= threshold).int()
+ labels = torch.flatten(vis_labels)
+ correct = torch.sum(predictions == labels).item()
+ accuracy = correct / len(labels)
+ return torch.tensor(accuracy)
+
+ def loss(self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ train_cfg: OptConfigType = {}) -> dict:
+ """Calculate losses from a batch of inputs and data samples.
+
+ Args:
+ feats (Tuple[Tensor]): The multi-stage features
+ batch_data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+ train_cfg (dict): The runtime config for training process.
+ Defaults to {}
+
+ Returns:
+ dict: A dictionary of losses.
+ """
+ vis_pred_outputs = self.vis_forward(feats)
+ vis_labels = torch.cat([
+ d.gt_instance_labels.keypoint_weights for d in batch_data_samples
+ ])
+
+ # calculate vis losses
+ losses = dict()
+ loss_vis = self.loss_module(vis_pred_outputs, vis_labels)
+
+ losses.update(loss_vis=loss_vis)
+
+ # calculate vis accuracy
+ acc_vis = self.vis_accuracy(vis_pred_outputs, vis_labels)
+ losses.update(acc_vis=acc_vis)
+
+ # calculate keypoints losses
+ loss_kpt = self.pose_head.loss(feats, batch_data_samples)
+ losses.update(loss_kpt)
+
+ return losses
+
+ @property
+ def default_init_cfg(self):
+ init_cfg = [dict(type='Normal', layer=['Linear'], std=0.01, bias=0)]
+ return init_cfg
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..5174ca97e4369799174fc5af8fd3f2fbe7b1fdb7
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__init__.py
@@ -0,0 +1,21 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .dsnt_head import DSNTHead
+from .integral_regression_head import IntegralRegressionHead
+from .regression_head import RegressionHead
+from .rle_head import RLEHead
+from .temporal_regression_head import TemporalRegressionHead
+from .trajectory_regression_head import TrajectoryRegressionHead
+
+__all__ = [
+ 'RegressionHead',
+ 'IntegralRegressionHead',
+ 'DSNTHead',
+ 'RLEHead',
+ 'TemporalRegressionHead',
+ 'TrajectoryRegressionHead',
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..be92ed30019151b5eb751f41d6dc40266ada835b
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/dsnt_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/dsnt_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f531965c5f711b421a5c438c01d792dc5610ef52
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/dsnt_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/integral_regression_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/integral_regression_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f01e2c1b4f7ac1f53f3c3a00d18d813c01a79f8b
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/integral_regression_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/regression_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/regression_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..99dd271eb179192357d2c55cbbfc0babf982bb93
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/regression_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/rle_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/rle_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2ad0c5175be9fd9ea707640033afb3fe46c8e3c4
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/rle_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/temporal_regression_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/temporal_regression_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b819bf8c83f5e30a2e5ad99de8a11608b5554654
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/temporal_regression_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/trajectory_regression_head.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/trajectory_regression_head.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1a83dbac48b3ba93f1625aaca1978d074edd5d40
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/__pycache__/trajectory_regression_head.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/dsnt_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/dsnt_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..9703572f6a11bd2c36f786213e496081e91b1624
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/dsnt_head.py
@@ -0,0 +1,151 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional, Sequence, Tuple, Union
+
+import numpy as np
+import torch
+from mmengine.logging import MessageHub
+from torch import Tensor
+
+from mmpose.evaluation.functional import keypoint_pck_accuracy
+from mmpose.registry import MODELS
+from mmpose.utils.tensor_utils import to_numpy
+from mmpose.utils.typing import ConfigType, OptConfigType, OptSampleList
+from .integral_regression_head import IntegralRegressionHead
+
+OptIntSeq = Optional[Sequence[int]]
+
+
+@MODELS.register_module()
+class DSNTHead(IntegralRegressionHead):
+ """Top-down integral regression head introduced in `DSNT`_ by Nibali et
+ al(2018). The head contains a differentiable spatial to numerical transform
+ (DSNT) layer that do soft-argmax operation on the predicted heatmaps to
+ regress the coordinates.
+
+ This head is used for algorithms that require supervision of heatmaps
+ in `DSNT` approach.
+
+ Args:
+ in_channels (int | sequence[int]): Number of input channels
+ in_featuremap_size (int | sequence[int]): Size of input feature map
+ num_joints (int): Number of joints
+ lambda_t (int): Discard heatmap-based loss when current
+ epoch > lambda_t. Defaults to -1.
+ debias (bool): Whether to remove the bias of Integral Pose Regression.
+ see `Removing the Bias of Integral Pose Regression`_ by Gu et al
+ (2021). Defaults to ``False``.
+ beta (float): A smoothing parameter in softmax. Defaults to ``1.0``.
+ deconv_out_channels (sequence[int]): The output channel number of each
+ deconv layer. Defaults to ``(256, 256, 256)``
+ deconv_kernel_sizes (sequence[int | tuple], optional): The kernel size
+ of each deconv layer. Each element should be either an integer for
+ both height and width dimensions, or a tuple of two integers for
+ the height and the width dimension respectively.Defaults to
+ ``(4, 4, 4)``
+ conv_out_channels (sequence[int], optional): The output channel number
+ of each intermediate conv layer. ``None`` means no intermediate
+ conv layer between deconv layers and the final conv layer.
+ Defaults to ``None``
+ conv_kernel_sizes (sequence[int | tuple], optional): The kernel size
+ of each intermediate conv layer. Defaults to ``None``
+ final_layer (dict): Arguments of the final Conv2d layer.
+ Defaults to ``dict(kernel_size=1)``
+ loss (Config): Config for keypoint loss. Defaults to use
+ :class:`DSNTLoss`
+ decoder (Config, optional): The decoder config that controls decoding
+ keypoint coordinates from the network output. Defaults to ``None``
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+
+ .. _`DSNT`: https://arxiv.org/abs/1801.07372
+ """
+
+ _version = 2
+
+ def __init__(self,
+ in_channels: Union[int, Sequence[int]],
+ in_featuremap_size: Tuple[int, int],
+ num_joints: int,
+ lambda_t: int = -1,
+ debias: bool = False,
+ beta: float = 1.0,
+ deconv_out_channels: OptIntSeq = (256, 256, 256),
+ deconv_kernel_sizes: OptIntSeq = (4, 4, 4),
+ conv_out_channels: OptIntSeq = None,
+ conv_kernel_sizes: OptIntSeq = None,
+ final_layer: dict = dict(kernel_size=1),
+ loss: ConfigType = dict(
+ type='MultipleLossWrapper',
+ losses=[
+ dict(type='SmoothL1Loss', use_target_weight=True),
+ dict(type='JSDiscretLoss', use_target_weight=True)
+ ]),
+ decoder: OptConfigType = None,
+ init_cfg: OptConfigType = None):
+
+ super().__init__(
+ in_channels=in_channels,
+ in_featuremap_size=in_featuremap_size,
+ num_joints=num_joints,
+ debias=debias,
+ beta=beta,
+ deconv_out_channels=deconv_out_channels,
+ deconv_kernel_sizes=deconv_kernel_sizes,
+ conv_out_channels=conv_out_channels,
+ conv_kernel_sizes=conv_kernel_sizes,
+ final_layer=final_layer,
+ loss=loss,
+ decoder=decoder,
+ init_cfg=init_cfg)
+
+ self.lambda_t = lambda_t
+
+ def loss(self,
+ inputs: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ train_cfg: ConfigType = {}) -> dict:
+ """Calculate losses from a batch of inputs and data samples."""
+
+ pred_coords, pred_heatmaps = self.forward(inputs)
+ keypoint_labels = torch.cat(
+ [d.gt_instance_labels.keypoint_labels for d in batch_data_samples])
+ keypoint_weights = torch.cat([
+ d.gt_instance_labels.keypoint_weights for d in batch_data_samples
+ ])
+ gt_heatmaps = torch.stack(
+ [d.gt_fields.heatmaps for d in batch_data_samples])
+
+ input_list = [pred_coords, pred_heatmaps]
+ target_list = [keypoint_labels, gt_heatmaps]
+ # calculate losses
+ losses = dict()
+
+ loss_list = self.loss_module(input_list, target_list, keypoint_weights)
+
+ loss = loss_list[0] + loss_list[1]
+
+ if self.lambda_t > 0:
+ mh = MessageHub.get_current_instance()
+ cur_epoch = mh.get_info('epoch')
+ if cur_epoch >= self.lambda_t:
+ loss = loss_list[0]
+
+ losses.update(loss_kpt=loss)
+
+ # calculate accuracy
+ _, avg_acc, _ = keypoint_pck_accuracy(
+ pred=to_numpy(pred_coords),
+ gt=to_numpy(keypoint_labels),
+ mask=to_numpy(keypoint_weights) > 0,
+ thr=0.05,
+ norm_factor=np.ones((pred_coords.size(0), 2), dtype=np.float32))
+
+ acc_pose = torch.tensor(avg_acc, device=keypoint_labels.device)
+ losses.update(acc_pose=acc_pose)
+
+ return losses
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/integral_regression_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/integral_regression_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..e840e96f9340122239e998a8c36bef38c7f99c69
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/integral_regression_head.py
@@ -0,0 +1,344 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+
+from typing import Optional, Sequence, Tuple, Union
+
+import numpy as np
+import torch
+import torch.nn.functional as F
+from mmcv.cnn import build_conv_layer
+from mmengine.structures import PixelData
+from torch import Tensor, nn
+
+from mmpose.evaluation.functional import keypoint_pck_accuracy
+from mmpose.models.utils.tta import flip_coordinates, flip_heatmaps
+from mmpose.registry import KEYPOINT_CODECS, MODELS
+from mmpose.utils.tensor_utils import to_numpy
+from mmpose.utils.typing import (ConfigType, OptConfigType, OptSampleList,
+ Predictions)
+from .. import HeatmapHead
+from ..base_head import BaseHead
+
+OptIntSeq = Optional[Sequence[int]]
+
+
+@MODELS.register_module()
+class IntegralRegressionHead(BaseHead):
+ """Top-down integral regression head introduced in `IPR`_ by Xiao et
+ al(2018). The head contains a differentiable spatial to numerical transform
+ (DSNT) layer that do soft-argmax operation on the predicted heatmaps to
+ regress the coordinates.
+
+ This head is used for algorithms that only supervise the coordinates.
+
+ Args:
+ in_channels (int | sequence[int]): Number of input channels
+ in_featuremap_size (int | sequence[int]): Size of input feature map
+ num_joints (int): Number of joints
+ debias (bool): Whether to remove the bias of Integral Pose Regression.
+ see `Removing the Bias of Integral Pose Regression`_ by Gu et al
+ (2021). Defaults to ``False``.
+ beta (float): A smoothing parameter in softmax. Defaults to ``1.0``.
+ deconv_out_channels (sequence[int]): The output channel number of each
+ deconv layer. Defaults to ``(256, 256, 256)``
+ deconv_kernel_sizes (sequence[int | tuple], optional): The kernel size
+ of each deconv layer. Each element should be either an integer for
+ both height and width dimensions, or a tuple of two integers for
+ the height and the width dimension respectively.Defaults to
+ ``(4, 4, 4)``
+ conv_out_channels (sequence[int], optional): The output channel number
+ of each intermediate conv layer. ``None`` means no intermediate
+ conv layer between deconv layers and the final conv layer.
+ Defaults to ``None``
+ conv_kernel_sizes (sequence[int | tuple], optional): The kernel size
+ of each intermediate conv layer. Defaults to ``None``
+ final_layer (dict): Arguments of the final Conv2d layer.
+ Defaults to ``dict(kernel_size=1)``
+ loss (Config): Config for keypoint loss. Defaults to use
+ :class:`SmoothL1Loss`
+ decoder (Config, optional): The decoder config that controls decoding
+ keypoint coordinates from the network output. Defaults to ``None``
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+
+ .. _`IPR`: https://arxiv.org/abs/1711.08229
+ .. _`Debias`:
+ """
+
+ _version = 2
+
+ def __init__(self,
+ in_channels: Union[int, Sequence[int]],
+ in_featuremap_size: Tuple[int, int],
+ num_joints: int,
+ debias: bool = False,
+ beta: float = 1.0,
+ deconv_out_channels: OptIntSeq = (256, 256, 256),
+ deconv_kernel_sizes: OptIntSeq = (4, 4, 4),
+ conv_out_channels: OptIntSeq = None,
+ conv_kernel_sizes: OptIntSeq = None,
+ final_layer: dict = dict(kernel_size=1),
+ loss: ConfigType = dict(
+ type='SmoothL1Loss', use_target_weight=True),
+ decoder: OptConfigType = None,
+ init_cfg: OptConfigType = None):
+
+ if init_cfg is None:
+ init_cfg = self.default_init_cfg
+
+ super().__init__(init_cfg)
+
+ self.in_channels = in_channels
+ self.num_joints = num_joints
+ self.debias = debias
+ self.beta = beta
+ self.loss_module = MODELS.build(loss)
+ if decoder is not None:
+ self.decoder = KEYPOINT_CODECS.build(decoder)
+ else:
+ self.decoder = None
+
+ num_deconv = len(deconv_out_channels) if deconv_out_channels else 0
+ if num_deconv != 0:
+
+ self.heatmap_size = tuple(
+ [s * (2**num_deconv) for s in in_featuremap_size])
+
+ # deconv layers + 1x1 conv
+ self.simplebaseline_head = HeatmapHead(
+ in_channels=in_channels,
+ out_channels=num_joints,
+ deconv_out_channels=deconv_out_channels,
+ deconv_kernel_sizes=deconv_kernel_sizes,
+ conv_out_channels=conv_out_channels,
+ conv_kernel_sizes=conv_kernel_sizes,
+ final_layer=final_layer)
+
+ if final_layer is not None:
+ in_channels = num_joints
+ else:
+ in_channels = deconv_out_channels[-1]
+
+ else:
+ self.simplebaseline_head = None
+
+ if final_layer is not None:
+ cfg = dict(
+ type='Conv2d',
+ in_channels=in_channels,
+ out_channels=num_joints,
+ kernel_size=1)
+ cfg.update(final_layer)
+ self.final_layer = build_conv_layer(cfg)
+ else:
+ self.final_layer = None
+
+ self.heatmap_size = in_featuremap_size
+
+ if isinstance(in_channels, list):
+ raise ValueError(
+ f'{self.__class__.__name__} does not support selecting '
+ 'multiple input features.')
+
+ W, H = self.heatmap_size
+ self.linspace_x = torch.arange(0.0, 1.0 * W, 1).reshape(1, 1, 1, W) / W
+ self.linspace_y = torch.arange(0.0, 1.0 * H, 1).reshape(1, 1, H, 1) / H
+
+ self.linspace_x = nn.Parameter(self.linspace_x, requires_grad=False)
+ self.linspace_y = nn.Parameter(self.linspace_y, requires_grad=False)
+
+ self._register_load_state_dict_pre_hook(self._load_state_dict_pre_hook)
+
+ def _linear_expectation(self, heatmaps: Tensor,
+ linspace: Tensor) -> Tensor:
+ """Calculate linear expectation."""
+
+ B, N, _, _ = heatmaps.shape
+ heatmaps = heatmaps.mul(linspace).reshape(B, N, -1)
+ expectation = torch.sum(heatmaps, dim=2, keepdim=True)
+
+ return expectation
+
+ def _flat_softmax(self, featmaps: Tensor) -> Tensor:
+ """Use Softmax to normalize the featmaps in depthwise."""
+
+ _, N, H, W = featmaps.shape
+
+ featmaps = featmaps.reshape(-1, N, H * W)
+ heatmaps = F.softmax(featmaps, dim=2)
+
+ return heatmaps.reshape(-1, N, H, W)
+
+ def forward(self, feats: Tuple[Tensor]) -> Union[Tensor, Tuple[Tensor]]:
+ """Forward the network. The input is multi scale feature maps and the
+ output is the coordinates.
+
+ Args:
+ feats (Tuple[Tensor]): Multi scale feature maps.
+
+ Returns:
+ Tensor: output coordinates(and sigmas[optional]).
+ """
+ if self.simplebaseline_head is None:
+ feats = feats[-1]
+ if self.final_layer is not None:
+ feats = self.final_layer(feats)
+ else:
+ feats = self.simplebaseline_head(feats)
+
+ heatmaps = self._flat_softmax(feats * self.beta)
+
+ pred_x = self._linear_expectation(heatmaps, self.linspace_x)
+ pred_y = self._linear_expectation(heatmaps, self.linspace_y)
+
+ if self.debias:
+ B, N, H, W = feats.shape
+ C = feats.reshape(B, N, H * W).exp().sum(dim=2).reshape(B, N, 1)
+ pred_x = C / (C - 1) * (pred_x - 1 / (2 * C))
+ pred_y = C / (C - 1) * (pred_y - 1 / (2 * C))
+
+ coords = torch.cat([pred_x, pred_y], dim=-1)
+ return coords, heatmaps
+
+ def predict(self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ test_cfg: ConfigType = {}) -> Predictions:
+ """Predict results from features.
+
+ Args:
+ feats (Tuple[Tensor] | List[Tuple[Tensor]]): The multi-stage
+ features (or multiple multi-stage features in TTA)
+ batch_data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+ test_cfg (dict): The runtime config for testing process. Defaults
+ to {}
+
+ Returns:
+ Union[InstanceList | Tuple[InstanceList | PixelDataList]]: If
+ ``test_cfg['output_heatmap']==True``, return both pose and heatmap
+ prediction; otherwise only return the pose prediction.
+
+ The pose prediction is a list of ``InstanceData``, each contains
+ the following fields:
+
+ - keypoints (np.ndarray): predicted keypoint coordinates in
+ shape (num_instances, K, D) where K is the keypoint number
+ and D is the keypoint dimension
+ - keypoint_scores (np.ndarray): predicted keypoint scores in
+ shape (num_instances, K)
+
+ The heatmap prediction is a list of ``PixelData``, each contains
+ the following fields:
+
+ - heatmaps (Tensor): The predicted heatmaps in shape (K, h, w)
+ """
+
+ if test_cfg.get('flip_test', False):
+ # TTA: flip test -> feats = [orig, flipped]
+ assert isinstance(feats, list) and len(feats) == 2
+ flip_indices = batch_data_samples[0].metainfo['flip_indices']
+ input_size = batch_data_samples[0].metainfo['input_size']
+ _feats, _feats_flip = feats
+
+ _batch_coords, _batch_heatmaps = self.forward(_feats)
+
+ _batch_coords_flip, _batch_heatmaps_flip = self.forward(
+ _feats_flip)
+ _batch_coords_flip = flip_coordinates(
+ _batch_coords_flip,
+ flip_indices=flip_indices,
+ shift_coords=test_cfg.get('shift_coords', True),
+ input_size=input_size)
+ _batch_heatmaps_flip = flip_heatmaps(
+ _batch_heatmaps_flip,
+ flip_mode='heatmap',
+ flip_indices=flip_indices,
+ shift_heatmap=test_cfg.get('shift_heatmap', False))
+
+ batch_coords = (_batch_coords + _batch_coords_flip) * 0.5
+ batch_heatmaps = (_batch_heatmaps + _batch_heatmaps_flip) * 0.5
+ else:
+ batch_coords, batch_heatmaps = self.forward(feats) # (B, K, D)
+
+ batch_coords.unsqueeze_(dim=1) # (B, N, K, D)
+ preds = self.decode(batch_coords)
+
+ if test_cfg.get('output_heatmaps', False):
+ pred_fields = [
+ PixelData(heatmaps=hm) for hm in batch_heatmaps.detach()
+ ]
+ return preds, pred_fields
+ else:
+ return preds
+
+ def loss(self,
+ inputs: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ train_cfg: ConfigType = {}) -> dict:
+ """Calculate losses from a batch of inputs and data samples."""
+
+ pred_coords, _ = self.forward(inputs)
+ keypoint_labels = torch.cat(
+ [d.gt_instance_labels.keypoint_labels for d in batch_data_samples])
+ keypoint_weights = torch.cat([
+ d.gt_instance_labels.keypoint_weights for d in batch_data_samples
+ ])
+
+ # calculate losses
+ losses = dict()
+
+ # TODO: multi-loss calculation
+ loss = self.loss_module(pred_coords, keypoint_labels, keypoint_weights)
+
+ losses.update(loss_kpt=loss)
+
+ # calculate accuracy
+ _, avg_acc, _ = keypoint_pck_accuracy(
+ pred=to_numpy(pred_coords),
+ gt=to_numpy(keypoint_labels),
+ mask=to_numpy(keypoint_weights) > 0,
+ thr=0.05,
+ norm_factor=np.ones((pred_coords.size(0), 2), dtype=np.float32))
+
+ acc_pose = torch.tensor(avg_acc, device=keypoint_labels.device)
+ losses.update(acc_pose=acc_pose)
+
+ return losses
+
+ @property
+ def default_init_cfg(self):
+ init_cfg = [dict(type='Normal', layer=['Linear'], std=0.01, bias=0)]
+ return init_cfg
+
+ def _load_state_dict_pre_hook(self, state_dict, prefix, local_meta, *args,
+ **kwargs):
+ """A hook function to load weights of deconv layers from
+ :class:`HeatmapHead` into `simplebaseline_head`.
+
+ The hook will be automatically registered during initialization.
+ """
+
+ # convert old-version state dict
+ keys = list(state_dict.keys())
+ for _k in keys:
+ if not _k.startswith(prefix):
+ continue
+ v = state_dict.pop(_k)
+ k = _k.lstrip(prefix)
+
+ k_new = _k
+ k_parts = k.split('.')
+ if self.simplebaseline_head is not None:
+ if k_parts[0] == 'conv_layers':
+ k_new = (
+ prefix + 'simplebaseline_head.deconv_layers.' +
+ '.'.join(k_parts[1:]))
+ elif k_parts[0] == 'final_layer':
+ k_new = prefix + 'simplebaseline_head.' + k
+
+ state_dict[k_new] = v
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/regression_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/regression_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..06ffa894aecac87da6c1a826e4803a90c8f48716
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/regression_head.py
@@ -0,0 +1,151 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional, Sequence, Tuple, Union
+
+import numpy as np
+import torch
+from torch import Tensor, nn
+
+from mmpose.evaluation.functional import keypoint_pck_accuracy
+from mmpose.models.utils.tta import flip_coordinates
+from mmpose.registry import KEYPOINT_CODECS, MODELS
+from mmpose.utils.tensor_utils import to_numpy
+from mmpose.utils.typing import (ConfigType, OptConfigType, OptSampleList,
+ Predictions)
+from ..base_head import BaseHead
+
+OptIntSeq = Optional[Sequence[int]]
+
+
+@MODELS.register_module()
+class RegressionHead(BaseHead):
+ """Top-down regression head introduced in `Deeppose`_ by Toshev et al
+ (2014). The head is composed of fully-connected layers to predict the
+ coordinates directly.
+
+ Args:
+ in_channels (int | sequence[int]): Number of input channels
+ num_joints (int): Number of joints
+ loss (Config): Config for keypoint loss. Defaults to use
+ :class:`SmoothL1Loss`
+ decoder (Config, optional): The decoder config that controls decoding
+ keypoint coordinates from the network output. Defaults to ``None``
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+
+ .. _`Deeppose`: https://arxiv.org/abs/1312.4659
+ """
+
+ _version = 2
+
+ def __init__(self,
+ in_channels: Union[int, Sequence[int]],
+ num_joints: int,
+ loss: ConfigType = dict(
+ type='SmoothL1Loss', use_target_weight=True),
+ decoder: OptConfigType = None,
+ init_cfg: OptConfigType = None):
+
+ if init_cfg is None:
+ init_cfg = self.default_init_cfg
+
+ super().__init__(init_cfg)
+
+ self.in_channels = in_channels
+ self.num_joints = num_joints
+ self.loss_module = MODELS.build(loss)
+ if decoder is not None:
+ self.decoder = KEYPOINT_CODECS.build(decoder)
+ else:
+ self.decoder = None
+
+ # Define fully-connected layers
+ self.fc = nn.Linear(in_channels, self.num_joints * 2)
+
+ def forward(self, feats: Tuple[Tensor]) -> Tensor:
+ """Forward the network. The input is multi scale feature maps and the
+ output is the coordinates.
+
+ Args:
+ feats (Tuple[Tensor]): Multi scale feature maps.
+
+ Returns:
+ Tensor: output coordinates(and sigmas[optional]).
+ """
+ x = feats[-1]
+
+ x = torch.flatten(x, 1)
+ x = self.fc(x)
+
+ return x.reshape(-1, self.num_joints, 2)
+
+ def predict(self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ test_cfg: ConfigType = {}) -> Predictions:
+ """Predict results from outputs."""
+
+ if test_cfg.get('flip_test', False):
+ # TTA: flip test -> feats = [orig, flipped]
+ assert isinstance(feats, list) and len(feats) == 2
+ flip_indices = batch_data_samples[0].metainfo['flip_indices']
+ input_size = batch_data_samples[0].metainfo['input_size']
+ _feats, _feats_flip = feats
+
+ _batch_coords = self.forward(_feats)
+ _batch_coords_flip = flip_coordinates(
+ self.forward(_feats_flip),
+ flip_indices=flip_indices,
+ shift_coords=test_cfg.get('shift_coords', True),
+ input_size=input_size)
+ batch_coords = (_batch_coords + _batch_coords_flip) * 0.5
+ else:
+ batch_coords = self.forward(feats) # (B, K, D)
+
+ batch_coords.unsqueeze_(dim=1) # (B, N, K, D)
+ preds = self.decode(batch_coords)
+
+ return preds
+
+ def loss(self,
+ inputs: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ train_cfg: ConfigType = {}) -> dict:
+ """Calculate losses from a batch of inputs and data samples."""
+
+ pred_outputs = self.forward(inputs)
+
+ keypoint_labels = torch.cat(
+ [d.gt_instance_labels.keypoint_labels for d in batch_data_samples])
+ keypoint_weights = torch.cat([
+ d.gt_instance_labels.keypoint_weights for d in batch_data_samples
+ ])
+
+ # calculate losses
+ losses = dict()
+ loss = self.loss_module(pred_outputs, keypoint_labels,
+ keypoint_weights.unsqueeze(-1))
+
+ losses.update(loss_kpt=loss)
+
+ # calculate accuracy
+ _, avg_acc, _ = keypoint_pck_accuracy(
+ pred=to_numpy(pred_outputs),
+ gt=to_numpy(keypoint_labels),
+ mask=to_numpy(keypoint_weights) > 0,
+ thr=0.05,
+ norm_factor=np.ones((pred_outputs.size(0), 2), dtype=np.float32))
+
+ acc_pose = torch.tensor(avg_acc, device=keypoint_labels.device)
+ losses.update(acc_pose=acc_pose)
+
+ return losses
+
+ @property
+ def default_init_cfg(self):
+ init_cfg = [dict(type='Normal', layer=['Linear'], std=0.01, bias=0)]
+ return init_cfg
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/rle_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/rle_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..3c0d0123d32ecc4041316443ef219e1f66e0994f
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/rle_head.py
@@ -0,0 +1,192 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional, Sequence, Tuple, Union
+
+import numpy as np
+import torch
+from torch import Tensor, nn
+
+from mmpose.evaluation.functional import keypoint_pck_accuracy
+from mmpose.models.utils.tta import flip_coordinates
+from mmpose.registry import KEYPOINT_CODECS, MODELS
+from mmpose.utils.tensor_utils import to_numpy
+from mmpose.utils.typing import (ConfigType, OptConfigType, OptSampleList,
+ Predictions)
+from ..base_head import BaseHead
+
+OptIntSeq = Optional[Sequence[int]]
+
+
+@MODELS.register_module()
+class RLEHead(BaseHead):
+ """Top-down regression head introduced in `RLE`_ by Li et al(2021). The
+ head is composed of fully-connected layers to predict the coordinates and
+ sigma(the variance of the coordinates) together.
+
+ Args:
+ in_channels (int | sequence[int]): Number of input channels
+ num_joints (int): Number of joints
+ loss (Config): Config for keypoint loss. Defaults to use
+ :class:`RLELoss`
+ decoder (Config, optional): The decoder config that controls decoding
+ keypoint coordinates from the network output. Defaults to ``None``
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+
+ .. _`RLE`: https://arxiv.org/abs/2107.11291
+ """
+
+ _version = 2
+
+ def __init__(self,
+ in_channels: Union[int, Sequence[int]],
+ num_joints: int,
+ loss: ConfigType = dict(
+ type='RLELoss', use_target_weight=True),
+ decoder: OptConfigType = None,
+ init_cfg: OptConfigType = None):
+
+ if init_cfg is None:
+ init_cfg = self.default_init_cfg
+
+ super().__init__(init_cfg)
+
+ self.in_channels = in_channels
+ self.num_joints = num_joints
+ self.loss_module = MODELS.build(loss)
+ if decoder is not None:
+ self.decoder = KEYPOINT_CODECS.build(decoder)
+ else:
+ self.decoder = None
+
+ # Define fully-connected layers
+ self.fc = nn.Linear(in_channels, self.num_joints * 4)
+
+ # Register the hook to automatically convert old version state dicts
+ self._register_load_state_dict_pre_hook(self._load_state_dict_pre_hook)
+
+ def forward(self, feats: Tuple[Tensor]) -> Tensor:
+ """Forward the network. The input is multi scale feature maps and the
+ output is the coordinates.
+
+ Args:
+ feats (Tuple[Tensor]): Multi scale feature maps.
+
+ Returns:
+ Tensor: output coordinates(and sigmas[optional]).
+ """
+ x = feats[-1]
+
+ x = torch.flatten(x, 1)
+ x = self.fc(x)
+
+ return x.reshape(-1, self.num_joints, 4)
+
+ def predict(self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ test_cfg: ConfigType = {}) -> Predictions:
+ """Predict results from outputs."""
+
+ if test_cfg.get('flip_test', False):
+ # TTA: flip test -> feats = [orig, flipped]
+ assert isinstance(feats, list) and len(feats) == 2
+ flip_indices = batch_data_samples[0].metainfo['flip_indices']
+ input_size = batch_data_samples[0].metainfo['input_size']
+
+ _feats, _feats_flip = feats
+
+ _batch_coords = self.forward(_feats)
+ _batch_coords[..., 2:] = _batch_coords[..., 2:].sigmoid()
+
+ _batch_coords_flip = flip_coordinates(
+ self.forward(_feats_flip),
+ flip_indices=flip_indices,
+ shift_coords=test_cfg.get('shift_coords', True),
+ input_size=input_size)
+ _batch_coords_flip[..., 2:] = _batch_coords_flip[..., 2:].sigmoid()
+
+ batch_coords = (_batch_coords + _batch_coords_flip) * 0.5
+ else:
+ batch_coords = self.forward(feats) # (B, K, D)
+ batch_coords[..., 2:] = batch_coords[..., 2:].sigmoid()
+
+ batch_coords.unsqueeze_(dim=1) # (B, N, K, D)
+ preds = self.decode(batch_coords)
+
+ return preds
+
+ def loss(self,
+ inputs: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ train_cfg: ConfigType = {}) -> dict:
+ """Calculate losses from a batch of inputs and data samples."""
+
+ pred_outputs = self.forward(inputs)
+
+ keypoint_labels = torch.cat(
+ [d.gt_instance_labels.keypoint_labels for d in batch_data_samples])
+ keypoint_weights = torch.cat([
+ d.gt_instance_labels.keypoint_weights for d in batch_data_samples
+ ])
+
+ pred_coords = pred_outputs[:, :, :2]
+ pred_sigma = pred_outputs[:, :, 2:4]
+
+ # calculate losses
+ losses = dict()
+ loss = self.loss_module(pred_coords, pred_sigma, keypoint_labels,
+ keypoint_weights.unsqueeze(-1))
+
+ losses.update(loss_kpt=loss)
+
+ # calculate accuracy
+ _, avg_acc, _ = keypoint_pck_accuracy(
+ pred=to_numpy(pred_coords),
+ gt=to_numpy(keypoint_labels),
+ mask=to_numpy(keypoint_weights) > 0,
+ thr=0.05,
+ norm_factor=np.ones((pred_coords.size(0), 2), dtype=np.float32))
+
+ acc_pose = torch.tensor(avg_acc, device=keypoint_labels.device)
+ losses.update(acc_pose=acc_pose)
+
+ return losses
+
+ def _load_state_dict_pre_hook(self, state_dict, prefix, local_meta, *args,
+ **kwargs):
+ """A hook function to convert old-version state dict of
+ :class:`TopdownHeatmapSimpleHead` (before MMPose v1.0.0) to a
+ compatible format of :class:`HeatmapHead`.
+
+ The hook will be automatically registered during initialization.
+ """
+
+ version = local_meta.get('version', None)
+ if version and version >= self._version:
+ return
+
+ # convert old-version state dict
+ keys = list(state_dict.keys())
+ for _k in keys:
+ v = state_dict.pop(_k)
+ k = _k.lstrip(prefix)
+ # In old version, "loss" includes the instances of loss,
+ # now it should be renamed "loss_module"
+ k_parts = k.split('.')
+ if k_parts[0] == 'loss':
+ # loss.xxx -> loss_module.xxx
+ k_new = prefix + 'loss_module.' + '.'.join(k_parts[1:])
+ else:
+ k_new = _k
+
+ state_dict[k_new] = v
+
+ @property
+ def default_init_cfg(self):
+ init_cfg = [dict(type='Normal', layer=['Linear'], std=0.01, bias=0)]
+ return init_cfg
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/temporal_regression_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/temporal_regression_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..d428c8ff9cc3e5de77889deb2544c903be36f48d
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/temporal_regression_head.py
@@ -0,0 +1,156 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional, Sequence, Tuple, Union
+
+import numpy as np
+import torch
+from torch import Tensor, nn
+
+from mmpose.evaluation.functional import keypoint_pck_accuracy
+from mmpose.registry import KEYPOINT_CODECS, MODELS
+from mmpose.utils.tensor_utils import to_numpy
+from mmpose.utils.typing import (ConfigType, OptConfigType, OptSampleList,
+ Predictions)
+from ..base_head import BaseHead
+
+OptIntSeq = Optional[Sequence[int]]
+
+
+@MODELS.register_module()
+class TemporalRegressionHead(BaseHead):
+ """Temporal Regression head of `VideoPose3D`_ by Dario et al (CVPR'2019).
+
+ Args:
+ in_channels (int | sequence[int]): Number of input channels
+ num_joints (int): Number of joints
+ loss (Config): Config for keypoint loss. Defaults to use
+ :class:`SmoothL1Loss`
+ decoder (Config, optional): The decoder config that controls decoding
+ keypoint coordinates from the network output. Defaults to ``None``
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+
+ .. _`VideoPose3D`: https://arxiv.org/abs/1811.11742
+ """
+
+ _version = 2
+
+ def __init__(self,
+ in_channels: Union[int, Sequence[int]],
+ num_joints: int,
+ loss: ConfigType = dict(
+ type='MSELoss', use_target_weight=True),
+ decoder: OptConfigType = None,
+ init_cfg: OptConfigType = None):
+
+ if init_cfg is None:
+ init_cfg = self.default_init_cfg
+
+ super().__init__(init_cfg)
+
+ self.in_channels = in_channels
+ self.num_joints = num_joints
+ self.loss_module = MODELS.build(loss)
+ if decoder is not None:
+ self.decoder = KEYPOINT_CODECS.build(decoder)
+ else:
+ self.decoder = None
+
+ # Define fully-connected layers
+ self.conv = nn.Conv1d(in_channels, self.num_joints * 3, 1)
+
+ def forward(self, feats: Tuple[Tensor]) -> Tensor:
+ """Forward the network. The input is multi scale feature maps and the
+ output is the coordinates.
+
+ Args:
+ feats (Tuple[Tensor]): Multi scale feature maps.
+
+ Returns:
+ Tensor: Output coordinates (and sigmas[optional]).
+ """
+ x = feats[-1]
+
+ x = self.conv(x)
+
+ return x.reshape(-1, self.num_joints, 3)
+
+ def predict(self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ test_cfg: ConfigType = {}) -> Predictions:
+ """Predict results from outputs.
+
+ Returns:
+ preds (sequence[InstanceData]): Prediction results.
+ Each contains the following fields:
+
+ - keypoints: Predicted keypoints of shape (B, N, K, D).
+ - keypoint_scores: Scores of predicted keypoints of shape
+ (B, N, K).
+ """
+
+ batch_coords = self.forward(feats) # (B, K, D)
+
+ # Restore global position with target_root
+ target_root = batch_data_samples[0].metainfo.get('target_root', None)
+ if target_root is not None:
+ target_root = torch.stack([
+ torch.from_numpy(b.metainfo['target_root'])
+ for b in batch_data_samples
+ ])
+ else:
+ target_root = torch.stack([
+ torch.empty((0), dtype=torch.float32)
+ for _ in batch_data_samples[0].metainfo
+ ])
+
+ preds = self.decode((batch_coords, target_root))
+
+ return preds
+
+ def loss(self,
+ inputs: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ train_cfg: ConfigType = {}) -> dict:
+ """Calculate losses from a batch of inputs and data samples."""
+
+ pred_outputs = self.forward(inputs)
+
+ lifting_target_label = torch.cat([
+ d.gt_instance_labels.lifting_target_label
+ for d in batch_data_samples
+ ])
+ lifting_target_weights = torch.cat([
+ d.gt_instance_labels.lifting_target_weights
+ for d in batch_data_samples
+ ])
+
+ # calculate losses
+ losses = dict()
+ loss = self.loss_module(pred_outputs, lifting_target_label,
+ lifting_target_weights.unsqueeze(-1))
+
+ losses.update(loss_pose3d=loss)
+
+ # calculate accuracy
+ _, avg_acc, _ = keypoint_pck_accuracy(
+ pred=to_numpy(pred_outputs),
+ gt=to_numpy(lifting_target_label),
+ mask=to_numpy(lifting_target_weights) > 0,
+ thr=0.05,
+ norm_factor=np.ones((pred_outputs.size(0), 3), dtype=np.float32))
+
+ mpjpe_pose = torch.tensor(avg_acc, device=lifting_target_label.device)
+ losses.update(mpjpe=mpjpe_pose)
+
+ return losses
+
+ @property
+ def default_init_cfg(self):
+ init_cfg = [dict(type='Normal', layer=['Linear'], std=0.01, bias=0)]
+ return init_cfg
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/trajectory_regression_head.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/trajectory_regression_head.py
new file mode 100644
index 0000000000000000000000000000000000000000..a6d2041493ef30b7eb3c1b0b452e3207ed0df364
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/heads/regression_heads/trajectory_regression_head.py
@@ -0,0 +1,155 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional, Sequence, Tuple, Union
+
+import numpy as np
+import torch
+from torch import Tensor, nn
+
+from mmpose.evaluation.functional import keypoint_pck_accuracy
+from mmpose.registry import KEYPOINT_CODECS, MODELS
+from mmpose.utils.tensor_utils import to_numpy
+from mmpose.utils.typing import (ConfigType, OptConfigType, OptSampleList,
+ Predictions)
+from ..base_head import BaseHead
+
+OptIntSeq = Optional[Sequence[int]]
+
+
+@MODELS.register_module()
+class TrajectoryRegressionHead(BaseHead):
+ """Trajectory Regression head of `VideoPose3D`_ by Dario et al (CVPR'2019).
+
+ Args:
+ in_channels (int | sequence[int]): Number of input channels
+ num_joints (int): Number of joints
+ loss (Config): Config for trajectory loss. Defaults to use
+ :class:`MPJPELoss`
+ decoder (Config, optional): The decoder config that controls decoding
+ keypoint coordinates from the network output. Defaults to ``None``
+ init_cfg (Config, optional): Config to control the initialization. See
+ :attr:`default_init_cfg` for default settings
+
+ .. _`VideoPose3D`: https://arxiv.org/abs/1811.11742
+ """
+
+ _version = 2
+
+ def __init__(self,
+ in_channels: Union[int, Sequence[int]],
+ num_joints: int,
+ loss: ConfigType = dict(
+ type='MPJPELoss', use_target_weight=True),
+ decoder: OptConfigType = None,
+ init_cfg: OptConfigType = None):
+
+ if init_cfg is None:
+ init_cfg = self.default_init_cfg
+
+ super().__init__(init_cfg)
+
+ self.in_channels = in_channels
+ self.num_joints = num_joints
+ self.loss_module = MODELS.build(loss)
+ if decoder is not None:
+ self.decoder = KEYPOINT_CODECS.build(decoder)
+ else:
+ self.decoder = None
+
+ # Define fully-connected layers
+ self.conv = nn.Conv1d(in_channels, self.num_joints * 3, 1)
+
+ def forward(self, feats: Tuple[Tensor]) -> Tensor:
+ """Forward the network. The input is multi scale feature maps and the
+ output is the coordinates.
+
+ Args:
+ feats (Tuple[Tensor]): Multi scale feature maps.
+
+ Returns:
+ Tensor: output coordinates(and sigmas[optional]).
+ """
+ x = feats[-1]
+
+ x = self.conv(x)
+
+ return x.reshape(-1, self.num_joints, 3)
+
+ def predict(self,
+ feats: Tuple[Tensor],
+ batch_data_samples: OptSampleList,
+ test_cfg: ConfigType = {}) -> Predictions:
+ """Predict results from outputs.
+
+ Returns:
+ preds (sequence[InstanceData]): Prediction results.
+ Each contains the following fields:
+
+ - keypoints: Predicted keypoints of shape (B, N, K, D).
+ - keypoint_scores: Scores of predicted keypoints of shape
+ (B, N, K).
+ """
+
+ batch_coords = self.forward(feats) # (B, K, D)
+
+ # Restore global position with target_root
+ target_root = batch_data_samples[0].metainfo.get('target_root', None)
+ if target_root is not None:
+ target_root = torch.stack([
+ torch.from_numpy(b.metainfo['target_root'])
+ for b in batch_data_samples
+ ])
+ else:
+ target_root = torch.stack([
+ torch.empty((0), dtype=torch.float32)
+ for _ in batch_data_samples[0].metainfo
+ ])
+
+ preds = self.decode((batch_coords, target_root))
+
+ return preds
+
+ def loss(self,
+ inputs: Union[Tensor, Tuple[Tensor]],
+ batch_data_samples: OptSampleList,
+ train_cfg: ConfigType = {}) -> dict:
+ """Calculate losses from a batch of inputs and data samples."""
+
+ pred_outputs = self.forward(inputs)
+
+ lifting_target_label = torch.cat([
+ d.gt_instance_labels.lifting_target_label
+ for d in batch_data_samples
+ ])
+ trajectory_weights = torch.cat([
+ d.gt_instance_labels.trajectory_weights for d in batch_data_samples
+ ])
+
+ # calculate losses
+ losses = dict()
+ loss = self.loss_module(pred_outputs, lifting_target_label,
+ trajectory_weights.unsqueeze(-1))
+
+ losses.update(loss_traj=loss)
+
+ # calculate accuracy
+ _, avg_acc, _ = keypoint_pck_accuracy(
+ pred=to_numpy(pred_outputs),
+ gt=to_numpy(lifting_target_label),
+ mask=to_numpy(trajectory_weights) > 0,
+ thr=0.05,
+ norm_factor=np.ones((pred_outputs.size(0), 3), dtype=np.float32))
+
+ mpjpe_traj = torch.tensor(avg_acc, device=lifting_target_label.device)
+ losses.update(mpjpe_traj=mpjpe_traj)
+
+ return losses
+
+ @property
+ def default_init_cfg(self):
+ init_cfg = [dict(type='Normal', layer=['Linear'], std=0.01, bias=0)]
+ return init_cfg
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..656b83e395a6347a83be9e9e2a2e500e7ff8f3ed
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__init__.py
@@ -0,0 +1,24 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .ae_loss import AssociativeEmbeddingLoss
+from .classification_loss import BCELoss, JSDiscretLoss, KLDiscretLoss
+from .heatmap_loss import (AdaptiveWingLoss, KeypointMSELoss,
+ KeypointOHKMMSELoss)
+from .loss_wrappers import CombinedLoss, MultipleLossWrapper
+from .regression_loss import (BoneLoss, L1Loss, MPJPELoss, MSELoss, RLELoss,
+ SemiSupervisionLoss, SmoothL1Loss,
+ SoftWeightSmoothL1Loss, SoftWingLoss, WingLoss)
+from .pose3d_loss import Pose3d_L1_Loss, Pose3d_K_Loss, Pose3d_RelativeDepth_Loss, Pose3d_Confidence_Loss
+
+__all__ = [
+ 'KeypointMSELoss', 'KeypointOHKMMSELoss', 'SmoothL1Loss', 'WingLoss',
+ 'MPJPELoss', 'MSELoss', 'L1Loss', 'BCELoss', 'BoneLoss',
+ 'SemiSupervisionLoss', 'SoftWingLoss', 'AdaptiveWingLoss', 'RLELoss',
+ 'KLDiscretLoss', 'MultipleLossWrapper', 'JSDiscretLoss', 'CombinedLoss',
+ 'AssociativeEmbeddingLoss', 'SoftWeightSmoothL1Loss', 'Pose3d_L1_Loss',
+ 'Pose3d_K_Loss', 'Pose3d_RelativeDepth_Loss', 'Pose3d_Confidence_Loss'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f2ea2c978835ac1c455eb63ff491d002349da609
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/ae_loss.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/ae_loss.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4442f781b2354e633769010e2096d079cbd0689e
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/ae_loss.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/classification_loss.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/classification_loss.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..267fb718cace3a2db3d988419d61b040ab2f6fe3
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/classification_loss.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/heatmap_loss.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/heatmap_loss.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..85dcb644d6141ee0a634b55a37fa6a13db25e184
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/heatmap_loss.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/loss_wrappers.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/loss_wrappers.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..aa44fcc80eaa68970f1dcc90a9695c5d8dd01612
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/loss_wrappers.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/pose3d_loss.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/pose3d_loss.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d898eb73e5cb4a3659762fe618669bcd907350a8
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/pose3d_loss.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/regression_loss.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/regression_loss.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1a5ab36ebeba818cc852523b68080350c994a289
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/__pycache__/regression_loss.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/ae_loss.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/ae_loss.py
new file mode 100644
index 0000000000000000000000000000000000000000..0fe9cdfedce13e53148a523048e7528072186c51
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/ae_loss.py
@@ -0,0 +1,128 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+
+from typing import List, Union
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from torch import Tensor
+
+from mmpose.registry import MODELS
+
+
+@MODELS.register_module()
+class AssociativeEmbeddingLoss(nn.Module):
+ """Associative Embedding loss.
+
+ Details can be found in
+ `Associative Embedding `_
+
+ Note:
+
+ - batch size: B
+ - instance number: N
+ - keypoint number: K
+ - keypoint dimension: D
+ - embedding tag dimension: L
+ - heatmap size: [W, H]
+
+ Args:
+ loss_weight (float): Weight of the loss. Defaults to 1.0
+ push_loss_factor (float): A factor that controls the weight between
+ the push loss and the pull loss. Defaults to 0.5
+ """
+
+ def __init__(self,
+ loss_weight: float = 1.0,
+ push_loss_factor: float = 0.5) -> None:
+ super().__init__()
+ self.loss_weight = loss_weight
+ self.push_loss_factor = push_loss_factor
+
+ def _ae_loss_per_image(self, tags: Tensor, keypoint_indices: Tensor):
+ """Compute associative embedding loss for one image.
+
+ Args:
+ tags (Tensor): Tagging heatmaps in shape (K*L, H, W)
+ keypoint_indices (Tensor): Ground-truth keypint position indices
+ in shape (N, K, 2)
+ """
+ K = keypoint_indices.shape[1]
+ C, H, W = tags.shape
+ L = C // K
+
+ tags = tags.view(L, K, H * W)
+ instance_tags = []
+ instance_kpt_tags = []
+
+ for keypoint_indices_n in keypoint_indices:
+ _kpt_tags = []
+ for k in range(K):
+ if keypoint_indices_n[k, 1]:
+ _kpt_tags.append(tags[:, k, keypoint_indices_n[k, 0]])
+
+ if _kpt_tags:
+ kpt_tags = torch.stack(_kpt_tags)
+ instance_kpt_tags.append(kpt_tags)
+ instance_tags.append(kpt_tags.mean(dim=0))
+
+ N = len(instance_kpt_tags) # number of instances with valid keypoints
+
+ if N == 0:
+ pull_loss = tags.new_zeros(size=(), requires_grad=True)
+ push_loss = tags.new_zeros(size=(), requires_grad=True)
+ else:
+ pull_loss = sum(
+ F.mse_loss(_kpt_tags, _tag.expand_as(_kpt_tags))
+ for (_kpt_tags, _tag) in zip(instance_kpt_tags, instance_tags))
+
+ if N == 1:
+ push_loss = tags.new_zeros(size=(), requires_grad=True)
+ else:
+ tag_mat = torch.stack(instance_tags) # (N, L)
+ diff = tag_mat[None] - tag_mat[:, None] # (N, N, L)
+ push_loss = torch.sum(torch.exp(-diff.pow(2)))
+
+ # normalization
+ eps = 1e-6
+ pull_loss = pull_loss / (N + eps)
+ push_loss = push_loss / ((N - 1) * N + eps)
+
+ return pull_loss, push_loss
+
+ def forward(self, tags: Tensor, keypoint_indices: Union[List[Tensor],
+ Tensor]):
+ """Compute associative embedding loss on a batch of data.
+
+ Args:
+ tags (Tensor): Tagging heatmaps in shape (B, L*K, H, W)
+ keypoint_indices (Tensor|List[Tensor]): Ground-truth keypint
+ position indices represented by a Tensor in shape
+ (B, N, K, 2), or a list of B Tensors in shape (N_i, K, 2)
+ Each keypoint's index is represented as [i, v], where i is the
+ position index in the heatmap (:math:`i=y*w+x`) and v is the
+ visibility
+
+ Returns:
+ tuple:
+ - pull_loss (Tensor)
+ - push_loss (Tensor)
+ """
+
+ assert tags.shape[0] == len(keypoint_indices)
+
+ pull_loss = 0.
+ push_loss = 0.
+
+ for i in range(tags.shape[0]):
+ _pull, _push = self._ae_loss_per_image(tags[i],
+ keypoint_indices[i])
+ pull_loss += _pull * self.loss_weight
+ push_loss += _push * self.loss_weight * self.push_loss_factor
+
+ return pull_loss, push_loss
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/classification_loss.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/classification_loss.py
new file mode 100644
index 0000000000000000000000000000000000000000..86529b6001d8e8e4290b3336230550c723287ec8
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/classification_loss.py
@@ -0,0 +1,223 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+
+from mmpose.registry import MODELS
+
+
+@MODELS.register_module()
+class BCELoss(nn.Module):
+ """Binary Cross Entropy loss.
+
+ Args:
+ use_target_weight (bool): Option to use weighted loss.
+ Different joint types may have different target weights.
+ loss_weight (float): Weight of the loss. Default: 1.0.
+ with_logits (bool): Whether to use BCEWithLogitsLoss. Default: False.
+ """
+
+ def __init__(self,
+ use_target_weight=False,
+ loss_weight=1.,
+ with_logits=False):
+ super().__init__()
+ self.criterion = F.binary_cross_entropy if not with_logits\
+ else F.binary_cross_entropy_with_logits
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+
+ def forward(self, output, target, target_weight=None):
+ """Forward function.
+
+ Note:
+ - batch_size: N
+ - num_labels: K
+
+ Args:
+ output (torch.Tensor[N, K]): Output classification.
+ target (torch.Tensor[N, K]): Target classification.
+ target_weight (torch.Tensor[N, K] or torch.Tensor[N]):
+ Weights across different labels.
+ """
+
+ if self.use_target_weight:
+ assert target_weight is not None
+ loss = self.criterion(output, target, reduction='none')
+ if target_weight.dim() == 1:
+ target_weight = target_weight[:, None]
+ loss = (loss * target_weight).mean()
+ else:
+ loss = self.criterion(output, target)
+
+ return loss * self.loss_weight
+
+
+@MODELS.register_module()
+class JSDiscretLoss(nn.Module):
+ """Discrete JS Divergence loss for DSNT with Gaussian Heatmap.
+
+ Modified from `the official implementation
+ `_.
+
+ Args:
+ use_target_weight (bool): Option to use weighted loss.
+ Different joint types may have different target weights.
+ size_average (bool): Option to average the loss by the batch_size.
+ """
+
+ def __init__(
+ self,
+ use_target_weight=True,
+ size_average: bool = True,
+ ):
+ super(JSDiscretLoss, self).__init__()
+ self.use_target_weight = use_target_weight
+ self.size_average = size_average
+ self.kl_loss = nn.KLDivLoss(reduction='none')
+
+ def kl(self, p, q):
+ """Kullback-Leibler Divergence."""
+
+ eps = 1e-24
+ kl_values = self.kl_loss((q + eps).log(), p)
+ return kl_values
+
+ def js(self, pred_hm, gt_hm):
+ """Jensen-Shannon Divergence."""
+
+ m = 0.5 * (pred_hm + gt_hm)
+ js_values = 0.5 * (self.kl(pred_hm, m) + self.kl(gt_hm, m))
+ return js_values
+
+ def forward(self, pred_hm, gt_hm, target_weight=None):
+ """Forward function.
+
+ Args:
+ pred_hm (torch.Tensor[N, K, H, W]): Predicted heatmaps.
+ gt_hm (torch.Tensor[N, K, H, W]): Target heatmaps.
+ target_weight (torch.Tensor[N, K] or torch.Tensor[N]):
+ Weights across different labels.
+
+ Returns:
+ torch.Tensor: Loss value.
+ """
+
+ if self.use_target_weight:
+ assert target_weight is not None
+ assert pred_hm.ndim >= target_weight.ndim
+
+ for i in range(pred_hm.ndim - target_weight.ndim):
+ target_weight = target_weight.unsqueeze(-1)
+
+ loss = self.js(pred_hm * target_weight, gt_hm * target_weight)
+ else:
+ loss = self.js(pred_hm, gt_hm)
+
+ if self.size_average:
+ loss /= len(gt_hm)
+
+ return loss.sum()
+
+
+@MODELS.register_module()
+class KLDiscretLoss(nn.Module):
+ """Discrete KL Divergence loss for SimCC with Gaussian Label Smoothing.
+ Modified from `the official implementation.
+
+ `_.
+ Args:
+ beta (float): Temperature factor of Softmax.
+ label_softmax (bool): Whether to use Softmax on labels.
+ use_target_weight (bool): Option to use weighted loss.
+ Different joint types may have different target weights.
+ """
+
+ def __init__(self, beta=1.0, label_softmax=False, use_target_weight=True):
+ super(KLDiscretLoss, self).__init__()
+ self.beta = beta
+ self.label_softmax = label_softmax
+ self.use_target_weight = use_target_weight
+
+ self.log_softmax = nn.LogSoftmax(dim=1)
+ self.kl_loss = nn.KLDivLoss(reduction='none')
+
+ def criterion(self, dec_outs, labels):
+ """Criterion function."""
+ log_pt = self.log_softmax(dec_outs * self.beta)
+ if self.label_softmax:
+ labels = F.softmax(labels * self.beta, dim=1)
+ loss = torch.mean(self.kl_loss(log_pt, labels), dim=1)
+ return loss
+
+ def forward(self, pred_simcc, gt_simcc, target_weight):
+ """Forward function.
+
+ Args:
+ pred_simcc (Tuple[Tensor, Tensor]): Predicted SimCC vectors of
+ x-axis and y-axis.
+ gt_simcc (Tuple[Tensor, Tensor]): Target representations.
+ target_weight (torch.Tensor[N, K] or torch.Tensor[N]):
+ Weights across different labels.
+ """
+ num_joints = pred_simcc[0].size(1)
+ loss = 0
+
+ if self.use_target_weight:
+ weight = target_weight.reshape(-1)
+ else:
+ weight = 1.
+
+ for pred, target in zip(pred_simcc, gt_simcc):
+ pred = pred.reshape(-1, pred.size(-1))
+ target = target.reshape(-1, target.size(-1))
+
+ loss += self.criterion(pred, target).mul(weight).sum()
+
+ return loss / num_joints
+
+
+@MODELS.register_module()
+class InfoNCELoss(nn.Module):
+ """InfoNCE loss for training a discriminative representation space with a
+ contrastive manner.
+
+ `Representation Learning with Contrastive Predictive Coding
+ arXiv: `_.
+
+ Args:
+ temperature (float, optional): The temperature to use in the softmax
+ function. Higher temperatures lead to softer probability
+ distributions. Defaults to 1.0.
+ loss_weight (float, optional): The weight to apply to the loss.
+ Defaults to 1.0.
+ """
+
+ def __init__(self, temperature: float = 1.0, loss_weight=1.0) -> None:
+ super(InfoNCELoss, self).__init__()
+ assert temperature > 0, f'the argument `temperature` must be ' \
+ f'positive, but got {temperature}'
+ self.temp = temperature
+ self.loss_weight = loss_weight
+
+ def forward(self, features: torch.Tensor) -> torch.Tensor:
+ """Computes the InfoNCE loss.
+
+ Args:
+ features (Tensor): A tensor containing the feature
+ representations of different samples.
+
+ Returns:
+ Tensor: A tensor of shape (1,) containing the InfoNCE loss.
+ """
+ n = features.size(0)
+ features_norm = F.normalize(features, dim=1)
+ logits = features_norm.mm(features_norm.t()) / self.temp
+ targets = torch.arange(n, dtype=torch.long, device=features.device)
+ loss = F.cross_entropy(logits, targets, reduction='sum')
+ return loss * self.loss_weight
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/heatmap_loss.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/heatmap_loss.py
new file mode 100644
index 0000000000000000000000000000000000000000..5bf598cc8d86aa04a7c25af598a1ec5a72611709
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/heatmap_loss.py
@@ -0,0 +1,460 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from torch import Tensor
+
+from mmpose.registry import MODELS
+
+
+@MODELS.register_module()
+class KeypointMSELoss(nn.Module):
+ """MSE loss for heatmaps.
+
+ Args:
+ use_target_weight (bool): Option to use weighted MSE loss.
+ Different joint types may have different target weights.
+ Defaults to ``False``
+ skip_empty_channel (bool): If ``True``, heatmap channels with no
+ non-zero value (which means no visible ground-truth keypoint
+ in the image) will not be used to calculate the loss. Defaults to
+ ``False``
+ loss_weight (float): Weight of the loss. Defaults to 1.0
+ """
+
+ def __init__(self,
+ use_target_weight: bool = False,
+ skip_empty_channel: bool = False,
+ loss_weight: float = 1.):
+ super().__init__()
+ self.use_target_weight = use_target_weight
+ self.skip_empty_channel = skip_empty_channel
+ self.loss_weight = loss_weight
+
+ def forward(self,
+ output: Tensor,
+ target: Tensor,
+ target_weights: Optional[Tensor] = None,
+ mask: Optional[Tensor] = None) -> Tensor:
+ """Forward function of loss.
+
+ Note:
+ - batch_size: B
+ - num_keypoints: K
+ - heatmaps height: H
+ - heatmaps weight: W
+
+ Args:
+ output (Tensor): The output heatmaps with shape [B, K, H, W]
+ target (Tensor): The target heatmaps with shape [B, K, H, W]
+ target_weights (Tensor, optional): The target weights of differet
+ keypoints, with shape [B, K] (keypoint-wise) or
+ [B, K, H, W] (pixel-wise).
+ mask (Tensor, optional): The masks of valid heatmap pixels in
+ shape [B, K, H, W] or [B, 1, H, W]. If ``None``, no mask will
+ be applied. Defaults to ``None``
+
+ Returns:
+ Tensor: The calculated loss.
+ """
+
+ _mask = self._get_mask(target, target_weights, mask)
+ if _mask is None:
+ loss = F.mse_loss(output, target)
+ else:
+ _loss = F.mse_loss(output, target, reduction='none')
+ loss = (_loss * _mask).mean()
+
+ return loss * self.loss_weight
+
+ def _get_mask(self, target: Tensor, target_weights: Optional[Tensor],
+ mask: Optional[Tensor]) -> Optional[Tensor]:
+ """Generate the heatmap mask w.r.t. the given mask, target weight and
+ `skip_empty_channel` setting.
+
+ Returns:
+ Tensor: The mask in shape (B, K, *) or ``None`` if no mask is
+ needed.
+ """
+ # Given spatial mask
+ if mask is not None:
+ # check mask has matching type with target
+ assert (mask.ndim == target.ndim and all(
+ d_m == d_t or d_m == 1
+ for d_m, d_t in zip(mask.shape, target.shape))), (
+ f'mask and target have mismatched shapes {mask.shape} v.s.'
+ f'{target.shape}')
+
+ # Mask by target weights (keypoint-wise mask)
+ if target_weights is not None:
+ # check target weight has matching shape with target
+ assert (target_weights.ndim in (2, 4) and target_weights.shape
+ == target.shape[:target_weights.ndim]), (
+ 'target_weights and target have mismatched shapes '
+ f'{target_weights.shape} v.s. {target.shape}')
+
+ ndim_pad = target.ndim - target_weights.ndim
+ _mask = target_weights.view(target_weights.shape +
+ (1, ) * ndim_pad)
+
+ if mask is None:
+ mask = _mask
+ else:
+ mask = mask * _mask
+
+ # Mask by ``skip_empty_channel``
+ if self.skip_empty_channel:
+ _mask = (target != 0).flatten(2).any(dim=2)
+ ndim_pad = target.ndim - _mask.ndim
+ _mask = _mask.view(_mask.shape + (1, ) * ndim_pad)
+
+ if mask is None:
+ mask = _mask
+ else:
+ mask = mask * _mask
+
+ return mask
+
+
+@MODELS.register_module()
+class CombinedTargetMSELoss(nn.Module):
+ """MSE loss for combined target.
+
+ CombinedTarget: The combination of classification target
+ (response map) and regression target (offset map).
+ Paper ref: Huang et al. The Devil is in the Details: Delving into
+ Unbiased Data Processing for Human Pose Estimation (CVPR 2020).
+
+ Args:
+ use_target_weight (bool): Option to use weighted MSE loss.
+ Different joint types may have different target weights.
+ Defaults to ``False``
+ loss_weight (float): Weight of the loss. Defaults to 1.0
+ """
+
+ def __init__(self,
+ use_target_weight: bool = False,
+ loss_weight: float = 1.):
+ super().__init__()
+ self.criterion = nn.MSELoss(reduction='mean')
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+
+ def forward(self, output: Tensor, target: Tensor,
+ target_weights: Tensor) -> Tensor:
+ """Forward function of loss.
+
+ Note:
+ - batch_size: B
+ - num_channels: C
+ - heatmaps height: H
+ - heatmaps weight: W
+ - num_keypoints: K
+ Here, C = 3 * K
+
+ Args:
+ output (Tensor): The output feature maps with shape [B, C, H, W].
+ target (Tensor): The target feature maps with shape [B, C, H, W].
+ target_weights (Tensor): The target weights of differet keypoints,
+ with shape [B, K].
+
+ Returns:
+ Tensor: The calculated loss.
+ """
+ batch_size = output.size(0)
+ num_channels = output.size(1)
+ heatmaps_pred = output.reshape(
+ (batch_size, num_channels, -1)).split(1, 1)
+ heatmaps_gt = target.reshape(
+ (batch_size, num_channels, -1)).split(1, 1)
+ loss = 0.
+ num_joints = num_channels // 3
+ for idx in range(num_joints):
+ heatmap_pred = heatmaps_pred[idx * 3].squeeze()
+ heatmap_gt = heatmaps_gt[idx * 3].squeeze()
+ offset_x_pred = heatmaps_pred[idx * 3 + 1].squeeze()
+ offset_x_gt = heatmaps_gt[idx * 3 + 1].squeeze()
+ offset_y_pred = heatmaps_pred[idx * 3 + 2].squeeze()
+ offset_y_gt = heatmaps_gt[idx * 3 + 2].squeeze()
+ if self.use_target_weight:
+ target_weight = target_weights[:, idx, None]
+ heatmap_pred = heatmap_pred * target_weight
+ heatmap_gt = heatmap_gt * target_weight
+ # classification loss
+ loss += 0.5 * self.criterion(heatmap_pred, heatmap_gt)
+ # regression loss
+ loss += 0.5 * self.criterion(heatmap_gt * offset_x_pred,
+ heatmap_gt * offset_x_gt)
+ loss += 0.5 * self.criterion(heatmap_gt * offset_y_pred,
+ heatmap_gt * offset_y_gt)
+ return loss / num_joints * self.loss_weight
+
+
+@MODELS.register_module()
+class KeypointOHKMMSELoss(nn.Module):
+ """MSE loss with online hard keypoint mining.
+
+ Args:
+ use_target_weight (bool): Option to use weighted MSE loss.
+ Different joint types may have different target weights.
+ Defaults to ``False``
+ topk (int): Only top k joint losses are kept. Defaults to 8
+ loss_weight (float): Weight of the loss. Defaults to 1.0
+ """
+
+ def __init__(self,
+ use_target_weight: bool = False,
+ topk: int = 8,
+ loss_weight: float = 1.):
+ super().__init__()
+ assert topk > 0
+ self.criterion = nn.MSELoss(reduction='none')
+ self.use_target_weight = use_target_weight
+ self.topk = topk
+ self.loss_weight = loss_weight
+
+ def _ohkm(self, losses: Tensor) -> Tensor:
+ """Online hard keypoint mining.
+
+ Note:
+ - batch_size: B
+ - num_keypoints: K
+
+ Args:
+ loss (Tensor): The losses with shape [B, K]
+
+ Returns:
+ Tensor: The calculated loss.
+ """
+ ohkm_loss = 0.
+ B = losses.shape[0]
+ for i in range(B):
+ sub_loss = losses[i]
+ _, topk_idx = torch.topk(
+ sub_loss, k=self.topk, dim=0, sorted=False)
+ tmp_loss = torch.gather(sub_loss, 0, topk_idx)
+ ohkm_loss += torch.sum(tmp_loss) / self.topk
+ ohkm_loss /= B
+ return ohkm_loss
+
+ def forward(self, output: Tensor, target: Tensor,
+ target_weights: Tensor) -> Tensor:
+ """Forward function of loss.
+
+ Note:
+ - batch_size: B
+ - num_keypoints: K
+ - heatmaps height: H
+ - heatmaps weight: W
+
+ Args:
+ output (Tensor): The output heatmaps with shape [B, K, H, W].
+ target (Tensor): The target heatmaps with shape [B, K, H, W].
+ target_weights (Tensor): The target weights of differet keypoints,
+ with shape [B, K].
+
+ Returns:
+ Tensor: The calculated loss.
+ """
+ num_keypoints = output.size(1)
+ if num_keypoints < self.topk:
+ raise ValueError(f'topk ({self.topk}) should not be '
+ f'larger than num_keypoints ({num_keypoints}).')
+
+ losses = []
+ for idx in range(num_keypoints):
+ if self.use_target_weight:
+ target_weight = target_weights[:, idx, None, None]
+ losses.append(
+ self.criterion(output[:, idx] * target_weight,
+ target[:, idx] * target_weight))
+ else:
+ losses.append(self.criterion(output[:, idx], target[:, idx]))
+
+ losses = [loss.mean(dim=(1, 2)).unsqueeze(dim=1) for loss in losses]
+ losses = torch.cat(losses, dim=1)
+
+ return self._ohkm(losses) * self.loss_weight
+
+
+@MODELS.register_module()
+class AdaptiveWingLoss(nn.Module):
+ """Adaptive wing loss. paper ref: 'Adaptive Wing Loss for Robust Face
+ Alignment via Heatmap Regression' Wang et al. ICCV'2019.
+
+ Args:
+ alpha (float), omega (float), epsilon (float), theta (float)
+ are hyper-parameters.
+ use_target_weight (bool): Option to use weighted MSE loss.
+ Different joint types may have different target weights.
+ loss_weight (float): Weight of the loss. Default: 1.0.
+ """
+
+ def __init__(self,
+ alpha=2.1,
+ omega=14,
+ epsilon=1,
+ theta=0.5,
+ use_target_weight=False,
+ loss_weight=1.):
+ super().__init__()
+ self.alpha = float(alpha)
+ self.omega = float(omega)
+ self.epsilon = float(epsilon)
+ self.theta = float(theta)
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+
+ def criterion(self, pred, target):
+ """Criterion of wingloss.
+
+ Note:
+ batch_size: N
+ num_keypoints: K
+
+ Args:
+ pred (torch.Tensor[NxKxHxW]): Predicted heatmaps.
+ target (torch.Tensor[NxKxHxW]): Target heatmaps.
+ """
+ H, W = pred.shape[2:4]
+ delta = (target - pred).abs()
+
+ A = self.omega * (
+ 1 / (1 + torch.pow(self.theta / self.epsilon, self.alpha - target))
+ ) * (self.alpha - target) * (torch.pow(
+ self.theta / self.epsilon,
+ self.alpha - target - 1)) * (1 / self.epsilon)
+ C = self.theta * A - self.omega * torch.log(
+ 1 + torch.pow(self.theta / self.epsilon, self.alpha - target))
+
+ losses = torch.where(
+ delta < self.theta,
+ self.omega *
+ torch.log(1 +
+ torch.pow(delta / self.epsilon, self.alpha - target)),
+ A * delta - C)
+
+ return torch.mean(losses)
+
+ def forward(self,
+ output: Tensor,
+ target: Tensor,
+ target_weights: Optional[Tensor] = None):
+ """Forward function.
+
+ Note:
+ batch_size: N
+ num_keypoints: K
+
+ Args:
+ output (torch.Tensor[N, K, H, W]): Output heatmaps.
+ target (torch.Tensor[N, K, H, W]): Target heatmaps.
+ target_weight (torch.Tensor[N, K]):
+ Weights across different joint types.
+ """
+ if self.use_target_weight:
+ assert (target_weights.ndim in (2, 4) and target_weights.shape
+ == target.shape[:target_weights.ndim]), (
+ 'target_weights and target have mismatched shapes '
+ f'{target_weights.shape} v.s. {target.shape}')
+
+ ndim_pad = target.ndim - target_weights.ndim
+ target_weights = target_weights.view(target_weights.shape +
+ (1, ) * ndim_pad)
+ loss = self.criterion(output * target_weights,
+ target * target_weights)
+ else:
+ loss = self.criterion(output, target)
+
+ return loss * self.loss_weight
+
+
+@MODELS.register_module()
+class FocalHeatmapLoss(KeypointMSELoss):
+ """A class for calculating the modified focal loss for heatmap prediction.
+
+ This loss function is exactly the same as the one used in CornerNet. It
+ runs faster and costs a little bit more memory.
+
+ `CornerNet: Detecting Objects as Paired Keypoints
+ arXiv: `_.
+
+ Arguments:
+ alpha (int): The alpha parameter in the focal loss equation.
+ beta (int): The beta parameter in the focal loss equation.
+ use_target_weight (bool): Option to use weighted MSE loss.
+ Different joint types may have different target weights.
+ Defaults to ``False``
+ skip_empty_channel (bool): If ``True``, heatmap channels with no
+ non-zero value (which means no visible ground-truth keypoint
+ in the image) will not be used to calculate the loss. Defaults to
+ ``False``
+ loss_weight (float): Weight of the loss. Defaults to 1.0
+ """
+
+ def __init__(self,
+ alpha: int = 2,
+ beta: int = 4,
+ use_target_weight: bool = False,
+ skip_empty_channel: bool = False,
+ loss_weight: float = 1.0):
+ super(FocalHeatmapLoss, self).__init__(use_target_weight,
+ skip_empty_channel, loss_weight)
+ self.alpha = alpha
+ self.beta = beta
+
+ def forward(self,
+ output: Tensor,
+ target: Tensor,
+ target_weights: Optional[Tensor] = None,
+ mask: Optional[Tensor] = None) -> Tensor:
+ """Calculate the modified focal loss for heatmap prediction.
+
+ Note:
+ - batch_size: B
+ - num_keypoints: K
+ - heatmaps height: H
+ - heatmaps weight: W
+
+ Args:
+ output (Tensor): The output heatmaps with shape [B, K, H, W]
+ target (Tensor): The target heatmaps with shape [B, K, H, W]
+ target_weights (Tensor, optional): The target weights of differet
+ keypoints, with shape [B, K] (keypoint-wise) or
+ [B, K, H, W] (pixel-wise).
+ mask (Tensor, optional): The masks of valid heatmap pixels in
+ shape [B, K, H, W] or [B, 1, H, W]. If ``None``, no mask will
+ be applied. Defaults to ``None``
+
+ Returns:
+ Tensor: The calculated loss.
+ """
+ _mask = self._get_mask(target, target_weights, mask)
+
+ pos_inds = target.eq(1).float()
+ neg_inds = target.lt(1).float()
+
+ if _mask is not None:
+ pos_inds = pos_inds * _mask
+ neg_inds = neg_inds * _mask
+
+ neg_weights = torch.pow(1 - target, self.beta)
+
+ pos_loss = torch.log(output) * torch.pow(1 - output,
+ self.alpha) * pos_inds
+ neg_loss = torch.log(1 - output) * torch.pow(
+ output, self.alpha) * neg_weights * neg_inds
+
+ num_pos = pos_inds.float().sum()
+ if num_pos == 0:
+ loss = -neg_loss.sum()
+ else:
+ loss = -(pos_loss.sum() + neg_loss.sum()) / num_pos
+ return loss * self.loss_weight
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/loss_wrappers.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/loss_wrappers.py
new file mode 100644
index 0000000000000000000000000000000000000000..8f8f7f9d8f2c967e94112f60d312554e96413f9f
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/loss_wrappers.py
@@ -0,0 +1,87 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Dict
+
+import torch.nn as nn
+
+from mmpose.registry import MODELS
+from mmpose.utils.typing import ConfigType
+
+
+@MODELS.register_module()
+class MultipleLossWrapper(nn.Module):
+ """A wrapper to collect multiple loss functions together and return a list
+ of losses in the same order.
+
+ Args:
+ losses (list): List of Loss Config
+ """
+
+ def __init__(self, losses: list):
+ super().__init__()
+ self.num_losses = len(losses)
+
+ loss_modules = []
+ for loss_cfg in losses:
+ t_loss = MODELS.build(loss_cfg)
+ loss_modules.append(t_loss)
+ self.loss_modules = nn.ModuleList(loss_modules)
+
+ def forward(self, input_list, target_list, keypoint_weights=None):
+ """Forward function.
+
+ Note:
+ - batch_size: N
+ - num_keypoints: K
+ - dimension of keypoints: D (D=2 or D=3)
+
+ Args:
+ input_list (List[Tensor]): List of inputs.
+ target_list (List[Tensor]): List of targets.
+ keypoint_weights (Tensor[N, K, D]):
+ Weights across different joint types.
+ """
+ assert isinstance(input_list, list), ''
+ assert isinstance(target_list, list), ''
+ assert len(input_list) == len(target_list), ''
+
+ losses = []
+ for i in range(self.num_losses):
+ input_i = input_list[i]
+ target_i = target_list[i]
+
+ loss_i = self.loss_modules[i](input_i, target_i, keypoint_weights)
+ losses.append(loss_i)
+
+ return losses
+
+
+@MODELS.register_module()
+class CombinedLoss(nn.ModuleDict):
+ """A wrapper to combine multiple loss functions. These loss functions can
+ have different input type (e.g. heatmaps or regression values), and can
+ only be involed individually and explixitly.
+
+ Args:
+ losses (Dict[str, ConfigType]): The names and configs of loss
+ functions to be wrapped
+
+ Example::
+ >>> heatmap_loss_cfg = dict(type='KeypointMSELoss')
+ >>> ae_loss_cfg = dict(type='AssociativeEmbeddingLoss')
+ >>> loss_module = CombinedLoss(
+ ... losses=dict(
+ ... heatmap_loss=heatmap_loss_cfg,
+ ... ae_loss=ae_loss_cfg))
+ >>> loss_hm = loss_module.heatmap_loss(pred_heatmap, gt_heatmap)
+ >>> loss_ae = loss_module.ae_loss(pred_tags, keypoint_indices)
+ """
+
+ def __init__(self, losses: Dict[str, ConfigType]):
+ super().__init__()
+ for loss_name, loss_cfg in losses.items():
+ self.add_module(loss_name, MODELS.build(loss_cfg))
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/pose3d_loss.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/pose3d_loss.py
new file mode 100644
index 0000000000000000000000000000000000000000..008914fa24b21a9934a12f598c8fa087ae729c69
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/pose3d_loss.py
@@ -0,0 +1,233 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import math
+from functools import partial
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+
+from mmpose.registry import MODELS
+
+@MODELS.register_module()
+class Pose3d_RelativeDepth_Loss(nn.Module):
+ def __init__(self, use_target_weight=False, loss_weight=1., loss_name='loss_pose3d_rel_depth'):
+ super().__init__()
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+ self.loss_name = loss_name
+
+ def forward(self, output, target, target_weight=None, confidence=None):
+ """
+ output is B x num_keypoints
+ target is B x num_keypoints
+ target_weight is B x num_keypoints
+ confidence is B x num_keypoints
+ """
+ # Penalty for negative values # This is zero for positive values and |output| for negative values
+ negative_penalty = F.relu(-output) # B x num_keypoints
+
+ pred_max_Z = torch.max(output, dim=1, keepdim=True)[0] ## B x 1
+ pred_relative_Z = output / torch.clamp(pred_max_Z, min=1e-6) ## B x 308
+
+ gt_max_Z = torch.max(target, dim=1, keepdim=True)[0] ## B x 1
+ gt_relative_Z = target / torch.clamp(gt_max_Z, min=1e-6) ## B x 308
+
+ loss = F.l1_loss(pred_relative_Z, gt_relative_Z, reduction='none') ## B x 308
+
+ if confidence is not None:
+ loss = loss * confidence
+ negative_penalty = negative_penalty * confidence
+
+ if self.use_target_weight:
+ assert target_weight is not None
+ loss = loss * target_weight ## B x 308
+ loss = loss.sum() / target_weight.sum().clamp(min=1)
+
+ negative_penalty = negative_penalty * target_weight ## B x 308
+ negative_penalty = negative_penalty.sum() / target_weight.sum().clamp(min=1)
+ else:
+ loss = loss.mean()
+ negative_penalty = negative_penalty.mean()
+
+ return loss * self.loss_weight + negative_penalty * self.loss_weight
+
+@MODELS.register_module()
+class Pose3d_Pose2d_L1_Loss(nn.Module):
+ def __init__(self, use_target_weight=False, image_width=768, image_height=1024, loss_weight=1., loss_name='loss_pose3d_pose2d_l1'):
+ super().__init__()
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+ self.loss_name = loss_name
+ self.image_width = image_width
+ self.image_height = image_height
+
+ def forward(self, output, target, target_weight=None, confidence=None):
+ """
+ output is B x num_keypoints x 2
+ target is B x num_keypoints x 2
+ target_weight is B x num_keypoints
+ """
+ ## normalize coordinates to 0 to 1
+ output_normalized = torch.stack([
+ output[:, :, 0] / self.image_width, # x is 0 to 1
+ output[:, :, 1] / self.image_height # y is 0 to 1
+ ], dim=-1)
+
+ target_normalized = torch.stack([
+ target[:, :, 0] / self.image_width, # x is 0 to 1
+ target[:, :, 1] / self.image_height # y is 0 to 1
+ ], dim=-1)
+
+ loss = F.l1_loss(output_normalized, target_normalized, reduction='none') # B x num_keypoints x 2
+
+ if confidence is not None:
+ loss = loss * confidence.unsqueeze(-1)
+
+ if self.use_target_weight:
+ assert target_weight is not None
+ target_weight = target_weight.unsqueeze(-1) # B x num_keypoints x 1
+ loss = loss * target_weight ## B x 308
+ loss = loss.sum() / (target_weight.sum() * target.shape[-1]).clamp(min=1.0)
+ else:
+ loss = loss.mean()
+
+ return loss * self.loss_weight
+
+@MODELS.register_module()
+class Pose3d_Depth_L1_Loss(nn.Module):
+ def __init__(self, use_target_weight=False, loss_weight=1., loss_name='loss_pose3d_depth_l1'):
+ super().__init__()
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+ self.loss_name = loss_name
+
+ def forward(self, output, target, target_weight=None, confidence=None):
+ """
+ output is B x num_keypoints
+ target is B x num_keypoints
+ target_weight is B x num_keypoints
+ """
+ loss = F.l1_loss(output, target, reduction='none') ## B x num_keypoints
+
+ if confidence is not None:
+ loss = loss * confidence.unsqueeze(-1)
+
+ if self.use_target_weight:
+ assert target_weight is not None
+ loss = loss * target_weight # B x num_keypoints x 3
+ loss = loss.sum() / (target_weight.sum() * target.shape[-1]).clamp(min=1.0)
+ else:
+ loss = loss.mean()
+
+ return loss * self.loss_weight
+
+@MODELS.register_module()
+class Pose3d_L1_Loss(nn.Module):
+ def __init__(self, use_target_weight=False, loss_weight=1., loss_name='loss_pose3d_l1'):
+ super().__init__()
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+ self.loss_name = loss_name
+
+ def forward(self, output, target, target_weight=None, confidence=None):
+ """
+ output is B x num_keypoints x 3
+ target is B x num_keypoints x 3
+ target_weight is B x num_keypoints
+ """
+ loss = F.l1_loss(output, target, reduction='none') ## B x num_keypoints x 3
+
+ if confidence is not None:
+ loss = loss * confidence.unsqueeze(-1)
+
+ if self.use_target_weight:
+ assert target_weight is not None
+ target_weight = target_weight.unsqueeze(-1) # B x num_keypoints x 1
+ loss = loss * target_weight # B x num_keypoints x 3
+ loss = loss.sum() / (target_weight.sum() * target.shape[-1]).clamp(min=1.0)
+ else:
+ loss = loss.mean()
+
+ return loss * self.loss_weight
+
+@MODELS.register_module()
+class Pose3d_K_Loss(nn.Module):
+ def __init__(self, use_target_weight=False, image_width=768, image_height=1024, loss_weight=1., loss_name='loss_pose3d_K'):
+ super().__init__()
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+ self.loss_name = loss_name
+ self.image_width = image_width
+ self.image_height = image_height
+ return
+
+ def forward(self, output, target, target_weight=None, confidence=None):
+ """
+ output is B x num_keypoints x 4
+ target is B x num_keypoints x 4
+ target_weight is B x num_keypoints
+ """
+
+ # Normalize the output and target inline
+ output_normalized = torch.stack([
+ output[..., 0] / self.image_width, # fx
+ output[..., 1] / self.image_height, # fy
+ output[..., 2] / self.image_width, # cx
+ output[..., 3] / self.image_height # cy
+ ], dim=-1)
+
+ target_normalized = torch.stack([
+ target[..., 0] / self.image_width, # fx
+ target[..., 1] / self.image_height, # fy
+ target[..., 2] / self.image_width, # cx
+ target[..., 3] / self.image_height # cy
+ ], dim=-1)
+
+ # Compute the loss
+ loss = F.l1_loss(output_normalized, target_normalized, reduction='none') #
+
+ if confidence is not None:
+ loss = loss * confidence.unsqueeze(-1)
+
+ if self.use_target_weight:
+ assert target_weight is not None
+ target_weight = target_weight.unsqueeze(-1) # B x num_keypoints x 1
+ loss = loss * target_weight # B x num_keypoints x 4
+ loss = loss.sum() / (target_weight.sum() * target.shape[-1]).clamp(min=1.0)
+ else:
+ loss = loss.mean()
+
+ return loss * self.loss_weight
+
+
+@MODELS.register_module()
+class Pose3d_Confidence_Loss(nn.Module):
+ def __init__(self, use_target_weight=False, loss_weight=1., loss_name='loss_pose3d_confidence'):
+ super().__init__()
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+ self.loss_name = loss_name
+ return
+
+ def forward(self, confidence, target_weight=None):
+ """
+ confidence is B x num_keypoints
+ target_weight is B x num_keypoints
+ """
+
+ # Penalize low confidence predictions
+ loss = -torch.log(confidence + 1e-6) # Add small epsilon to prevent log(0)
+
+ if self.use_target_weight:
+ assert target_weight is not None
+ loss = loss * target_weight
+ loss = loss.sum() / target_weight.sum().clamp(min=1.0)
+ else:
+ loss = loss.mean()
+
+ return loss * self.loss_weight
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/regression_loss.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/regression_loss.py
new file mode 100644
index 0000000000000000000000000000000000000000..efaf5a90b2f2df0dc693a39a045da995930b9db9
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/losses/regression_loss.py
@@ -0,0 +1,620 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import math
+from functools import partial
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+
+from mmpose.registry import MODELS
+from ..utils.realnvp import RealNVP
+
+
+@MODELS.register_module()
+class RLELoss(nn.Module):
+ """RLE Loss.
+
+ `Human Pose Regression With Residual Log-Likelihood Estimation
+ arXiv: `_.
+
+ Code is modified from `the official implementation
+ `_.
+
+ Args:
+ use_target_weight (bool): Option to use weighted loss.
+ Different joint types may have different target weights.
+ size_average (bool): Option to average the loss by the batch_size.
+ residual (bool): Option to add L1 loss and let the flow
+ learn the residual error distribution.
+ q_dis (string): Option for the identity Q(error) distribution,
+ Options: "laplace" or "gaussian"
+ """
+
+ def __init__(self,
+ use_target_weight=False,
+ size_average=True,
+ residual=True,
+ q_distribution='laplace'):
+ super(RLELoss, self).__init__()
+ self.size_average = size_average
+ self.use_target_weight = use_target_weight
+ self.residual = residual
+ self.q_distribution = q_distribution
+
+ self.flow_model = RealNVP()
+
+ def forward(self, pred, sigma, target, target_weight=None):
+ """Forward function.
+
+ Note:
+ - batch_size: N
+ - num_keypoints: K
+ - dimension of keypoints: D (D=2 or D=3)
+
+ Args:
+ pred (Tensor[N, K, D]): Output regression.
+ sigma (Tensor[N, K, D]): Output sigma.
+ target (Tensor[N, K, D]): Target regression.
+ target_weight (Tensor[N, K, D]):
+ Weights across different joint types.
+ """
+ sigma = sigma.sigmoid()
+
+ error = (pred - target) / (sigma + 1e-9)
+ # (B, K, 2)
+ log_phi = self.flow_model.log_prob(error.reshape(-1, 2))
+ log_phi = log_phi.reshape(target.shape[0], target.shape[1], 1)
+ log_sigma = torch.log(sigma).reshape(target.shape[0], target.shape[1],
+ 2)
+ nf_loss = log_sigma - log_phi
+
+ if self.residual:
+ assert self.q_distribution in ['laplace', 'gaussian']
+ if self.q_distribution == 'laplace':
+ loss_q = torch.log(sigma * 2) + torch.abs(error)
+ else:
+ loss_q = torch.log(
+ sigma * math.sqrt(2 * math.pi)) + 0.5 * error**2
+
+ loss = nf_loss + loss_q
+ else:
+ loss = nf_loss
+
+ if self.use_target_weight:
+ assert target_weight is not None
+ loss *= target_weight
+
+ if self.size_average:
+ loss /= len(loss)
+
+ return loss.sum()
+
+
+@MODELS.register_module()
+class SmoothL1Loss(nn.Module):
+ """SmoothL1Loss loss.
+
+ Args:
+ use_target_weight (bool): Option to use weighted MSE loss.
+ Different joint types may have different target weights.
+ loss_weight (float): Weight of the loss. Default: 1.0.
+ """
+
+ def __init__(self, use_target_weight=False, loss_weight=1.):
+ super().__init__()
+ self.criterion = F.smooth_l1_loss
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+
+ def forward(self, output, target, target_weight=None):
+ """Forward function.
+
+ Note:
+ - batch_size: N
+ - num_keypoints: K
+ - dimension of keypoints: D (D=2 or D=3)
+
+ Args:
+ output (torch.Tensor[N, K, D]): Output regression.
+ target (torch.Tensor[N, K, D]): Target regression.
+ target_weight (torch.Tensor[N, K, D]):
+ Weights across different joint types.
+ """
+
+ if self.use_target_weight:
+ assert target_weight is not None
+ assert output.ndim >= target_weight.ndim
+
+ for i in range(output.ndim - target_weight.ndim):
+ target_weight = target_weight.unsqueeze(-1)
+
+ loss = self.criterion(output * target_weight,
+ target * target_weight)
+ else:
+ loss = self.criterion(output, target)
+
+ return loss * self.loss_weight
+
+
+@MODELS.register_module()
+class SoftWeightSmoothL1Loss(nn.Module):
+ """Smooth L1 loss with soft weight for regression.
+
+ Args:
+ use_target_weight (bool): Option to use weighted MSE loss.
+ Different joint types may have different target weights.
+ supervise_empty (bool): Whether to supervise the output with zero
+ weight.
+ beta (float): Specifies the threshold at which to change between
+ L1 and L2 loss.
+ loss_weight (float): Weight of the loss. Default: 1.0.
+ """
+
+ def __init__(self,
+ use_target_weight=False,
+ supervise_empty=True,
+ beta=1.0,
+ loss_weight=1.):
+ super().__init__()
+
+ reduction = 'none' if use_target_weight else 'mean'
+ self.criterion = partial(
+ self.smooth_l1_loss, reduction=reduction, beta=beta)
+
+ self.supervise_empty = supervise_empty
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+
+ @staticmethod
+ def smooth_l1_loss(input, target, reduction='none', beta=1.0):
+ """Re-implement torch.nn.functional.smooth_l1_loss with beta to support
+ pytorch <= 1.6."""
+ delta = input - target
+ mask = delta.abs() < beta
+ delta[mask] = (delta[mask]).pow(2) / (2 * beta)
+ delta[~mask] = delta[~mask].abs() - beta / 2
+
+ if reduction == 'mean':
+ return delta.mean()
+ elif reduction == 'sum':
+ return delta.sum()
+ elif reduction == 'none':
+ return delta
+ else:
+ raise ValueError(f'reduction must be \'mean\', \'sum\' or '
+ f'\'none\', but got \'{reduction}\'')
+
+ def forward(self, output, target, target_weight=None):
+ """Forward function.
+
+ Note:
+ - batch_size: N
+ - num_keypoints: K
+ - dimension of keypoints: D (D=2 or D=3)
+
+ Args:
+ output (torch.Tensor[N, K, D]): Output regression.
+ target (torch.Tensor[N, K, D]): Target regression.
+ target_weight (torch.Tensor[N, K, D]):
+ Weights across different joint types.
+ """
+ if self.use_target_weight:
+ assert target_weight is not None
+ assert output.ndim >= target_weight.ndim
+
+ for i in range(output.ndim - target_weight.ndim):
+ target_weight = target_weight.unsqueeze(-1)
+
+ loss = self.criterion(output, target) * target_weight
+ if self.supervise_empty:
+ loss = loss.mean()
+ else:
+ num_elements = torch.nonzero(target_weight > 0).size()[0]
+ loss = loss.sum() / max(num_elements, 1.0)
+ else:
+ loss = self.criterion(output, target)
+
+ return loss * self.loss_weight
+
+
+@MODELS.register_module()
+class WingLoss(nn.Module):
+ """Wing Loss. paper ref: 'Wing Loss for Robust Facial Landmark Localisation
+ with Convolutional Neural Networks' Feng et al. CVPR'2018.
+
+ Args:
+ omega (float): Also referred to as width.
+ epsilon (float): Also referred to as curvature.
+ use_target_weight (bool): Option to use weighted MSE loss.
+ Different joint types may have different target weights.
+ loss_weight (float): Weight of the loss. Default: 1.0.
+ """
+
+ def __init__(self,
+ omega=10.0,
+ epsilon=2.0,
+ use_target_weight=False,
+ loss_weight=1.):
+ super().__init__()
+ self.omega = omega
+ self.epsilon = epsilon
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+
+ # constant that smoothly links the piecewise-defined linear
+ # and nonlinear parts
+ self.C = self.omega * (1.0 - math.log(1.0 + self.omega / self.epsilon))
+
+ def criterion(self, pred, target):
+ """Criterion of wingloss.
+
+ Note:
+ - batch_size: N
+ - num_keypoints: K
+ - dimension of keypoints: D (D=2 or D=3)
+
+ Args:
+ pred (torch.Tensor[N, K, D]): Output regression.
+ target (torch.Tensor[N, K, D]): Target regression.
+ """
+ delta = (target - pred).abs()
+ losses = torch.where(
+ delta < self.omega,
+ self.omega * torch.log(1.0 + delta / self.epsilon), delta - self.C)
+ return torch.mean(torch.sum(losses, dim=[1, 2]), dim=0)
+
+ def forward(self, output, target, target_weight=None):
+ """Forward function.
+
+ Note:
+ - batch_size: N
+ - num_keypoints: K
+ - dimension of keypoints: D (D=2 or D=3)
+
+ Args:
+ output (torch.Tensor[N, K, D]): Output regression.
+ target (torch.Tensor[N, K, D]): Target regression.
+ target_weight (torch.Tensor[N,K,D]):
+ Weights across different joint types.
+ """
+ if self.use_target_weight:
+ assert target_weight is not None
+ loss = self.criterion(output * target_weight,
+ target * target_weight)
+ else:
+ loss = self.criterion(output, target)
+
+ return loss * self.loss_weight
+
+
+@MODELS.register_module()
+class SoftWingLoss(nn.Module):
+ """Soft Wing Loss 'Structure-Coherent Deep Feature Learning for Robust Face
+ Alignment' Lin et al. TIP'2021.
+
+ loss =
+ 1. |x| , if |x| < omega1
+ 2. omega2*ln(1+|x|/epsilon) + B, if |x| >= omega1
+
+ Args:
+ omega1 (float): The first threshold.
+ omega2 (float): The second threshold.
+ epsilon (float): Also referred to as curvature.
+ use_target_weight (bool): Option to use weighted MSE loss.
+ Different joint types may have different target weights.
+ loss_weight (float): Weight of the loss. Default: 1.0.
+ """
+
+ def __init__(self,
+ omega1=2.0,
+ omega2=20.0,
+ epsilon=0.5,
+ use_target_weight=False,
+ loss_weight=1.):
+ super().__init__()
+ self.omega1 = omega1
+ self.omega2 = omega2
+ self.epsilon = epsilon
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+
+ # constant that smoothly links the piecewise-defined linear
+ # and nonlinear parts
+ self.B = self.omega1 - self.omega2 * math.log(1.0 + self.omega1 /
+ self.epsilon)
+
+ def criterion(self, pred, target):
+ """Criterion of wingloss.
+
+ Note:
+ batch_size: N
+ num_keypoints: K
+ dimension of keypoints: D (D=2 or D=3)
+
+ Args:
+ pred (torch.Tensor[N, K, D]): Output regression.
+ target (torch.Tensor[N, K, D]): Target regression.
+ """
+ delta = (target - pred).abs()
+ losses = torch.where(
+ delta < self.omega1, delta,
+ self.omega2 * torch.log(1.0 + delta / self.epsilon) + self.B)
+ return torch.mean(torch.sum(losses, dim=[1, 2]), dim=0)
+
+ def forward(self, output, target, target_weight=None):
+ """Forward function.
+
+ Note:
+ batch_size: N
+ num_keypoints: K
+ dimension of keypoints: D (D=2 or D=3)
+
+ Args:
+ output (torch.Tensor[N, K, D]): Output regression.
+ target (torch.Tensor[N, K, D]): Target regression.
+ target_weight (torch.Tensor[N, K, D]):
+ Weights across different joint types.
+ """
+ if self.use_target_weight:
+ assert target_weight is not None
+ loss = self.criterion(output * target_weight,
+ target * target_weight)
+ else:
+ loss = self.criterion(output, target)
+
+ return loss * self.loss_weight
+
+
+@MODELS.register_module()
+class MPJPELoss(nn.Module):
+ """MPJPE (Mean Per Joint Position Error) loss.
+
+ Args:
+ use_target_weight (bool): Option to use weighted MSE loss.
+ Different joint types may have different target weights.
+ loss_weight (float): Weight of the loss. Default: 1.0.
+ """
+
+ def __init__(self, use_target_weight=False, loss_weight=1.):
+ super().__init__()
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+
+ def forward(self, output, target, target_weight=None):
+ """Forward function.
+
+ Note:
+ - batch_size: N
+ - num_keypoints: K
+ - dimension of keypoints: D (D=2 or D=3)
+
+ Args:
+ output (torch.Tensor[N, K, D]): Output regression.
+ target (torch.Tensor[N, K, D]): Target regression.
+ target_weight (torch.Tensor[N,K,D]):
+ Weights across different joint types.
+ """
+ if self.use_target_weight:
+ assert target_weight is not None
+ loss = torch.mean(torch.norm((output - target) * target_weight, dim=-1))
+ else:
+ loss = torch.mean(torch.norm(output - target, dim=-1))
+
+ return loss * self.loss_weight
+
+@MODELS.register_module()
+class L1Loss(nn.Module):
+ """L1Loss loss ."""
+
+ def __init__(self, use_target_weight=False, loss_weight=1.):
+ super().__init__()
+ self.criterion = F.l1_loss
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+
+ def forward(self, output, target, target_weight=None):
+ """Forward function.
+
+ Note:
+ - batch_size: N
+ - num_keypoints: K
+
+ Args:
+ output (torch.Tensor[N, K, 2]): Output regression.
+ target (torch.Tensor[N, K, 2]): Target regression.
+ target_weight (torch.Tensor[N, K, 2]):
+ Weights across different joint types.
+ """
+ if self.use_target_weight:
+ assert target_weight is not None
+ loss = self.criterion(output * target_weight,
+ target * target_weight)
+ else:
+ loss = self.criterion(output, target)
+
+ return loss * self.loss_weight
+
+
+@MODELS.register_module()
+class MSELoss(nn.Module):
+ """MSE loss for coordinate regression."""
+
+ def __init__(self, use_target_weight=False, loss_weight=1.):
+ super().__init__()
+ self.criterion = F.mse_loss
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+
+ def forward(self, output, target, target_weight=None):
+ """Forward function.
+
+ Note:
+ - batch_size: N
+ - num_keypoints: K
+
+ Args:
+ output (torch.Tensor[N, K, 2]): Output regression.
+ target (torch.Tensor[N, K, 2]): Target regression.
+ target_weight (torch.Tensor[N, K, 2]):
+ Weights across different joint types.
+ """
+
+ if self.use_target_weight:
+ assert target_weight is not None
+ loss = self.criterion(output * target_weight,
+ target * target_weight)
+ else:
+ loss = self.criterion(output, target)
+
+ return loss * self.loss_weight
+
+
+@MODELS.register_module()
+class BoneLoss(nn.Module):
+ """Bone length loss.
+
+ Args:
+ joint_parents (list): Indices of each joint's parent joint.
+ use_target_weight (bool): Option to use weighted bone loss.
+ Different bone types may have different target weights.
+ loss_weight (float): Weight of the loss. Default: 1.0.
+ """
+
+ def __init__(self, joint_parents, use_target_weight=False, loss_weight=1.):
+ super().__init__()
+ self.joint_parents = joint_parents
+ self.use_target_weight = use_target_weight
+ self.loss_weight = loss_weight
+
+ self.non_root_indices = []
+ for i in range(len(self.joint_parents)):
+ if i != self.joint_parents[i]:
+ self.non_root_indices.append(i)
+
+ def forward(self, output, target, target_weight=None):
+ """Forward function.
+
+ Note:
+ - batch_size: N
+ - num_keypoints: K
+ - dimension of keypoints: D (D=2 or D=3)
+
+ Args:
+ output (torch.Tensor[N, K, D]): Output regression.
+ target (torch.Tensor[N, K, D]): Target regression.
+ target_weight (torch.Tensor[N, K-1]):
+ Weights across different bone types.
+ """
+ output_bone = torch.norm(
+ output - output[:, self.joint_parents, :],
+ dim=-1)[:, self.non_root_indices]
+ target_bone = torch.norm(
+ target - target[:, self.joint_parents, :],
+ dim=-1)[:, self.non_root_indices]
+ if self.use_target_weight:
+ assert target_weight is not None
+ loss = torch.mean(
+ torch.abs((output_bone * target_weight).mean(dim=0) -
+ (target_bone * target_weight).mean(dim=0)))
+ else:
+ loss = torch.mean(
+ torch.abs(output_bone.mean(dim=0) - target_bone.mean(dim=0)))
+
+ return loss * self.loss_weight
+
+
+@MODELS.register_module()
+class SemiSupervisionLoss(nn.Module):
+ """Semi-supervision loss for unlabeled data. It is composed of projection
+ loss and bone loss.
+
+ Paper ref: `3D human pose estimation in video with temporal convolutions
+ and semi-supervised training` Dario Pavllo et al. CVPR'2019.
+
+ Args:
+ joint_parents (list): Indices of each joint's parent joint.
+ projection_loss_weight (float): Weight for projection loss.
+ bone_loss_weight (float): Weight for bone loss.
+ warmup_iterations (int): Number of warmup iterations. In the first
+ `warmup_iterations` iterations, the model is trained only on
+ labeled data, and semi-supervision loss will be 0.
+ This is a workaround since currently we cannot access
+ epoch number in loss functions. Note that the iteration number in
+ an epoch can be changed due to different GPU numbers in multi-GPU
+ settings. So please set this parameter carefully.
+ warmup_iterations = dataset_size // samples_per_gpu // gpu_num
+ * warmup_epochs
+ """
+
+ def __init__(self,
+ joint_parents,
+ projection_loss_weight=1.,
+ bone_loss_weight=1.,
+ warmup_iterations=0):
+ super().__init__()
+ self.criterion_projection = MPJPELoss(
+ loss_weight=projection_loss_weight)
+ self.criterion_bone = BoneLoss(
+ joint_parents, loss_weight=bone_loss_weight)
+ self.warmup_iterations = warmup_iterations
+ self.num_iterations = 0
+
+ @staticmethod
+ def project_joints(x, intrinsics):
+ """Project 3D joint coordinates to 2D image plane using camera
+ intrinsic parameters.
+
+ Args:
+ x (torch.Tensor[N, K, 3]): 3D joint coordinates.
+ intrinsics (torch.Tensor[N, 4] | torch.Tensor[N, 9]): Camera
+ intrinsics: f (2), c (2), k (3), p (2).
+ """
+ while intrinsics.dim() < x.dim():
+ intrinsics.unsqueeze_(1)
+ f = intrinsics[..., :2]
+ c = intrinsics[..., 2:4]
+ _x = torch.clamp(x[:, :, :2] / x[:, :, 2:], -1, 1)
+ if intrinsics.shape[-1] == 9:
+ k = intrinsics[..., 4:7]
+ p = intrinsics[..., 7:9]
+
+ r2 = torch.sum(_x[:, :, :2]**2, dim=-1, keepdim=True)
+ radial = 1 + torch.sum(
+ k * torch.cat((r2, r2**2, r2**3), dim=-1),
+ dim=-1,
+ keepdim=True)
+ tan = torch.sum(p * _x, dim=-1, keepdim=True)
+ _x = _x * (radial + tan) + p * r2
+ _x = f * _x + c
+ return _x
+
+ def forward(self, output, target):
+ losses = dict()
+
+ self.num_iterations += 1
+ if self.num_iterations <= self.warmup_iterations:
+ return losses
+
+ labeled_pose = output['labeled_pose']
+ unlabeled_pose = output['unlabeled_pose']
+ unlabeled_traj = output['unlabeled_traj']
+ unlabeled_target_2d = target['unlabeled_target_2d']
+ intrinsics = target['intrinsics']
+
+ # projection loss
+ unlabeled_output = unlabeled_pose + unlabeled_traj
+ unlabeled_output_2d = self.project_joints(unlabeled_output, intrinsics)
+ loss_proj = self.criterion_projection(unlabeled_output_2d,
+ unlabeled_target_2d, None)
+ losses['proj_loss'] = loss_proj
+
+ # bone loss
+ loss_bone = self.criterion_bone(unlabeled_pose, labeled_pose, None)
+ losses['bone_loss'] = loss_bone
+
+ return losses
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e7d04c0a8a7067e72fc1f9a7400b0eea0e2531da
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__init__.py
@@ -0,0 +1,14 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .fmap_proc_neck import FeatureMapProcessor
+from .fpn import FPN
+from .gap_neck import GlobalAveragePooling
+from .posewarper_neck import PoseWarperNeck
+
+__all__ = [
+ 'GlobalAveragePooling', 'PoseWarperNeck', 'FPN', 'FeatureMapProcessor'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8e4c5dc5ea1dc05cc00f0659cab7737eb514bf20
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__pycache__/fmap_proc_neck.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__pycache__/fmap_proc_neck.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..45fde49f9e19f3a932e4099c08f3b3ac9803cf4a
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__pycache__/fmap_proc_neck.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__pycache__/fpn.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__pycache__/fpn.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cb828e23e0c8f02eb9ed1679023bf7aa18073962
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__pycache__/fpn.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__pycache__/gap_neck.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__pycache__/gap_neck.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a4a14687e36e9d6cc2287aba55b381253662ee71
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__pycache__/gap_neck.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__pycache__/posewarper_neck.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__pycache__/posewarper_neck.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d3157fc0c2aca712813d88f97e58c0eb72380efb
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/__pycache__/posewarper_neck.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/fmap_proc_neck.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/fmap_proc_neck.py
new file mode 100644
index 0000000000000000000000000000000000000000..4037654e2d4064d1c2df23e3b65d3ce4860ffc8c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/fmap_proc_neck.py
@@ -0,0 +1,106 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import List, Optional, Sequence, Tuple, Union
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from torch import Tensor
+
+from mmpose.models.utils.ops import resize
+from mmpose.registry import MODELS
+
+
+@MODELS.register_module()
+class FeatureMapProcessor(nn.Module):
+ """A PyTorch module for selecting, concatenating, and rescaling feature
+ maps.
+
+ Args:
+ select_index (Optional[Union[int, Tuple[int]]], optional): Index or
+ indices of feature maps to select. Defaults to None, which means
+ all feature maps are used.
+ concat (bool, optional): Whether to concatenate the selected feature
+ maps. Defaults to False.
+ scale_factor (float, optional): The scaling factor to apply to the
+ feature maps. Defaults to 1.0.
+ apply_relu (bool, optional): Whether to apply ReLU on input feature
+ maps. Defaults to False.
+ align_corners (bool, optional): Whether to align corners when resizing
+ the feature maps. Defaults to False.
+ """
+
+ def __init__(
+ self,
+ select_index: Optional[Union[int, Tuple[int]]] = None,
+ concat: bool = False,
+ scale_factor: float = 1.0,
+ apply_relu: bool = False,
+ align_corners: bool = False,
+ ):
+ super().__init__()
+
+ if isinstance(select_index, int):
+ select_index = (select_index, )
+ self.select_index = select_index
+ self.concat = concat
+
+ assert (
+ scale_factor > 0
+ ), f'the argument `scale_factor` must be positive, ' \
+ f'but got {scale_factor}'
+ self.scale_factor = scale_factor
+ self.apply_relu = apply_relu
+ self.align_corners = align_corners
+
+ def forward(self, inputs: Union[Tensor, Sequence[Tensor]]
+ ) -> Union[Tensor, List[Tensor]]:
+
+ if not isinstance(inputs, (tuple, list)):
+ sequential_input = False
+ inputs = [inputs]
+ else:
+ sequential_input = True
+
+ if self.select_index is not None:
+ inputs = [inputs[i] for i in self.select_index]
+
+ if self.concat:
+ inputs = self._concat(inputs)
+
+ if self.apply_relu:
+ inputs = [F.relu(x) for x in inputs]
+
+ if self.scale_factor != 1.0:
+ inputs = self._rescale(inputs)
+
+ if not sequential_input:
+ inputs = inputs[0]
+
+ return inputs
+
+ def _concat(self, inputs: Sequence[Tensor]) -> List[Tensor]:
+ size = inputs[0].shape[-2:]
+ resized_inputs = [
+ resize(
+ x,
+ size=size,
+ mode='bilinear',
+ align_corners=self.align_corners) for x in inputs
+ ]
+ return [torch.cat(resized_inputs, dim=1)]
+
+ def _rescale(self, inputs: Sequence[Tensor]) -> List[Tensor]:
+ rescaled_inputs = [
+ resize(
+ x,
+ scale_factor=self.scale_factor,
+ mode='bilinear',
+ align_corners=self.align_corners,
+ ) for x in inputs
+ ]
+ return rescaled_inputs
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/fpn.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/fpn.py
new file mode 100644
index 0000000000000000000000000000000000000000..0d39fb622bd52c6a9fd5826e9b50ecbcd1236717
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/fpn.py
@@ -0,0 +1,211 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import torch.nn as nn
+import torch.nn.functional as F
+from mmcv.cnn import ConvModule
+from mmengine.model import xavier_init
+
+from mmpose.registry import MODELS
+
+
+@MODELS.register_module()
+class FPN(nn.Module):
+ r"""Feature Pyramid Network.
+
+ This is an implementation of paper `Feature Pyramid Networks for Object
+ Detection `_.
+
+ Args:
+ in_channels (list[int]): Number of input channels per scale.
+ out_channels (int): Number of output channels (used at each scale).
+ num_outs (int): Number of output scales.
+ start_level (int): Index of the start input backbone level used to
+ build the feature pyramid. Default: 0.
+ end_level (int): Index of the end input backbone level (exclusive) to
+ build the feature pyramid. Default: -1, which means the last level.
+ add_extra_convs (bool | str): If bool, it decides whether to add conv
+ layers on top of the original feature maps. Default to False.
+ If True, it is equivalent to `add_extra_convs='on_input'`.
+ If str, it specifies the source feature map of the extra convs.
+ Only the following options are allowed
+
+ - 'on_input': Last feat map of neck inputs (i.e. backbone feature).
+ - 'on_lateral': Last feature map after lateral convs.
+ - 'on_output': The last output feature map after fpn convs.
+ relu_before_extra_convs (bool): Whether to apply relu before the extra
+ conv. Default: False.
+ no_norm_on_lateral (bool): Whether to apply norm on lateral.
+ Default: False.
+ conv_cfg (dict): Config dict for convolution layer. Default: None.
+ norm_cfg (dict): Config dict for normalization layer. Default: None.
+ act_cfg (dict): Config dict for activation layer in ConvModule.
+ Default: None.
+ upsample_cfg (dict): Config dict for interpolate layer.
+ Default: dict(mode='nearest').
+
+ Example:
+ >>> import torch
+ >>> in_channels = [2, 3, 5, 7]
+ >>> scales = [340, 170, 84, 43]
+ >>> inputs = [torch.rand(1, c, s, s)
+ ... for c, s in zip(in_channels, scales)]
+ >>> self = FPN(in_channels, 11, len(in_channels)).eval()
+ >>> outputs = self.forward(inputs)
+ >>> for i in range(len(outputs)):
+ ... print(f'outputs[{i}].shape = {outputs[i].shape}')
+ outputs[0].shape = torch.Size([1, 11, 340, 340])
+ outputs[1].shape = torch.Size([1, 11, 170, 170])
+ outputs[2].shape = torch.Size([1, 11, 84, 84])
+ outputs[3].shape = torch.Size([1, 11, 43, 43])
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ num_outs,
+ start_level=0,
+ end_level=-1,
+ add_extra_convs=False,
+ relu_before_extra_convs=False,
+ no_norm_on_lateral=False,
+ conv_cfg=None,
+ norm_cfg=None,
+ act_cfg=None,
+ upsample_cfg=dict(mode='nearest')):
+ super().__init__()
+ assert isinstance(in_channels, list)
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+ self.num_ins = len(in_channels)
+ self.num_outs = num_outs
+ self.relu_before_extra_convs = relu_before_extra_convs
+ self.no_norm_on_lateral = no_norm_on_lateral
+ self.fp16_enabled = False
+ self.upsample_cfg = upsample_cfg.copy()
+
+ if end_level == -1 or end_level == self.num_ins - 1:
+ self.backbone_end_level = self.num_ins
+ assert num_outs >= self.num_ins - start_level
+ else:
+ # if end_level is not the last level, no extra level is allowed
+ self.backbone_end_level = end_level + 1
+ assert end_level < self.num_ins
+ assert num_outs == end_level - start_level + 1
+ self.start_level = start_level
+ self.end_level = end_level
+ self.add_extra_convs = add_extra_convs
+ assert isinstance(add_extra_convs, (str, bool))
+ if isinstance(add_extra_convs, str):
+ # Extra_convs_source choices: 'on_input', 'on_lateral', 'on_output'
+ assert add_extra_convs in ('on_input', 'on_lateral', 'on_output')
+ elif add_extra_convs: # True
+ self.add_extra_convs = 'on_input'
+
+ self.lateral_convs = nn.ModuleList()
+ self.fpn_convs = nn.ModuleList()
+
+ for i in range(self.start_level, self.backbone_end_level):
+ l_conv = ConvModule(
+ in_channels[i],
+ out_channels,
+ 1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg if not self.no_norm_on_lateral else None,
+ act_cfg=act_cfg,
+ inplace=False)
+ fpn_conv = ConvModule(
+ out_channels,
+ out_channels,
+ 3,
+ padding=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg,
+ inplace=False)
+
+ self.lateral_convs.append(l_conv)
+ self.fpn_convs.append(fpn_conv)
+
+ # add extra conv layers (e.g., RetinaNet)
+ extra_levels = num_outs - self.backbone_end_level + self.start_level
+ if self.add_extra_convs and extra_levels >= 1:
+ for i in range(extra_levels):
+ if i == 0 and self.add_extra_convs == 'on_input':
+ in_channels = self.in_channels[self.backbone_end_level - 1]
+ else:
+ in_channels = out_channels
+ extra_fpn_conv = ConvModule(
+ in_channels,
+ out_channels,
+ 3,
+ stride=2,
+ padding=1,
+ conv_cfg=conv_cfg,
+ norm_cfg=norm_cfg,
+ act_cfg=act_cfg,
+ inplace=False)
+ self.fpn_convs.append(extra_fpn_conv)
+
+ def init_weights(self):
+ """Initialize model weights."""
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ xavier_init(m, distribution='uniform')
+
+ def forward(self, inputs):
+ """Forward function."""
+ assert len(inputs) == len(self.in_channels)
+
+ # build laterals
+ laterals = [
+ lateral_conv(inputs[i + self.start_level])
+ for i, lateral_conv in enumerate(self.lateral_convs)
+ ]
+
+ # build top-down path
+ used_backbone_levels = len(laterals)
+ for i in range(used_backbone_levels - 1, 0, -1):
+ # In some cases, fixing `scale factor` (e.g. 2) is preferred, but
+ # it cannot co-exist with `size` in `F.interpolate`.
+ if 'scale_factor' in self.upsample_cfg:
+ # fix runtime error of "+=" inplace operation in PyTorch 1.10
+ laterals[i - 1] = laterals[i - 1] + F.interpolate(
+ laterals[i], **self.upsample_cfg)
+ else:
+ prev_shape = laterals[i - 1].shape[2:]
+ laterals[i - 1] = laterals[i - 1] + F.interpolate(
+ laterals[i], size=prev_shape, **self.upsample_cfg)
+
+ # build outputs
+ # part 1: from original levels
+ outs = [
+ self.fpn_convs[i](laterals[i]) for i in range(used_backbone_levels)
+ ]
+ # part 2: add extra levels
+ if self.num_outs > len(outs):
+ # use max pool to get more levels on top of outputs
+ # (e.g., Faster R-CNN, Mask R-CNN)
+ if not self.add_extra_convs:
+ for i in range(self.num_outs - used_backbone_levels):
+ outs.append(F.max_pool2d(outs[-1], 1, stride=2))
+ # add conv layers on top of original feature maps (RetinaNet)
+ else:
+ if self.add_extra_convs == 'on_input':
+ extra_source = inputs[self.backbone_end_level - 1]
+ elif self.add_extra_convs == 'on_lateral':
+ extra_source = laterals[-1]
+ elif self.add_extra_convs == 'on_output':
+ extra_source = outs[-1]
+ else:
+ raise NotImplementedError
+ outs.append(self.fpn_convs[used_backbone_levels](extra_source))
+ for i in range(used_backbone_levels + 1, self.num_outs):
+ if self.relu_before_extra_convs:
+ outs.append(self.fpn_convs[i](F.relu(outs[-1])))
+ else:
+ outs.append(self.fpn_convs[i](outs[-1]))
+ return outs
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/gap_neck.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/gap_neck.py
new file mode 100644
index 0000000000000000000000000000000000000000..bd45e777e7f3bf36a61ddbb9a553a9de44c6999a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/gap_neck.py
@@ -0,0 +1,44 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import torch
+import torch.nn as nn
+
+from mmpose.registry import MODELS
+
+
+@MODELS.register_module()
+class GlobalAveragePooling(nn.Module):
+ """Global Average Pooling neck.
+
+ Note that we use `view` to remove extra channel after pooling. We do not
+ use `squeeze` as it will also remove the batch dimension when the tensor
+ has a batch dimension of size 1, which can lead to unexpected errors.
+ """
+
+ def __init__(self):
+ super().__init__()
+ self.gap = nn.AdaptiveAvgPool2d((1, 1))
+
+ def init_weights(self):
+ pass
+
+ def forward(self, inputs):
+ """Forward function."""
+
+ if isinstance(inputs, tuple):
+ outs = tuple([self.gap(x) for x in inputs])
+ outs = tuple(
+ [out.view(x.size(0), -1) for out, x in zip(outs, inputs)])
+ elif isinstance(inputs, list):
+ outs = [self.gap(x) for x in inputs]
+ outs = [out.view(x.size(0), -1) for out, x in zip(outs, inputs)]
+ elif isinstance(inputs, torch.Tensor):
+ outs = self.gap(inputs)
+ outs = outs.view(inputs.size(0), -1)
+ else:
+ raise TypeError('neck inputs should be tuple or torch.tensor')
+ return outs
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/posewarper_neck.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/posewarper_neck.py
new file mode 100644
index 0000000000000000000000000000000000000000..fccca888624d834d84384bda84e249c2af74e4b0
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/necks/posewarper_neck.py
@@ -0,0 +1,334 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import mmcv
+import torch
+import torch.nn as nn
+from mmcv.cnn import build_conv_layer, build_norm_layer
+from mmengine.model import constant_init, normal_init
+from mmengine.utils import digit_version
+from torch.nn.modules.batchnorm import _BatchNorm
+
+from mmpose.models.utils.ops import resize
+from mmpose.registry import MODELS
+from ..backbones.resnet import BasicBlock, Bottleneck
+
+try:
+ from mmcv.ops import DeformConv2d
+ has_mmcv_full = True
+except (ImportError, ModuleNotFoundError):
+ has_mmcv_full = False
+
+
+@MODELS.register_module()
+class PoseWarperNeck(nn.Module):
+ """PoseWarper neck.
+
+ `"Learning temporal pose estimation from sparsely-labeled videos"
+ `_.
+
+ Args:
+ in_channels (int): Number of input channels from backbone
+ out_channels (int): Number of output channels
+ inner_channels (int): Number of intermediate channels of the res block
+ deform_groups (int): Number of groups in the deformable conv
+ dilations (list|tuple): different dilations of the offset conv layers
+ trans_conv_kernel (int): the kernel of the trans conv layer, which is
+ used to get heatmap from the output of backbone. Default: 1
+ res_blocks_cfg (dict|None): config of residual blocks. If None,
+ use the default values. If not None, it should contain the
+ following keys:
+
+ - block (str): the type of residual block, Default: 'BASIC'.
+ - num_blocks (int): the number of blocks, Default: 20.
+
+ offsets_kernel (int): the kernel of offset conv layer.
+ deform_conv_kernel (int): the kernel of defomrable conv layer.
+ in_index (int|Sequence[int]): Input feature index. Default: 0
+ input_transform (str|None): Transformation type of input features.
+ Options: 'resize_concat', 'multiple_select', None.
+ Default: None.
+
+ - 'resize_concat': Multiple feature maps will be resize to \
+ the same size as first one and than concat together. \
+ Usually used in FCN head of HRNet.
+ - 'multiple_select': Multiple feature maps will be bundle into \
+ a list and passed into decode head.
+ - None: Only one select feature map is allowed.
+
+ freeze_trans_layer (bool): Whether to freeze the transition layer
+ (stop grad and set eval mode). Default: True.
+ norm_eval (bool): Whether to set norm layers to eval mode, namely,
+ freeze running stats (mean and var). Note: Effect on Batch Norm
+ and its variants only. Default: False.
+ im2col_step (int): the argument `im2col_step` in deformable conv,
+ Default: 80.
+ """
+ blocks_dict = {'BASIC': BasicBlock, 'BOTTLENECK': Bottleneck}
+ minimum_mmcv_version = '1.3.17'
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ inner_channels,
+ deform_groups=17,
+ dilations=(3, 6, 12, 18, 24),
+ trans_conv_kernel=1,
+ res_blocks_cfg=None,
+ offsets_kernel=3,
+ deform_conv_kernel=3,
+ in_index=0,
+ input_transform=None,
+ freeze_trans_layer=True,
+ norm_eval=False,
+ im2col_step=80):
+ super().__init__()
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+ self.inner_channels = inner_channels
+ self.deform_groups = deform_groups
+ self.dilations = dilations
+ self.trans_conv_kernel = trans_conv_kernel
+ self.res_blocks_cfg = res_blocks_cfg
+ self.offsets_kernel = offsets_kernel
+ self.deform_conv_kernel = deform_conv_kernel
+ self.in_index = in_index
+ self.input_transform = input_transform
+ self.freeze_trans_layer = freeze_trans_layer
+ self.norm_eval = norm_eval
+ self.im2col_step = im2col_step
+
+ identity_trans_layer = False
+
+ assert trans_conv_kernel in [0, 1, 3]
+ kernel_size = trans_conv_kernel
+ if kernel_size == 3:
+ padding = 1
+ elif kernel_size == 1:
+ padding = 0
+ else:
+ # 0 for Identity mapping.
+ identity_trans_layer = True
+
+ if identity_trans_layer:
+ self.trans_layer = nn.Identity()
+ else:
+ self.trans_layer = build_conv_layer(
+ cfg=dict(type='Conv2d'),
+ in_channels=in_channels,
+ out_channels=out_channels,
+ kernel_size=kernel_size,
+ stride=1,
+ padding=padding)
+
+ # build chain of residual blocks
+ if res_blocks_cfg is not None and not isinstance(res_blocks_cfg, dict):
+ raise TypeError('res_blocks_cfg should be dict or None.')
+
+ if res_blocks_cfg is None:
+ block_type = 'BASIC'
+ num_blocks = 20
+ else:
+ block_type = res_blocks_cfg.get('block', 'BASIC')
+ num_blocks = res_blocks_cfg.get('num_blocks', 20)
+
+ block = self.blocks_dict[block_type]
+
+ res_layers = []
+ downsample = nn.Sequential(
+ build_conv_layer(
+ cfg=dict(type='Conv2d'),
+ in_channels=out_channels,
+ out_channels=inner_channels,
+ kernel_size=1,
+ stride=1,
+ bias=False),
+ build_norm_layer(dict(type='BN'), inner_channels)[1])
+ res_layers.append(
+ block(
+ in_channels=out_channels,
+ out_channels=inner_channels,
+ downsample=downsample))
+
+ for _ in range(1, num_blocks):
+ res_layers.append(block(inner_channels, inner_channels))
+ self.offset_feats = nn.Sequential(*res_layers)
+
+ # build offset layers
+ self.num_offset_layers = len(dilations)
+ assert self.num_offset_layers > 0, 'Number of offset layers ' \
+ 'should be larger than 0.'
+
+ target_offset_channels = 2 * offsets_kernel**2 * deform_groups
+
+ offset_layers = [
+ build_conv_layer(
+ cfg=dict(type='Conv2d'),
+ in_channels=inner_channels,
+ out_channels=target_offset_channels,
+ kernel_size=offsets_kernel,
+ stride=1,
+ dilation=dilations[i],
+ padding=dilations[i],
+ bias=False,
+ ) for i in range(self.num_offset_layers)
+ ]
+ self.offset_layers = nn.ModuleList(offset_layers)
+
+ # build deformable conv layers
+ assert digit_version(mmcv.__version__) >= \
+ digit_version(self.minimum_mmcv_version), \
+ f'Current MMCV version: {mmcv.__version__}, ' \
+ f'but MMCV >= {self.minimum_mmcv_version} is required, see ' \
+ f'https://github.com/open-mmlab/mmcv/issues/1440, ' \
+ f'Please install the latest MMCV.'
+
+ if has_mmcv_full:
+ deform_conv_layers = [
+ DeformConv2d(
+ in_channels=out_channels,
+ out_channels=out_channels,
+ kernel_size=deform_conv_kernel,
+ stride=1,
+ padding=int(deform_conv_kernel / 2) * dilations[i],
+ dilation=dilations[i],
+ deform_groups=deform_groups,
+ im2col_step=self.im2col_step,
+ ) for i in range(self.num_offset_layers)
+ ]
+ else:
+ raise ImportError('Please install the full version of mmcv '
+ 'to use `DeformConv2d`.')
+
+ self.deform_conv_layers = nn.ModuleList(deform_conv_layers)
+
+ self.freeze_layers()
+
+ def freeze_layers(self):
+ if self.freeze_trans_layer:
+ self.trans_layer.eval()
+
+ for param in self.trans_layer.parameters():
+ param.requires_grad = False
+
+ def init_weights(self):
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ normal_init(m, std=0.001)
+ elif isinstance(m, (_BatchNorm, nn.GroupNorm)):
+ constant_init(m, 1)
+ elif isinstance(m, DeformConv2d):
+ filler = torch.zeros([
+ m.weight.size(0),
+ m.weight.size(1),
+ m.weight.size(2),
+ m.weight.size(3)
+ ],
+ dtype=torch.float32,
+ device=m.weight.device)
+ for k in range(m.weight.size(0)):
+ filler[k, k,
+ int(m.weight.size(2) / 2),
+ int(m.weight.size(3) / 2)] = 1.0
+ m.weight = torch.nn.Parameter(filler)
+ m.weight.requires_grad = True
+
+ # posewarper offset layer weight initialization
+ for m in self.offset_layers.modules():
+ constant_init(m, 0)
+
+ def _transform_inputs(self, inputs):
+ """Transform inputs for decoder.
+
+ Args:
+ inputs (list[Tensor] | Tensor): multi-level img features.
+
+ Returns:
+ Tensor: The transformed inputs
+ """
+ if not isinstance(inputs, list):
+ return inputs
+
+ if self.input_transform == 'resize_concat':
+ inputs = [inputs[i] for i in self.in_index]
+ upsampled_inputs = [
+ resize(
+ input=x,
+ size=inputs[0].shape[2:],
+ mode='bilinear',
+ align_corners=self.align_corners) for x in inputs
+ ]
+ inputs = torch.cat(upsampled_inputs, dim=1)
+ elif self.input_transform == 'multiple_select':
+ inputs = [inputs[i] for i in self.in_index]
+ else:
+ inputs = inputs[self.in_index]
+
+ return inputs
+
+ def forward(self, inputs, frame_weight):
+ assert isinstance(inputs, (list, tuple)), 'PoseWarperNeck inputs ' \
+ 'should be list or tuple, even though the length is 1, ' \
+ 'for unified processing.'
+
+ output_heatmap = 0
+ if len(inputs) > 1:
+ inputs = [self._transform_inputs(input) for input in inputs]
+ inputs = [self.trans_layer(input) for input in inputs]
+
+ # calculate difference features
+ diff_features = [
+ self.offset_feats(inputs[0] - input) for input in inputs
+ ]
+
+ for i in range(len(inputs)):
+ if frame_weight[i] == 0:
+ continue
+ warped_heatmap = 0
+ for j in range(self.num_offset_layers):
+ offset = (self.offset_layers[j](diff_features[i]))
+ warped_heatmap_tmp = self.deform_conv_layers[j](inputs[i],
+ offset)
+ warped_heatmap += warped_heatmap_tmp / \
+ self.num_offset_layers
+
+ output_heatmap += warped_heatmap * frame_weight[i]
+
+ else:
+ inputs = inputs[0]
+ inputs = self._transform_inputs(inputs)
+ inputs = self.trans_layer(inputs)
+
+ num_frames = len(frame_weight)
+ batch_size = inputs.size(0) // num_frames
+ ref_x = inputs[:batch_size]
+ ref_x_tiled = ref_x.repeat(num_frames, 1, 1, 1)
+
+ offset_features = self.offset_feats(ref_x_tiled - inputs)
+
+ warped_heatmap = 0
+ for j in range(self.num_offset_layers):
+ offset = self.offset_layers[j](offset_features)
+
+ warped_heatmap_tmp = self.deform_conv_layers[j](inputs, offset)
+ warped_heatmap += warped_heatmap_tmp / self.num_offset_layers
+
+ for i in range(num_frames):
+ if frame_weight[i] == 0:
+ continue
+ output_heatmap += warped_heatmap[i * batch_size:(i + 1) *
+ batch_size] * frame_weight[i]
+
+ return output_heatmap
+
+ def train(self, mode=True):
+ """Convert the model into training mode."""
+ super().train(mode)
+ self.freeze_layers()
+ if mode and self.norm_eval:
+ for m in self.modules():
+ if isinstance(m, _BatchNorm):
+ m.eval()
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..56bedf3b8b690562cde73b1fe4f39456357c8c1f
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__init__.py
@@ -0,0 +1,12 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .bottomup import BottomupPoseEstimator
+from .pose_lifter import PoseLifter
+from .topdown import TopdownPoseEstimator
+from .topdown3d import Pose3dTopdownEstimator
+
+__all__ = ['TopdownPoseEstimator', 'BottomupPoseEstimator', 'PoseLifter', 'Pose3dTopdownEstimator']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a5d69b21e40b7c1cd908fd220fcc03bb3f321ec1
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/base.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/base.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4c7a0c09f12f104c9f2c8eb375f5e06d97650140
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/base.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/bottomup.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/bottomup.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f756068404c9576661f76a213d305868f1275580
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/bottomup.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/pose_lifter.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/pose_lifter.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..56096d8d944b1b835aa2bb4e6509841a5d3ba250
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/pose_lifter.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/topdown.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/topdown.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..91e3bc4eec24d8078875027ed5fc550158778da2
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/topdown.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/topdown3d.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/topdown3d.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..87dfe2703453297993406c0a7500469de70aaf72
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/__pycache__/topdown3d.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/base.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/base.py
new file mode 100644
index 0000000000000000000000000000000000000000..594d144e97a7010477309e097905578a9bfd0ca9
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/base.py
@@ -0,0 +1,216 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from abc import ABCMeta, abstractmethod
+from typing import Tuple, Union
+
+import torch
+from mmengine.model import BaseModel
+from torch import Tensor
+
+from mmpose.datasets.datasets.utils import parse_pose_metainfo
+from mmpose.models.utils import check_and_update_config
+from mmpose.registry import MODELS
+from mmpose.utils.typing import (ConfigType, ForwardResults, OptConfigType,
+ Optional, OptMultiConfig, OptSampleList,
+ SampleList)
+
+class BasePoseEstimator(BaseModel, metaclass=ABCMeta):
+ """Base class for pose estimators.
+
+ Args:
+ data_preprocessor (dict | ConfigDict, optional): The pre-processing
+ config of :class:`BaseDataPreprocessor`. Defaults to ``None``
+ init_cfg (dict | ConfigDict): The model initialization config.
+ Defaults to ``None``
+ metainfo (dict): Meta information for dataset, such as keypoints
+ definition and properties. If set, the metainfo of the input data
+ batch will be overridden. For more details, please refer to
+ https://mmpose.readthedocs.io/en/latest/user_guides/
+ prepare_datasets.html#create-a-custom-dataset-info-
+ config-file-for-the-dataset. Defaults to ``None``
+ """
+ _version = 2
+
+ def __init__(self,
+ backbone: ConfigType,
+ neck: OptConfigType = None,
+ head: OptConfigType = None,
+ train_cfg: OptConfigType = None,
+ test_cfg: OptConfigType = None,
+ data_preprocessor: OptConfigType = None,
+ init_cfg: OptMultiConfig = None,
+ metainfo: Optional[dict] = None):
+ super().__init__(
+ data_preprocessor=data_preprocessor, init_cfg=init_cfg)
+ self.metainfo = self._load_metainfo(metainfo)
+
+ self.backbone = MODELS.build(backbone)
+
+ # the PR #2108 and #2126 modified the interface of neck and head.
+ # The following function automatically detects outdated
+ # configurations and updates them accordingly, while also providing
+ # clear and concise information on the changes made.
+ neck, head = check_and_update_config(neck, head)
+
+ if neck is not None:
+ self.neck = MODELS.build(neck)
+
+ if head is not None:
+ self.head = MODELS.build(head)
+
+ self.train_cfg = train_cfg if train_cfg else {}
+ self.test_cfg = test_cfg if test_cfg else {}
+
+ # Register the hook to automatically convert old version state dicts
+ self._register_load_state_dict_pre_hook(self._load_state_dict_pre_hook)
+
+ @property
+ def with_neck(self) -> bool:
+ """bool: whether the pose estimator has a neck."""
+ return hasattr(self, 'neck') and self.neck is not None
+
+ @property
+ def with_head(self) -> bool:
+ """bool: whether the pose estimator has a head."""
+ return hasattr(self, 'head') and self.head is not None
+
+ @staticmethod
+ def _load_metainfo(metainfo: dict = None) -> dict:
+ """Collect meta information from the dictionary of meta.
+
+ Args:
+ metainfo (dict): Raw data of pose meta information.
+
+ Returns:
+ dict: Parsed meta information.
+ """
+
+ if metainfo is None:
+ return None
+
+ if not isinstance(metainfo, dict):
+ raise TypeError(
+ f'metainfo should be a dict, but got {type(metainfo)}')
+
+ metainfo = parse_pose_metainfo(metainfo)
+ return metainfo
+
+ def forward(self,
+ inputs: torch.Tensor,
+ data_samples: OptSampleList = None,
+ mode: str = 'tensor') -> ForwardResults:
+ """The unified entry for a forward process in both training and test.
+
+ The method should accept three modes: 'tensor', 'predict' and 'loss':
+
+ - 'tensor': Forward the whole network and return tensor or tuple of
+ tensor without any post-processing, same as a common nn.Module.
+ - 'predict': Forward and return the predictions, which are fully
+ processed to a list of :obj:`PoseDataSample`.
+ - 'loss': Forward and return a dict of losses according to the given
+ inputs and data samples.
+
+ Note that this method doesn't handle neither back propagation nor
+ optimizer updating, which are done in the :meth:`train_step`.
+
+ Args:
+ inputs (torch.Tensor): The input tensor with shape
+ (N, C, ...) in general
+ data_samples (list[:obj:`PoseDataSample`], optional): The
+ annotation of every sample. Defaults to ``None``
+ mode (str): Set the forward mode and return value type. Defaults
+ to ``'tensor'``
+
+ Returns:
+ The return type depends on ``mode``.
+
+ - If ``mode='tensor'``, return a tensor or a tuple of tensors
+ - If ``mode='predict'``, return a list of :obj:``PoseDataSample``
+ that contains the pose predictions
+ - If ``mode='loss'``, return a dict of tensor(s) which is the loss
+ function value
+ """
+ if isinstance(inputs, list):
+ inputs = torch.stack(inputs)
+ if mode == 'loss':
+ return self.loss(inputs, data_samples)
+ elif mode == 'predict':
+ # use customed metainfo to override the default metainfo
+ if self.metainfo is not None:
+ for data_sample in data_samples:
+ data_sample.set_metainfo(self.metainfo)
+ return self.predict(inputs, data_samples)
+ elif mode == 'tensor':
+ return self._forward(inputs)
+ else:
+ raise RuntimeError(f'Invalid mode "{mode}". '
+ 'Only supports loss, predict and tensor mode.')
+
+ @abstractmethod
+ def loss(self, inputs: Tensor, data_samples: SampleList) -> dict:
+ """Calculate losses from a batch of inputs and data samples."""
+
+ @abstractmethod
+ def predict(self, inputs: Tensor, data_samples: SampleList) -> SampleList:
+ """Predict results from a batch of inputs and data samples with post-
+ processing."""
+
+ def _forward(self,
+ inputs: Tensor,
+ data_samples: OptSampleList = None
+ ) -> Union[Tensor, Tuple[Tensor]]:
+ """Network forward process. Usually includes backbone, neck and head
+ forward without any post-processing.
+
+ Args:
+ inputs (Tensor): Inputs with shape (N, C, H, W).
+
+ Returns:
+ Union[Tensor | Tuple[Tensor]]: forward output of the network.
+ """
+
+ x = self.extract_feat(inputs)
+ if self.with_head:
+ x = self.head.forward(x)
+
+ return x
+
+ def extract_feat(self, inputs: Tensor) -> Tuple[Tensor]:
+ """Extract features.
+
+ Args:
+ inputs (Tensor): Image tensor with shape (N, C, H ,W).
+
+ Returns:
+ tuple[Tensor]: Multi-level features that may have various
+ resolutions.
+ """
+ x = self.backbone(inputs)
+ if self.with_neck:
+ x = self.neck(x)
+
+ return x
+
+ def _load_state_dict_pre_hook(self, state_dict, prefix, local_meta, *args,
+ **kwargs):
+ """A hook function to convert old-version state dict of
+ :class:`TopdownHeatmapSimpleHead` (before MMPose v1.0.0) to a
+ compatible format of :class:`HeatmapHead`.
+
+ The hook will be automatically registered during initialization.
+ """
+ version = local_meta.get('version', None)
+ if version and version >= self._version:
+ return
+
+ # convert old-version state dict
+ keys = list(state_dict.keys())
+ for k in keys:
+ if 'keypoint_head' in k:
+ v = state_dict.pop(k)
+ k = k.replace('keypoint_head', 'head')
+ state_dict[k] = v
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/bottomup.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/bottomup.py
new file mode 100644
index 0000000000000000000000000000000000000000..fd2c4bd2a1a07c2de1d736c3d617d8253152128e
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/bottomup.py
@@ -0,0 +1,183 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from itertools import zip_longest
+from typing import List, Optional, Union
+
+from mmengine.utils import is_list_of
+from torch import Tensor
+
+from mmpose.registry import MODELS
+from mmpose.utils.typing import (ConfigType, InstanceList, OptConfigType,
+ OptMultiConfig, PixelDataList, SampleList)
+from .base import BasePoseEstimator
+
+
+@MODELS.register_module()
+class BottomupPoseEstimator(BasePoseEstimator):
+ """Base class for bottom-up pose estimators.
+
+ Args:
+ backbone (dict): The backbone config
+ neck (dict, optional): The neck config. Defaults to ``None``
+ head (dict, optional): The head config. Defaults to ``None``
+ train_cfg (dict, optional): The runtime config for training process.
+ Defaults to ``None``
+ test_cfg (dict, optional): The runtime config for testing process.
+ Defaults to ``None``
+ data_preprocessor (dict, optional): The data preprocessing config to
+ build the instance of :class:`BaseDataPreprocessor`. Defaults to
+ ``None``.
+ init_cfg (dict, optional): The config to control the initialization.
+ Defaults to ``None``
+ """
+
+ def __init__(self,
+ backbone: ConfigType,
+ neck: OptConfigType = None,
+ head: OptConfigType = None,
+ train_cfg: OptConfigType = None,
+ test_cfg: OptConfigType = None,
+ data_preprocessor: OptConfigType = None,
+ init_cfg: OptMultiConfig = None):
+ super().__init__(
+ backbone=backbone,
+ neck=neck,
+ head=head,
+ train_cfg=train_cfg,
+ test_cfg=test_cfg,
+ data_preprocessor=data_preprocessor,
+ init_cfg=init_cfg)
+
+ def loss(self, inputs: Tensor, data_samples: SampleList) -> dict:
+ """Calculate losses from a batch of inputs and data samples.
+
+ Args:
+ inputs (Tensor): Inputs with shape (N, C, H, W).
+ data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples.
+
+ Returns:
+ dict: A dictionary of losses.
+ """
+ feats = self.extract_feat(inputs)
+
+ losses = dict()
+
+ if self.with_head:
+ losses.update(
+ self.head.loss(feats, data_samples, train_cfg=self.train_cfg))
+
+ return losses
+
+ def predict(self, inputs: Union[Tensor, List[Tensor]],
+ data_samples: SampleList) -> SampleList:
+ """Predict results from a batch of inputs and data samples with post-
+ processing.
+
+ Args:
+ inputs (Tensor | List[Tensor]): Input image in tensor or image
+ pyramid as a list of tensors. Each tensor is in shape
+ [B, C, H, W]
+ data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+
+ Returns:
+ list[:obj:`PoseDataSample`]: The pose estimation results of the
+ input images. The return value is `PoseDataSample` instances with
+ ``pred_instances`` and ``pred_fields``(optional) field , and
+ ``pred_instances`` usually contains the following keys:
+
+ - keypoints (Tensor): predicted keypoint coordinates in shape
+ (num_instances, K, D) where K is the keypoint number and D
+ is the keypoint dimension
+ - keypoint_scores (Tensor): predicted keypoint scores in shape
+ (num_instances, K)
+ """
+ assert self.with_head, (
+ 'The model must have head to perform prediction.')
+
+ multiscale_test = self.test_cfg.get('multiscale_test', False)
+ flip_test = self.test_cfg.get('flip_test', False)
+
+ # enable multi-scale test
+ aug_scales = data_samples[0].metainfo.get('aug_scales', None)
+ if multiscale_test:
+ assert isinstance(aug_scales, list)
+ assert is_list_of(inputs, Tensor)
+ # `inputs` includes images in original and augmented scales
+ assert len(inputs) == len(aug_scales) + 1
+ else:
+ assert isinstance(inputs, Tensor)
+ # single-scale test
+ inputs = [inputs]
+
+ feats = []
+ for _inputs in inputs:
+ if flip_test:
+ _feats_orig = self.extract_feat(_inputs)
+ _feats_flip = self.extract_feat(_inputs.flip(-1))
+ _feats = [_feats_orig, _feats_flip]
+ else:
+ _feats = self.extract_feat(_inputs)
+
+ feats.append(_feats)
+
+ if not multiscale_test:
+ feats = feats[0]
+
+ preds = self.head.predict(feats, data_samples, test_cfg=self.test_cfg)
+
+ if isinstance(preds, tuple):
+ batch_pred_instances, batch_pred_fields = preds
+ else:
+ batch_pred_instances = preds
+ batch_pred_fields = None
+
+ results = self.add_pred_to_datasample(batch_pred_instances,
+ batch_pred_fields, data_samples)
+
+ return results
+
+ def add_pred_to_datasample(self, batch_pred_instances: InstanceList,
+ batch_pred_fields: Optional[PixelDataList],
+ batch_data_samples: SampleList) -> SampleList:
+ """Add predictions into data samples.
+
+ Args:
+ batch_pred_instances (List[InstanceData]): The predicted instances
+ of the input data batch
+ batch_pred_fields (List[PixelData], optional): The predicted
+ fields (e.g. heatmaps) of the input batch
+ batch_data_samples (List[PoseDataSample]): The input data batch
+
+ Returns:
+ List[PoseDataSample]: A list of data samples where the predictions
+ are stored in the ``pred_instances`` field of each data sample.
+ The length of the list is the batch size when ``merge==False``, or
+ 1 when ``merge==True``.
+ """
+ assert len(batch_pred_instances) == len(batch_data_samples)
+ if batch_pred_fields is None:
+ batch_pred_fields = []
+
+ for pred_instances, pred_fields, data_sample in zip_longest(
+ batch_pred_instances, batch_pred_fields, batch_data_samples):
+
+ # convert keypoint coordinates from input space to image space
+ input_size = data_sample.metainfo['input_size']
+ input_center = data_sample.metainfo['input_center']
+ input_scale = data_sample.metainfo['input_scale']
+
+ pred_instances.keypoints = pred_instances.keypoints / input_size \
+ * input_scale + input_center - 0.5 * input_scale
+
+ data_sample.pred_instances = pred_instances
+
+ if pred_fields is not None:
+ data_sample.pred_fields = pred_fields
+
+ return batch_data_samples
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/pose_lifter.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/pose_lifter.py
new file mode 100644
index 0000000000000000000000000000000000000000..ced61cd578efafa46f4ed2b1c3690e97eace850a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/pose_lifter.py
@@ -0,0 +1,345 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from itertools import zip_longest
+from typing import Tuple, Union
+
+from torch import Tensor
+
+from mmpose.models.utils import check_and_update_config
+from mmpose.registry import MODELS
+from mmpose.utils.typing import (ConfigType, InstanceList, OptConfigType,
+ Optional, OptMultiConfig, OptSampleList,
+ PixelDataList, SampleList)
+from .base import BasePoseEstimator
+
+
+@MODELS.register_module()
+class PoseLifter(BasePoseEstimator):
+ """Base class for pose lifter.
+
+ Args:
+ backbone (dict): The backbone config
+ neck (dict, optional): The neck config. Defaults to ``None``
+ head (dict, optional): The head config. Defaults to ``None``
+ traj_backbone (dict, optional): The backbone config for trajectory
+ model. Defaults to ``None``
+ traj_neck (dict, optional): The neck config for trajectory model.
+ Defaults to ``None``
+ traj_head (dict, optional): The head config for trajectory model.
+ Defaults to ``None``
+ semi_loss (dict, optional): The semi-supervised loss config.
+ Defaults to ``None``
+ train_cfg (dict, optional): The runtime config for training process.
+ Defaults to ``None``
+ test_cfg (dict, optional): The runtime config for testing process.
+ Defaults to ``None``
+ data_preprocessor (dict, optional): The data preprocessing config to
+ build the instance of :class:`BaseDataPreprocessor`. Defaults to
+ ``None``
+ init_cfg (dict, optional): The config to control the initialization.
+ Defaults to ``None``
+ metainfo (dict): Meta information for dataset, such as keypoints
+ definition and properties. If set, the metainfo of the input data
+ batch will be overridden. For more details, please refer to
+ https://mmpose.readthedocs.io/en/latest/user_guides/
+ prepare_datasets.html#create-a-custom-dataset-info-
+ config-file-for-the-dataset. Defaults to ``None``
+ """
+
+ def __init__(self,
+ backbone: ConfigType,
+ neck: OptConfigType = None,
+ head: OptConfigType = None,
+ traj_backbone: OptConfigType = None,
+ traj_neck: OptConfigType = None,
+ traj_head: OptConfigType = None,
+ semi_loss: OptConfigType = None,
+ train_cfg: OptConfigType = None,
+ test_cfg: OptConfigType = None,
+ data_preprocessor: OptConfigType = None,
+ init_cfg: OptMultiConfig = None,
+ metainfo: Optional[dict] = None):
+ super().__init__(
+ backbone=backbone,
+ neck=neck,
+ head=head,
+ train_cfg=train_cfg,
+ test_cfg=test_cfg,
+ data_preprocessor=data_preprocessor,
+ init_cfg=init_cfg,
+ metainfo=metainfo)
+
+ # trajectory model
+ self.share_backbone = False
+ if traj_head is not None:
+ if traj_backbone is not None:
+ self.traj_backbone = MODELS.build(traj_backbone)
+ else:
+ self.share_backbone = True
+
+ # the PR #2108 and #2126 modified the interface of neck and head.
+ # The following function automatically detects outdated
+ # configurations and updates them accordingly, while also providing
+ # clear and concise information on the changes made.
+ traj_neck, traj_head = check_and_update_config(
+ traj_neck, traj_head)
+
+ if traj_neck is not None:
+ self.traj_neck = MODELS.build(traj_neck)
+
+ self.traj_head = MODELS.build(traj_head)
+
+ # semi-supervised loss
+ self.semi_supervised = semi_loss is not None
+ if self.semi_supervised:
+ assert any([head, traj_head])
+ self.semi_loss = MODELS.build(semi_loss)
+
+ @property
+ def with_traj_backbone(self):
+ """bool: Whether the pose lifter has trajectory backbone."""
+ return hasattr(self, 'traj_backbone') and \
+ self.traj_backbone is not None
+
+ @property
+ def with_traj_neck(self):
+ """bool: Whether the pose lifter has trajectory neck."""
+ return hasattr(self, 'traj_neck') and self.traj_neck is not None
+
+ @property
+ def with_traj(self):
+ """bool: Whether the pose lifter has trajectory head."""
+ return hasattr(self, 'traj_head')
+
+ @property
+ def causal(self):
+ """bool: Whether the pose lifter is causal."""
+ if hasattr(self.backbone, 'causal'):
+ return self.backbone.causal
+ else:
+ raise AttributeError('A PoseLifter\'s backbone should have '
+ 'the bool attribute "causal" to indicate if'
+ 'it performs causal inference.')
+
+ def extract_feat(self, inputs: Tensor) -> Tuple[Tensor]:
+ """Extract features.
+
+ Args:
+ inputs (Tensor): Image tensor with shape (N, K, C, T).
+
+ Returns:
+ tuple[Tensor]: Multi-level features that may have various
+ resolutions.
+ """
+ # supervised learning
+ # pose model
+ feats = self.backbone(inputs)
+ if self.with_neck:
+ feats = self.neck(feats)
+
+ # trajectory model
+ if self.with_traj:
+ if self.share_backbone:
+ traj_x = feats
+ else:
+ traj_x = self.traj_backbone(inputs)
+
+ if self.with_traj_neck:
+ traj_x = self.traj_neck(traj_x)
+ return feats, traj_x
+ else:
+ return feats
+
+ def _forward(self,
+ inputs: Tensor,
+ data_samples: OptSampleList = None
+ ) -> Union[Tensor, Tuple[Tensor]]:
+ """Network forward process. Usually includes backbone, neck and head
+ forward without any post-processing.
+
+ Args:
+ inputs (Tensor): Inputs with shape (N, K, C, T).
+
+ Returns:
+ Union[Tensor | Tuple[Tensor]]: forward output of the network.
+ """
+ feats = self.extract_feat(inputs)
+
+ if self.with_traj:
+ # forward with trajectory model
+ x, traj_x = feats
+ if self.with_head:
+ x = self.head.forward(x)
+
+ traj_x = self.traj_head.forward(traj_x)
+ return x, traj_x
+ else:
+ # forward without trajectory model
+ x = feats
+ if self.with_head:
+ x = self.head.forward(x)
+ return x
+
+ def loss(self, inputs: Tensor, data_samples: SampleList) -> dict:
+ """Calculate losses from a batch of inputs and data samples.
+
+ Args:
+ inputs (Tensor): Inputs with shape (N, K, C, T).
+ data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples.
+
+ Returns:
+ dict: A dictionary of losses.
+ """
+ feats = self.extract_feat(inputs)
+
+ losses = {}
+
+ if self.with_traj:
+ x, traj_x = feats
+ # loss of trajectory model
+ losses.update(
+ self.traj_head.loss(
+ traj_x, data_samples, train_cfg=self.train_cfg))
+ else:
+ x = feats
+
+ if self.with_head:
+ # loss of pose model
+ losses.update(
+ self.head.loss(x, data_samples, train_cfg=self.train_cfg))
+
+ # TODO: support semi-supervised learning
+ if self.semi_supervised:
+ losses.update(semi_loss=self.semi_loss(inputs, data_samples))
+
+ return losses
+
+ def predict(self, inputs: Tensor, data_samples: SampleList) -> SampleList:
+ """Predict results from a batch of inputs and data samples with post-
+ processing.
+
+ Note:
+ - batch_size: B
+ - num_input_keypoints: K
+ - input_keypoint_dim: C
+ - input_sequence_len: T
+
+ Args:
+ inputs (Tensor): Inputs with shape like (B, K, C, T).
+ data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+
+ Returns:
+ list[:obj:`PoseDataSample`]: The pose estimation results of the
+ input images. The return value is `PoseDataSample` instances with
+ ``pred_instances`` and ``pred_fields``(optional) field , and
+ ``pred_instances`` usually contains the following keys:
+
+ - keypoints (Tensor): predicted keypoint coordinates in shape
+ (num_instances, K, D) where K is the keypoint number and D
+ is the keypoint dimension
+ - keypoint_scores (Tensor): predicted keypoint scores in shape
+ (num_instances, K)
+ """
+ assert self.with_head, (
+ 'The model must have head to perform prediction.')
+
+ feats = self.extract_feat(inputs)
+
+ pose_preds, batch_pred_instances, batch_pred_fields = None, None, None
+ traj_preds, batch_traj_instances, batch_traj_fields = None, None, None
+ if self.with_traj:
+ x, traj_x = feats
+ traj_preds = self.traj_head.predict(
+ traj_x, data_samples, test_cfg=self.test_cfg)
+ else:
+ x = feats
+
+ if self.with_head:
+ pose_preds = self.head.predict(
+ x, data_samples, test_cfg=self.test_cfg)
+
+ if isinstance(pose_preds, tuple):
+ batch_pred_instances, batch_pred_fields = pose_preds
+ else:
+ batch_pred_instances = pose_preds
+
+ if isinstance(traj_preds, tuple):
+ batch_traj_instances, batch_traj_fields = traj_preds
+ else:
+ batch_traj_instances = traj_preds
+
+ results = self.add_pred_to_datasample(batch_pred_instances,
+ batch_pred_fields,
+ batch_traj_instances,
+ batch_traj_fields, data_samples)
+
+ return results
+
+ def add_pred_to_datasample(
+ self,
+ batch_pred_instances: InstanceList,
+ batch_pred_fields: Optional[PixelDataList],
+ batch_traj_instances: InstanceList,
+ batch_traj_fields: Optional[PixelDataList],
+ batch_data_samples: SampleList,
+ ) -> SampleList:
+ """Add predictions into data samples.
+
+ Args:
+ batch_pred_instances (List[InstanceData]): The predicted instances
+ of the input data batch
+ batch_pred_fields (List[PixelData], optional): The predicted
+ fields (e.g. heatmaps) of the input batch
+ batch_traj_instances (List[InstanceData]): The predicted instances
+ of the input data batch
+ batch_traj_fields (List[PixelData], optional): The predicted
+ fields (e.g. heatmaps) of the input batch
+ batch_data_samples (List[PoseDataSample]): The input data batch
+
+ Returns:
+ List[PoseDataSample]: A list of data samples where the predictions
+ are stored in the ``pred_instances`` field of each data sample.
+ """
+ assert len(batch_pred_instances) == len(batch_data_samples)
+ if batch_pred_fields is None:
+ batch_pred_fields, batch_traj_fields = [], []
+ if batch_traj_instances is None:
+ batch_traj_instances = []
+ output_keypoint_indices = self.test_cfg.get('output_keypoint_indices',
+ None)
+
+ for (pred_instances, pred_fields, traj_instances, traj_fields,
+ data_sample) in zip_longest(batch_pred_instances,
+ batch_pred_fields,
+ batch_traj_instances,
+ batch_traj_fields,
+ batch_data_samples):
+
+ if output_keypoint_indices is not None:
+ # select output keypoints with given indices
+ num_keypoints = pred_instances.keypoints.shape[1]
+ for key, value in pred_instances.all_items():
+ if key.startswith('keypoint'):
+ pred_instances.set_field(
+ value[:, output_keypoint_indices], key)
+
+ data_sample.pred_instances = pred_instances
+
+ if pred_fields is not None:
+ if output_keypoint_indices is not None:
+ # select output heatmap channels with keypoint indices
+ # when the number of heatmap channel matches num_keypoints
+ for key, value in pred_fields.all_items():
+ if value.shape[0] != num_keypoints:
+ continue
+ pred_fields.set_field(value[output_keypoint_indices],
+ key)
+ data_sample.pred_fields = pred_fields
+
+ return batch_data_samples
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/topdown.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/topdown.py
new file mode 100644
index 0000000000000000000000000000000000000000..5f8a460470cfb5168fc4343e777b7e96a54f2aa2
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/topdown.py
@@ -0,0 +1,288 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from itertools import zip_longest
+from collections import OrderedDict
+from typing import Dict, Optional, Union, Tuple
+import torch
+from torch import Tensor
+from mmengine.optim import OptimWrapper
+
+import torch
+import os
+
+from mmpose.registry import MODELS
+from mmpose.utils.typing import (ConfigType, InstanceList, OptConfigType,
+ OptMultiConfig, PixelDataList, SampleList)
+from .base import BasePoseEstimator
+
+
+@MODELS.register_module()
+class TopdownPoseEstimator(BasePoseEstimator):
+ """Base class for top-down pose estimators.
+
+ Args:
+ backbone (dict): The backbone config
+ neck (dict, optional): The neck config. Defaults to ``None``
+ head (dict, optional): The head config. Defaults to ``None``
+ train_cfg (dict, optional): The runtime config for training process.
+ Defaults to ``None``
+ test_cfg (dict, optional): The runtime config for testing process.
+ Defaults to ``None``
+ data_preprocessor (dict, optional): The data preprocessing config to
+ build the instance of :class:`BaseDataPreprocessor`. Defaults to
+ ``None``
+ init_cfg (dict, optional): The config to control the initialization.
+ Defaults to ``None``
+ metainfo (dict): Meta information for dataset, such as keypoints
+ definition and properties. If set, the metainfo of the input data
+ batch will be overridden. For more details, please refer to
+ https://mmpose.readthedocs.io/en/latest/user_guides/
+ prepare_datasets.html#create-a-custom-dataset-info-
+ config-file-for-the-dataset. Defaults to ``None``
+ """
+
+ def __init__(self,
+ backbone: ConfigType,
+ neck: OptConfigType = None,
+ head: OptConfigType = None,
+ train_cfg: OptConfigType = None,
+ test_cfg: OptConfigType = None,
+ data_preprocessor: OptConfigType = None,
+ init_cfg: OptMultiConfig = None,
+ metainfo: Optional[dict] = None):
+ super().__init__(
+ backbone=backbone,
+ neck=neck,
+ head=head,
+ train_cfg=train_cfg,
+ test_cfg=test_cfg,
+ data_preprocessor=data_preprocessor,
+ init_cfg=init_cfg,
+ metainfo=metainfo)
+
+ ## custom logic to deal with loss spikes on RSC
+ self.rank = int(os.environ.get("RANK", 0))
+ self.prev_loss = None
+ self.loss_neighborhood = 25.0 ## if loss spike is higher than this, we drop the batch
+ return
+
+ def loss(self, inputs: Tensor, data_samples: SampleList) -> dict:
+ """Calculate losses from a batch of inputs and data samples.
+
+ Args:
+ inputs (Tensor): Inputs with shape (N, C, H, W).
+ data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples.
+
+ Returns:+
+ dict: A dictionary of losses.
+ """
+ feats = self.extract_feat(inputs) ## tuple of size 1, for vit-H, B x 1280 x 16 x 12
+
+ losses = dict()
+
+ if self.with_head:
+ loss, preds = self.head.loss(feats, data_samples, train_cfg=self.train_cfg)
+ losses.update(loss)
+
+ ## preds is B x 17 x 192 x 144
+ return losses, preds
+
+ def train_step(self, data: Union[dict, tuple, list],
+ optim_wrapper: OptimWrapper) -> Dict[str, torch.Tensor]:
+ """Implements the default model training process including
+ preprocessing, model forward propagation, loss calculation,
+ optimization, and back-propagation.
+ During non-distributed training. If subclasses do not override the
+ :meth:`train_step`, :class:`EpochBasedTrainLoop` or
+ :class:`IterBasedTrainLoop` will call this method to update model
+ parameters. The default parameter update process is as follows:
+ 1. Calls ``self.data_processor(data, training=False)`` to collect
+ batch_inputs and corresponding data_samples(labels).
+ 2. Calls ``self(batch_inputs, data_samples, mode='loss')`` to get raw
+ loss
+ 3. Calls ``self.parse_losses`` to get ``parsed_losses`` tensor used to
+ backward and dict of loss tensor used to log messages.
+ 4. Calls ``optim_wrapper.update_params(loss)`` to update model.
+ Args:
+ data (dict or tuple or list): Data sampled from dataset.
+ optim_wrapper (OptimWrapper): OptimWrapper instance
+ used to update model parameters.
+ Returns:
+ Dict[str, torch.Tensor]: A ``dict`` of tensor for logging.
+ """
+ # Enable automatic mixed precision training context.
+ with optim_wrapper.optim_context(self):
+ data = self.data_preprocessor(data, True)
+ losses, preds = self._run_forward(data, mode='loss') # type: ignore
+ parsed_losses, log_vars = self.parse_losses(losses) # type: ignore
+
+ optim_wrapper.update_params(parsed_losses)
+
+ log_vars['vis_preds'] = preds
+ return log_vars
+
+ ## from mmengine. The loss spike handling is done here.
+ ## As this function is called in both single node and slurm mode
+ def parse_losses(
+ self, losses: Dict[str, torch.Tensor]
+ ) -> Tuple[torch.Tensor, Dict[str, torch.Tensor]]:
+ """Parses the raw outputs (losses) of the network.
+
+ Args:
+ losses (dict): Raw output of the network, which usually contain
+ losses and other necessary information.
+
+ Returns:
+ tuple[Tensor, dict]: There are two elements. The first is the
+ loss tensor passed to optim_wrapper which may be a weighted sum
+ of all losses, and the second is log_vars which will be sent to
+ the logger.
+ """
+ log_vars = []
+ for loss_name, loss_value in losses.items():
+ if isinstance(loss_value, torch.Tensor):
+ log_vars.append([loss_name, loss_value.mean()])
+ elif is_list_of(loss_value, torch.Tensor):
+ log_vars.append(
+ [loss_name,
+ sum(_loss.mean() for _loss in loss_value)])
+ else:
+ raise TypeError(
+ f'{loss_name} is not a tensor or list of tensors')
+
+ loss = sum(value for key, value in log_vars if 'loss' in key)
+ log_vars.insert(0, ['loss', loss])
+ log_vars = OrderedDict(log_vars) # type: ignore
+
+ ##------------loss spike and nan issues handled here---------------
+ if loss.isnan().item():
+ print("\033[91mWarning: Train loss is nan!\033[0m")
+ loss = 0.0*loss
+ return loss, log_vars
+
+ current_loss = loss.item()
+
+ if self.prev_loss is None:
+ self.prev_loss = current_loss
+ return loss, log_vars
+
+ loss_ratio = current_loss / self.prev_loss
+ if loss_ratio > self.loss_neighborhood:
+ print("\033[91mWarning: Dropping batch due to high loss spike! loss_ratio:{} current_loss:{}\033[0m".format(loss_ratio, current_loss))
+ loss = 0.0*loss
+ return loss, log_vars
+
+ # print("\033[96mrank:{}, prev_loss:{}, current_loss:{}, loss_ratio:{}\033[00m".format(self.rank, self.prev_loss, current_loss, loss_ratio))
+ self.prev_loss = current_loss
+ return loss, log_vars # type: ignore
+
+ def predict(self, inputs: Tensor, data_samples: SampleList) -> SampleList:
+ """Predict results from a batch of inputs and data samples with post-
+ processing.
+
+ Args:
+ inputs (Tensor): Inputs with shape (N, C, H, W)
+ data_samples (List[:obj:`PoseDataSample`]): The batch
+ data samples
+
+ Returns:
+ list[:obj:`PoseDataSample`]: The pose estimation results of the
+ input images. The return value is `PoseDataSample` instances with
+ ``pred_instances`` and ``pred_fields``(optional) field , and
+ ``pred_instances`` usually contains the following keys:
+
+ - keypoints (Tensor): predicted keypoint coordinates in shape
+ (num_instances, K, D) where K is the keypoint number and D
+ is the keypoint dimension
+ - keypoint_scores (Tensor): predicted keypoint scores in shape
+ (num_instances, K)
+ """
+ assert self.with_head, (
+ 'The model must have head to perform prediction.')
+
+ if self.test_cfg.get('flip_test', False):
+ _feats = self.extract_feat(inputs)
+ _feats_flip = self.extract_feat(inputs.flip(-1))
+ feats = [_feats, _feats_flip]
+ else:
+ feats = self.extract_feat(inputs)
+
+ preds = self.head.predict(feats, data_samples, test_cfg=self.test_cfg)
+
+ if isinstance(preds, tuple):
+ batch_pred_instances, batch_pred_fields = preds
+ else:
+ batch_pred_instances = preds
+ batch_pred_fields = None
+
+ results = self.add_pred_to_datasample(batch_pred_instances,
+ batch_pred_fields, data_samples)
+
+ return results
+
+ def add_pred_to_datasample(self, batch_pred_instances: InstanceList,
+ batch_pred_fields: Optional[PixelDataList],
+ batch_data_samples: SampleList) -> SampleList:
+ """Add predictions into data samples.
+
+ Args:
+ batch_pred_instances (List[InstanceData]): The predicted instances
+ of the input data batch
+ batch_pred_fields (List[PixelData], optional): The predicted
+ fields (e.g. heatmaps) of the input batch
+ batch_data_samples (List[PoseDataSample]): The input data batch
+
+ Returns:
+ List[PoseDataSample]: A list of data samples where the predictions
+ are stored in the ``pred_instances`` field of each data sample.
+ """
+ assert len(batch_pred_instances) == len(batch_data_samples)
+ if batch_pred_fields is None:
+ batch_pred_fields = []
+ output_keypoint_indices = self.test_cfg.get('output_keypoint_indices',
+ None)
+
+ for pred_instances, pred_fields, data_sample in zip_longest(
+ batch_pred_instances, batch_pred_fields, batch_data_samples):
+
+ gt_instances = data_sample.gt_instances
+
+ # convert keypoint coordinates from input space to image space
+ bbox_centers = gt_instances.bbox_centers
+ bbox_scales = gt_instances.bbox_scales
+ input_size = data_sample.metainfo['input_size']
+
+ pred_instances.keypoints = pred_instances.keypoints / input_size \
+ * bbox_scales + bbox_centers - 0.5 * bbox_scales
+
+ if output_keypoint_indices is not None:
+ # select output keypoints with given indices
+ num_keypoints = pred_instances.keypoints.shape[1]
+ for key, value in pred_instances.all_items():
+ if key.startswith('keypoint'):
+ pred_instances.set_field(
+ value[:, output_keypoint_indices], key)
+
+ # add bbox information into pred_instances
+ pred_instances.bboxes = gt_instances.bboxes
+ pred_instances.bbox_scores = gt_instances.bbox_scores
+
+ data_sample.pred_instances = pred_instances
+
+ if pred_fields is not None:
+ if output_keypoint_indices is not None:
+ # select output heatmap channels with keypoint indices
+ # when the number of heatmap channel matches num_keypoints
+ for key, value in pred_fields.all_items():
+ if value.shape[0] != num_keypoints:
+ continue
+ pred_fields.set_field(value[output_keypoint_indices],
+ key)
+ data_sample.pred_fields = pred_fields
+
+ return batch_data_samples
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/topdown3d.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/topdown3d.py
new file mode 100644
index 0000000000000000000000000000000000000000..745f0e38b93579424e50612db3c8ad238f812d84
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/pose_estimators/topdown3d.py
@@ -0,0 +1,216 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from itertools import zip_longest
+from collections import OrderedDict
+from typing import Dict, Optional, Union, Tuple
+import torch
+from torch import Tensor
+from mmengine.optim import OptimWrapper
+
+import torch
+import os
+import numpy as np
+import cv2
+
+from mmpose.registry import MODELS
+from mmpose.utils.typing import (ConfigType, InstanceList, OptConfigType,
+ OptMultiConfig, PixelDataList, SampleList)
+from .base import BasePoseEstimator
+
+@MODELS.register_module()
+class Pose3dTopdownEstimator(BasePoseEstimator):
+ def __init__(self,
+ backbone: ConfigType,
+ neck: OptConfigType = None,
+ head: OptConfigType = None,
+ pose3d_head: OptConfigType = None,
+ train_cfg: OptConfigType = None,
+ test_cfg: OptConfigType = None,
+ data_preprocessor: OptConfigType = None,
+ init_cfg: OptMultiConfig = None,
+ metainfo: Optional[dict] = None):
+ super().__init__(
+ backbone=backbone,
+ neck=neck,
+ head=head,
+ train_cfg=train_cfg,
+ test_cfg=test_cfg,
+ data_preprocessor=data_preprocessor,
+ init_cfg=init_cfg,
+ metainfo=metainfo)
+
+ if pose3d_head is not None:
+ self.pose3d_head = MODELS.build(pose3d_head)
+
+ ## custom logic to deal with loss spikes on RSC
+ self.rank = int(os.environ.get("RANK", 0))
+ return
+
+ def loss(self, inputs: Tensor, data_samples: SampleList) -> dict:
+ feats = self.extract_feat(inputs) ## tuple of size 1, for vit-H, B x 1280 x 16 x 12
+ losses = dict()
+
+ if self.with_head:
+ loss, pose2d_preds = self.head.loss(feats, data_samples, train_cfg=self.train_cfg) ## 2d pose. pose2d_preds is B x K x H x W
+ pose3d_loss, preds_dict = self.pose3d_head.loss(feats, pose2d_preds, data_samples, train_cfg=self.train_cfg) ## 3d pose
+ losses.update(loss)
+ losses.update(pose3d_loss)
+ preds_dict['pose2d'] = pose2d_preds
+
+ return losses, preds_dict
+
+ def train_step(self, data: Union[dict, tuple, list],
+ optim_wrapper: OptimWrapper) -> Dict[str, torch.Tensor]:
+ # Enable automatic mixed precision training context.
+ with optim_wrapper.optim_context(self):
+ data = self.data_preprocessor(data, True)
+ losses, preds = self._run_forward(data, mode='loss') # type: ignore
+ parsed_losses, log_vars = self.parse_losses(losses) # type: ignore
+
+ optim_wrapper.update_params(parsed_losses)
+
+ log_vars['vis_preds'] = preds
+ return log_vars
+
+ ## from mmengine. The loss spike handling is done here.
+ ## As this function is called in both single node and slurm mode
+ def parse_losses(
+ self, losses: Dict[str, torch.Tensor]
+ ) -> Tuple[torch.Tensor, Dict[str, torch.Tensor]]:
+ log_vars = []
+ for loss_name, loss_value in losses.items():
+ if isinstance(loss_value, torch.Tensor):
+ log_vars.append([loss_name, loss_value.mean()])
+ elif is_list_of(loss_value, torch.Tensor):
+ log_vars.append(
+ [loss_name,
+ sum(_loss.mean() for _loss in loss_value)])
+ else:
+ raise TypeError(
+ f'{loss_name} is not a tensor or list of tensors')
+
+ loss = sum(value for key, value in log_vars if 'loss' in key)
+ log_vars.insert(0, ['loss', loss])
+ log_vars = OrderedDict(log_vars) # type: ignore
+
+ ##------------loss spike and nan issues handled here---------------
+ if loss.isnan().item():
+ print("\033[91mWarning: Train loss is nan!\033[0m")
+ loss = 0.0*loss
+ return loss, log_vars
+
+ return loss, log_vars # type: ignore
+
+ def predict(self, inputs: Tensor, data_samples: SampleList) -> SampleList:
+ assert self.with_head, ('The model must have head to perform prediction.')
+
+ feats = self.extract_feat(inputs)
+ batch_pred_instances = self.head.predict(feats, data_samples, test_cfg=self.test_cfg) ## pred_isntances
+ batch_pred_fields = None
+ batch_pred_instances = self.pose3d_head.predict(feats, batch_pred_instances, data_samples, test_cfg=self.test_cfg) ## pred
+
+ ## ----debug---
+ # import ipdb; ipdb.set_trace()
+ # image = inputs[0].cpu().numpy() ## 3 x 1024 x 768
+ # image = image.transpose(1, 2, 0) ## 1024 x 768 x 3
+
+ # ## renormalize to 0 to 255
+ # image = np.clip(image*255, 0, 255)
+ # image = image.astype(np.uint8)
+ # image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
+
+ # ## draw keypoints
+ # keypoints = batch_pred_instances[0].keypoints[0] ## 308 x 2
+ # for i in range(keypoints.shape[0]):
+ # x, y = keypoints[i]
+ # if x > 0 and y > 0:
+ # cv2.circle(image, (int(x), int(y)), 3, (0, 255, 0), -1)
+
+ # cv2.imwrite('keypoints.png', image)
+ # import ipdb; ipdb.set_trace()
+ ##------debug--------
+ results = self.add_pred_to_datasample(batch_pred_instances,
+ batch_pred_fields,
+ data_samples)
+
+ return results
+
+ def add_pred_to_datasample(self, batch_pred_instances: InstanceList,
+ batch_pred_fields: Optional[PixelDataList],
+ batch_data_samples: SampleList) -> SampleList:
+ """Add predictions into data samples.
+
+ Args:
+ batch_pred_instances (List[InstanceData]): The predicted instances
+ of the input data batch
+ batch_pred_fields (List[PixelData], optional): The predicted
+ fields (e.g. heatmaps) of the input batch
+ batch_data_samples (List[PoseDataSample]): The input data batch
+
+ Returns:
+ List[PoseDataSample]: A list of data samples where the predictions
+ are stored in the ``pred_instances`` field of each data sample.
+ """
+ assert len(batch_pred_instances) == len(batch_data_samples)
+
+ if batch_pred_fields is None:
+ batch_pred_fields = []
+ output_keypoint_indices = self.test_cfg.get('output_keypoint_indices', None)
+
+ for pred_instances, pred_fields, data_sample in zip_longest(
+ batch_pred_instances, batch_pred_fields, batch_data_samples):
+
+ gt_instances = data_sample.gt_instances
+
+ # convert keypoint coordinates from input space to image space
+ bbox_centers = gt_instances.bbox_centers
+ bbox_scales = gt_instances.bbox_scales
+ input_size = data_sample.metainfo['input_size']
+
+ ## convert keypoints to original image size
+ pred_instances.keypoints = pred_instances.keypoints / input_size \
+ * bbox_scales + bbox_centers - 0.5 * bbox_scales
+
+ # ##----------debug-----------
+ # import ipdb; ipdb.set_trace()
+ # image = cv2.imread(data_sample.img_path)
+ # keypoints = pred_instances.keypoints[0] ## 308 x 2
+
+ # for i in range(keypoints.shape[0]):
+ # x, y = keypoints[i]
+ # if x > 0 and y > 0:
+ # cv2.circle(image, (int(x), int(y)), 3, (0, 255, 0), -1)
+
+ # cv2.imwrite('keypoints.png', image)
+ # import ipdb; ipdb.set_trace()
+ # ##----------debug-----------
+ if output_keypoint_indices is not None:
+ # select output keypoints with given indices
+ num_keypoints = pred_instances.keypoints.shape[1]
+ for key, value in pred_instances.all_items():
+ if key.startswith('keypoint'):
+ pred_instances.set_field(
+ value[:, output_keypoint_indices], key)
+
+ # add bbox information into pred_instances
+ pred_instances.bboxes = gt_instances.bboxes
+ pred_instances.bbox_scores = gt_instances.bbox_scores
+
+ data_sample.pred_instances = pred_instances
+
+ if pred_fields is not None:
+ if output_keypoint_indices is not None:
+ # select output heatmap channels with keypoint indices
+ # when the number of heatmap channel matches num_keypoints
+ for key, value in pred_fields.all_items():
+ if value.shape[0] != num_keypoints:
+ continue
+ pred_fields.set_field(value[output_keypoint_indices],
+ key)
+ data_sample.pred_fields = pred_fields
+
+ return batch_data_samples
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..9957b1a69f43522ff05636d8db1362c2d55d17ed
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__init__.py
@@ -0,0 +1,15 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .check_and_update_config import check_and_update_config
+from .ckpt_convert import pvt_convert
+from .rtmcc_block import RTMCCBlock, rope
+from .transformer import PatchEmbed, nchw_to_nlc, nlc_to_nchw
+
+__all__ = [
+ 'PatchEmbed', 'nchw_to_nlc', 'nlc_to_nchw', 'pvt_convert', 'RTMCCBlock',
+ 'rope', 'check_and_update_config'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c73d92e39a2315adb89b881e0590832575a4b742
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/check_and_update_config.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/check_and_update_config.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..49e512c464918795641d400fb8d39d607f53e51b
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/check_and_update_config.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/ckpt_convert.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/ckpt_convert.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..78c26b05a31ba6b70a8c1b049f3ee69a5baf3eb3
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/ckpt_convert.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/ops.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/ops.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9bca3310c3f510baa5d3485350b8cfafcf1d6f5e
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/ops.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/realnvp.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/realnvp.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6c3423cc4638562d02308d514ec457aaba3ec2e3
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/realnvp.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/regularizations.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/regularizations.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8391bc3d43766c62306c8bfde39ce80b18f2554f
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/regularizations.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/rtmcc_block.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/rtmcc_block.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ad970b76d105d130a4f10c08fd666d4b9dd356f9
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/rtmcc_block.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/transformer.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/transformer.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e0802a111f9852f57d1ebde75d8c68a0c98f96f8
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/transformer.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/tta.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/tta.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e25e1a5345b1808415606fa72a230983f38be00e
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/__pycache__/tta.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/check_and_update_config.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/check_and_update_config.py
new file mode 100644
index 0000000000000000000000000000000000000000..5155971cefbb21b3ffcc1dcbe0ea8058f0f86ff8
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/check_and_update_config.py
@@ -0,0 +1,235 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Dict, Optional, Tuple, Union
+
+from mmengine.config import Config, ConfigDict
+from mmengine.dist import master_only
+from mmengine.logging import MMLogger
+
+ConfigType = Union[Config, ConfigDict]
+
+
+def process_input_transform(input_transform: str, head: Dict, head_new: Dict,
+ head_deleted_dict: Dict, head_append_dict: Dict,
+ neck_new: Dict, input_index: Tuple[int],
+ align_corners: bool) -> None:
+ """Process the input_transform field and update head and neck
+ dictionaries."""
+ if input_transform == 'resize_concat':
+ in_channels = head_new.pop('in_channels')
+ head_deleted_dict['in_channels'] = str(in_channels)
+ in_channels = sum([in_channels[i] for i in input_index])
+ head_new['in_channels'] = in_channels
+ head_append_dict['in_channels'] = str(in_channels)
+
+ neck_new.update(
+ dict(
+ type='FeatureMapProcessor',
+ concat=True,
+ select_index=input_index,
+ ))
+ if align_corners:
+ neck_new['align_corners'] = align_corners
+
+ elif input_transform == 'select':
+ if input_index != (-1, ):
+ neck_new.update(
+ dict(type='FeatureMapProcessor', select_index=input_index))
+ if isinstance(head['in_channels'], tuple):
+ in_channels = head_new.pop('in_channels')
+ head_deleted_dict['in_channels'] = str(in_channels)
+ if isinstance(input_index, int):
+ in_channels = in_channels[input_index]
+ else:
+ in_channels = tuple([in_channels[i] for i in input_index])
+ head_new['in_channels'] = in_channels
+ head_append_dict['in_channels'] = str(in_channels)
+ if align_corners:
+ neck_new['align_corners'] = align_corners
+
+ else:
+ raise ValueError(f'model.head get invalid value for argument '
+ f'input_transform: {input_transform}')
+
+
+def process_extra_field(extra: Dict, head_new: Dict, head_deleted_dict: Dict,
+ head_append_dict: Dict, neck_new: Dict) -> None:
+ """Process the extra field and update head and neck dictionaries."""
+ head_deleted_dict['extra'] = 'dict('
+ for key, value in extra.items():
+ head_deleted_dict['extra'] += f'{key}={value},'
+ head_deleted_dict['extra'] = head_deleted_dict['extra'][:-1] + ')'
+ if 'final_conv_kernel' in extra:
+ kernel_size = extra['final_conv_kernel']
+ if kernel_size > 1:
+ padding = kernel_size // 2
+ head_new['final_layer'] = dict(
+ kernel_size=kernel_size, padding=padding)
+ head_append_dict[
+ 'final_layer'] = f'dict(kernel_size={kernel_size}, ' \
+ f'padding={padding})'
+ else:
+ head_new['final_layer'] = dict(kernel_size=kernel_size)
+ head_append_dict[
+ 'final_layer'] = f'dict(kernel_size={kernel_size})'
+ if 'upsample' in extra:
+ neck_new.update(
+ dict(
+ type='FeatureMapProcessor',
+ scale_factor=float(extra['upsample']),
+ apply_relu=True,
+ ))
+
+
+def process_has_final_layer(has_final_layer: bool, head_new: Dict,
+ head_deleted_dict: Dict,
+ head_append_dict: Dict) -> None:
+ """Process the has_final_layer field and update the head dictionary."""
+ head_deleted_dict['has_final_layer'] = str(has_final_layer)
+ if not has_final_layer:
+ if 'final_layer' not in head_new:
+ head_new['final_layer'] = None
+ head_append_dict['final_layer'] = 'None'
+
+
+def check_and_update_config(neck: Optional[ConfigType],
+ head: ConfigType) -> Tuple[Optional[Dict], Dict]:
+ """Check and update the configuration of the head and neck components.
+ Args:
+ neck (Optional[ConfigType]): Configuration for the neck component.
+ head (ConfigType): Configuration for the head component.
+
+ Returns:
+ Tuple[Optional[Dict], Dict]: Updated configurations for the neck
+ and head components.
+ """
+ head_new, neck_new = head.copy(), neck.copy() if isinstance(neck,
+ dict) else {}
+ head_deleted_dict, head_append_dict = {}, {}
+
+ if 'input_transform' in head:
+ input_transform = head_new.pop('input_transform')
+ head_deleted_dict['input_transform'] = f'\'{input_transform}\''
+ else:
+ input_transform = 'select'
+
+ if 'input_index' in head:
+ input_index = head_new.pop('input_index')
+ head_deleted_dict['input_index'] = str(input_index)
+ else:
+ input_index = (-1, )
+
+ if 'align_corners' in head:
+ align_corners = head_new.pop('align_corners')
+ head_deleted_dict['align_corners'] = str(align_corners)
+ else:
+ align_corners = False
+
+ process_input_transform(input_transform, head, head_new, head_deleted_dict,
+ head_append_dict, neck_new, input_index,
+ align_corners)
+
+ if 'extra' in head:
+ extra = head_new.pop('extra')
+ process_extra_field(extra, head_new, head_deleted_dict,
+ head_append_dict, neck_new)
+
+ if 'has_final_layer' in head:
+ has_final_layer = head_new.pop('has_final_layer')
+ process_has_final_layer(has_final_layer, head_new, head_deleted_dict,
+ head_append_dict)
+
+ display_modifications(head_deleted_dict, head_append_dict, neck_new)
+
+ neck_new = neck_new if len(neck_new) else None
+ return neck_new, head_new
+
+
+@master_only
+def display_modifications(head_deleted_dict: Dict, head_append_dict: Dict,
+ neck: Dict) -> None:
+ """Display the modifications made to the head and neck configurations.
+
+ Args:
+ head_deleted_dict (Dict): Dictionary of deleted fields in the head.
+ head_append_dict (Dict): Dictionary of appended fields in the head.
+ neck (Dict): Updated neck configuration.
+ """
+ if len(head_deleted_dict) + len(head_append_dict) == 0:
+ return
+
+ old_model_info, new_model_info = build_model_info(head_deleted_dict,
+ head_append_dict, neck)
+
+ total_info = '\nThe config you are using is outdated. '\
+ 'The following section of the config:\n```\n'
+ total_info += old_model_info
+ total_info += '```\nshould be updated to\n```\n'
+ total_info += new_model_info
+ total_info += '```\nFor more information, please refer to '\
+ 'https://mmpose.readthedocs.io/en/latest/' \
+ 'guide_to_framework.html#step3-model'
+
+ logger: MMLogger = MMLogger.get_current_instance()
+ logger.warning(total_info)
+
+
+def build_model_info(head_deleted_dict: Dict, head_append_dict: Dict,
+ neck: Dict) -> Tuple[str, str]:
+ """Build the old and new model information strings.
+ Args:
+ head_deleted_dict (Dict): Dictionary of deleted fields in the head.
+ head_append_dict (Dict): Dictionary of appended fields in the head.
+ neck (Dict): Updated neck configuration.
+
+ Returns:
+ Tuple[str, str]: Old and new model information strings.
+ """
+ old_head_info = build_head_info(head_deleted_dict)
+ new_head_info = build_head_info(head_append_dict)
+ neck_info = build_neck_info(neck)
+
+ old_model_info = 'model=dict(\n' + ' ' * 4 + '...,\n' + old_head_info
+ new_model_info = 'model=dict(\n' + ' ' * 4 + '...,\n' \
+ + neck_info + new_head_info
+
+ return old_model_info, new_model_info
+
+
+def build_head_info(head_dict: Dict) -> str:
+ """Build the head information string.
+
+ Args:
+ head_dict (Dict): Dictionary of fields in the head configuration.
+ Returns:
+ str: Head information string.
+ """
+ head_info = ' ' * 4 + 'head=dict(\n'
+ for key, value in head_dict.items():
+ head_info += ' ' * 8 + f'{key}={value},\n'
+ head_info += ' ' * 8 + '...),\n'
+ return head_info
+
+
+def build_neck_info(neck: Dict) -> str:
+ """Build the neck information string.
+ Args:
+ neck (Dict): Updated neck configuration.
+
+ Returns:
+ str: Neck information string.
+ """
+ if len(neck) > 0:
+ neck = neck.copy()
+ neck_info = ' ' * 4 + 'neck=dict(\n' + ' ' * 8 + \
+ f'type=\'{neck.pop("type")}\',\n'
+ for key, value in neck.items():
+ neck_info += ' ' * 8 + f'{key}={str(value)},\n'
+ neck_info += ' ' * 4 + '),\n'
+ else:
+ neck_info = ''
+ return neck_info
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/ckpt_convert.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/ckpt_convert.py
new file mode 100644
index 0000000000000000000000000000000000000000..7cdd691192e6a44818ab6770c7ddef41f1a213e8
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/ckpt_convert.py
@@ -0,0 +1,87 @@
+# Copyright (c) Meta Platforms, Inc. and 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 script consists of several convert functions which
+# can modify the weights of model in original repo to be
+# pre-trained weights.
+
+from collections import OrderedDict
+
+import torch
+
+
+def pvt_convert(ckpt):
+ new_ckpt = OrderedDict()
+ # Process the concat between q linear weights and kv linear weights
+ use_abs_pos_embed = False
+ use_conv_ffn = False
+ for k in ckpt.keys():
+ if k.startswith('pos_embed'):
+ use_abs_pos_embed = True
+ if k.find('dwconv') >= 0:
+ use_conv_ffn = True
+ for k, v in ckpt.items():
+ if k.startswith('head'):
+ continue
+ if k.startswith('norm.'):
+ continue
+ if k.startswith('cls_token'):
+ continue
+ if k.startswith('pos_embed'):
+ stage_i = int(k.replace('pos_embed', ''))
+ new_k = k.replace(f'pos_embed{stage_i}',
+ f'layers.{stage_i - 1}.1.0.pos_embed')
+ if stage_i == 4 and v.size(1) == 50: # 1 (cls token) + 7 * 7
+ new_v = v[:, 1:, :] # remove cls token
+ else:
+ new_v = v
+ elif k.startswith('patch_embed'):
+ stage_i = int(k.split('.')[0].replace('patch_embed', ''))
+ new_k = k.replace(f'patch_embed{stage_i}',
+ f'layers.{stage_i - 1}.0')
+ new_v = v
+ if 'proj.' in new_k:
+ new_k = new_k.replace('proj.', 'projection.')
+ elif k.startswith('block'):
+ stage_i = int(k.split('.')[0].replace('block', ''))
+ layer_i = int(k.split('.')[1])
+ new_layer_i = layer_i + use_abs_pos_embed
+ new_k = k.replace(f'block{stage_i}.{layer_i}',
+ f'layers.{stage_i - 1}.1.{new_layer_i}')
+ new_v = v
+ if 'attn.q.' in new_k:
+ sub_item_k = k.replace('q.', 'kv.')
+ new_k = new_k.replace('q.', 'attn.in_proj_')
+ new_v = torch.cat([v, ckpt[sub_item_k]], dim=0)
+ elif 'attn.kv.' in new_k:
+ continue
+ elif 'attn.proj.' in new_k:
+ new_k = new_k.replace('proj.', 'attn.out_proj.')
+ elif 'attn.sr.' in new_k:
+ new_k = new_k.replace('sr.', 'sr.')
+ elif 'mlp.' in new_k:
+ string = f'{new_k}-'
+ new_k = new_k.replace('mlp.', 'ffn.layers.')
+ if 'fc1.weight' in new_k or 'fc2.weight' in new_k:
+ new_v = v.reshape((*v.shape, 1, 1))
+ new_k = new_k.replace('fc1.', '0.')
+ new_k = new_k.replace('dwconv.dwconv.', '1.')
+ if use_conv_ffn:
+ new_k = new_k.replace('fc2.', '4.')
+ else:
+ new_k = new_k.replace('fc2.', '3.')
+ string += f'{new_k} {v.shape}-{new_v.shape}'
+ elif k.startswith('norm'):
+ stage_i = int(k[4])
+ new_k = k.replace(f'norm{stage_i}', f'layers.{stage_i - 1}.2')
+ new_v = v
+ else:
+ new_k = k
+ new_v = v
+ new_ckpt[new_k] = new_v
+
+ return new_ckpt
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/geometry.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/geometry.py
new file mode 100644
index 0000000000000000000000000000000000000000..ec5c7a91fffea0c16d5a6128b30878ecbfec7c93
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/geometry.py
@@ -0,0 +1,73 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import torch
+from torch.nn import functional as F
+
+
+def rot6d_to_rotmat(x):
+ """Convert 6D rotation representation to 3x3 rotation matrix.
+
+ Based on Zhou et al., "On the Continuity of Rotation
+ Representations in Neural Networks", CVPR 2019
+ Input:
+ (B,6) Batch of 6-D rotation representations
+ Output:
+ (B,3,3) Batch of corresponding rotation matrices
+ """
+ x = x.view(-1, 3, 2)
+ a1 = x[:, :, 0]
+ a2 = x[:, :, 1]
+ b1 = F.normalize(a1)
+ b2 = F.normalize(a2 - torch.einsum('bi,bi->b', b1, a2).unsqueeze(-1) * b1)
+ b3 = torch.cross(b1, b2)
+ return torch.stack((b1, b2, b3), dim=-1)
+
+
+def batch_rodrigues(theta):
+ """Convert axis-angle representation to rotation matrix.
+ Args:
+ theta: size = [B, 3]
+ Returns:
+ Rotation matrix corresponding to the quaternion
+ -- size = [B, 3, 3]
+ """
+ l2norm = torch.norm(theta + 1e-8, p=2, dim=1)
+ angle = torch.unsqueeze(l2norm, -1)
+ normalized = torch.div(theta, angle)
+ angle = angle * 0.5
+ v_cos = torch.cos(angle)
+ v_sin = torch.sin(angle)
+ quat = torch.cat([v_cos, v_sin * normalized], dim=1)
+ return quat_to_rotmat(quat)
+
+
+def quat_to_rotmat(quat):
+ """Convert quaternion coefficients to rotation matrix.
+ Args:
+ quat: size = [B, 4] 4 <===>(w, x, y, z)
+ Returns:
+ Rotation matrix corresponding to the quaternion
+ -- size = [B, 3, 3]
+ """
+ norm_quat = quat
+ norm_quat = norm_quat / norm_quat.norm(p=2, dim=1, keepdim=True)
+ w, x, y, z = norm_quat[:, 0], norm_quat[:, 1],\
+ norm_quat[:, 2], norm_quat[:, 3]
+
+ B = quat.size(0)
+
+ w2, x2, y2, z2 = w.pow(2), x.pow(2), y.pow(2), z.pow(2)
+ wx, wy, wz = w * x, w * y, w * z
+ xy, xz, yz = x * y, x * z, y * z
+
+ rotMat = torch.stack([
+ w2 + x2 - y2 - z2, 2 * xy - 2 * wz, 2 * wy + 2 * xz, 2 * wz + 2 * xy,
+ w2 - x2 + y2 - z2, 2 * yz - 2 * wx, 2 * xz - 2 * wy, 2 * wx + 2 * yz,
+ w2 - x2 - y2 + z2
+ ],
+ dim=1).view(B, 3, 3)
+ return rotMat
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/ops.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/ops.py
new file mode 100644
index 0000000000000000000000000000000000000000..c97472636f4ebd435b81f12df56238fb11d363ea
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/ops.py
@@ -0,0 +1,57 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import warnings
+from typing import Optional, Tuple, Union
+
+import torch
+from torch.nn import functional as F
+
+
+def resize(input: torch.Tensor,
+ size: Optional[Union[Tuple[int, int], torch.Size]] = None,
+ scale_factor: Optional[float] = None,
+ mode: str = 'nearest',
+ align_corners: Optional[bool] = None,
+ warning: bool = True) -> torch.Tensor:
+ """Resize a given input tensor using specified size or scale_factor.
+
+ Args:
+ input (torch.Tensor): The input tensor to be resized.
+ size (Optional[Union[Tuple[int, int], torch.Size]]): The desired
+ output size. Defaults to None.
+ scale_factor (Optional[float]): The scaling factor for resizing.
+ Defaults to None.
+ mode (str): The interpolation mode. Defaults to 'nearest'.
+ align_corners (Optional[bool]): Determines whether to align the
+ corners when using certain interpolation modes. Defaults to None.
+ warning (bool): Whether to display a warning when the input and
+ output sizes are not ideal for alignment. Defaults to True.
+
+ Returns:
+ torch.Tensor: The resized tensor.
+ """
+ # Check if a warning should be displayed regarding input and output sizes
+ if warning:
+ if size is not None and align_corners:
+ input_h, input_w = tuple(int(x) for x in input.shape[2:])
+ output_h, output_w = tuple(int(x) for x in size)
+ if output_h > input_h or output_w > output_h:
+ if ((output_h > 1 and output_w > 1 and input_h > 1
+ and input_w > 1) and (output_h - 1) % (input_h - 1)
+ and (output_w - 1) % (input_w - 1)):
+ warnings.warn(
+ f'When align_corners={align_corners}, '
+ 'the output would be more aligned if '
+ f'input size {(input_h, input_w)} is `x+1` and '
+ f'out size {(output_h, output_w)} is `nx+1`')
+
+ # Convert torch.Size to tuple if necessary
+ if isinstance(size, torch.Size):
+ size = tuple(int(x) for x in size)
+
+ # Perform the resizing operation
+ return F.interpolate(input, size, scale_factor, mode, align_corners)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/realnvp.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/realnvp.py
new file mode 100644
index 0000000000000000000000000000000000000000..7d0de6c39599f41b437f3196a013acdb05107e6a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/realnvp.py
@@ -0,0 +1,81 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import torch
+import torch.nn as nn
+from torch import distributions
+
+
+class RealNVP(nn.Module):
+ """RealNVP: a flow-based generative model
+
+ `Density estimation using Real NVP
+ arXiv: `_.
+
+ Code is modified from `the official implementation of RLE
+ `_.
+
+ See also `real-nvp-pytorch
+ `_.
+ """
+
+ @staticmethod
+ def get_scale_net():
+ """Get the scale model in a single invertable mapping."""
+ return nn.Sequential(
+ nn.Linear(2, 64), nn.LeakyReLU(), nn.Linear(64, 64),
+ nn.LeakyReLU(), nn.Linear(64, 2), nn.Tanh())
+
+ @staticmethod
+ def get_trans_net():
+ """Get the translation model in a single invertable mapping."""
+ return nn.Sequential(
+ nn.Linear(2, 64), nn.LeakyReLU(), nn.Linear(64, 64),
+ nn.LeakyReLU(), nn.Linear(64, 2))
+
+ @property
+ def prior(self):
+ """The prior distribution."""
+ return distributions.MultivariateNormal(self.loc, self.cov)
+
+ def __init__(self):
+ super(RealNVP, self).__init__()
+
+ self.register_buffer('loc', torch.zeros(2))
+ self.register_buffer('cov', torch.eye(2))
+ self.register_buffer(
+ 'mask', torch.tensor([[0, 1], [1, 0]] * 3, dtype=torch.float32))
+
+ self.s = torch.nn.ModuleList(
+ [self.get_scale_net() for _ in range(len(self.mask))])
+ self.t = torch.nn.ModuleList(
+ [self.get_trans_net() for _ in range(len(self.mask))])
+ self.init_weights()
+
+ def init_weights(self):
+ """Initialization model weights."""
+ for m in self.modules():
+ if isinstance(m, nn.Linear):
+ nn.init.xavier_uniform_(m.weight, gain=0.01)
+
+ def backward_p(self, x):
+ """Apply mapping form the data space to the latent space and calculate
+ the log determinant of the Jacobian matrix."""
+
+ log_det_jacob, z = x.new_zeros(x.shape[0]), x
+ for i in reversed(range(len(self.t))):
+ z_ = self.mask[i] * z
+ s = self.s[i](z_) * (1 - self.mask[i]) # torch.exp(s): betas
+ t = self.t[i](z_) * (1 - self.mask[i]) # gammas
+ z = (1 - self.mask[i]) * (z - t) * torch.exp(-s) + z_
+ log_det_jacob -= s.sum(dim=1)
+ return z, log_det_jacob
+
+ def log_prob(self, x):
+ """Calculate the log probability of given sample in data space."""
+
+ z, log_det = self.backward_p(x)
+ return self.prior.log_prob(z) + log_det
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/regularizations.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/regularizations.py
new file mode 100644
index 0000000000000000000000000000000000000000..ba8e3daa50b75b4358381b9fea4ecefadd6ee981
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/regularizations.py
@@ -0,0 +1,91 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from abc import ABCMeta, abstractmethod, abstractproperty
+
+import torch
+
+
+class PytorchModuleHook(metaclass=ABCMeta):
+ """Base class for PyTorch module hook registers.
+
+ An instance of a subclass of PytorchModuleHook can be used to
+ register hook to a pytorch module using the `register` method like:
+ hook_register.register(module)
+
+ Subclasses should add/overwrite the following methods:
+ - __init__
+ - hook
+ - hook_type
+ """
+
+ @abstractmethod
+ def hook(self, *args, **kwargs):
+ """Hook function."""
+
+ @abstractproperty
+ def hook_type(self) -> str:
+ """Hook type Subclasses should overwrite this function to return a
+ string value in.
+
+ {`forward`, `forward_pre`, `backward`}
+ """
+
+ def register(self, module):
+ """Register the hook function to the module.
+
+ Args:
+ module (pytorch module): the module to register the hook.
+
+ Returns:
+ handle (torch.utils.hooks.RemovableHandle): a handle to remove
+ the hook by calling handle.remove()
+ """
+ assert isinstance(module, torch.nn.Module)
+
+ if self.hook_type == 'forward':
+ h = module.register_forward_hook(self.hook)
+ elif self.hook_type == 'forward_pre':
+ h = module.register_forward_pre_hook(self.hook)
+ elif self.hook_type == 'backward':
+ h = module.register_backward_hook(self.hook)
+ else:
+ raise ValueError(f'Invalid hook type {self.hook}')
+
+ return h
+
+
+class WeightNormClipHook(PytorchModuleHook):
+ """Apply weight norm clip regularization.
+
+ The module's parameter will be clip to a given maximum norm before each
+ forward pass.
+
+ Args:
+ max_norm (float): The maximum norm of the parameter.
+ module_param_names (str|list): The parameter name (or name list) to
+ apply weight norm clip.
+ """
+
+ def __init__(self, max_norm=1.0, module_param_names='weight'):
+ self.module_param_names = module_param_names if isinstance(
+ module_param_names, list) else [module_param_names]
+ self.max_norm = max_norm
+
+ @property
+ def hook_type(self):
+ return 'forward_pre'
+
+ def hook(self, module, _input):
+ for name in self.module_param_names:
+ assert name in module._parameters, f'{name} is not a parameter' \
+ f' of the module {type(module)}'
+ param = module._parameters[name]
+
+ with torch.no_grad():
+ m = param.norm().item()
+ if m > self.max_norm:
+ param.mul_(self.max_norm / (m + 1e-6))
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/rtmcc_block.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/rtmcc_block.py
new file mode 100644
index 0000000000000000000000000000000000000000..430c5f4e5a829e6b68a854b03e77d6c0e82e194d
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/rtmcc_block.py
@@ -0,0 +1,310 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import math
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from mmcv.cnn.bricks import DropPath
+from mmengine.utils import digit_version
+from mmengine.utils.dl_utils import TORCH_VERSION
+
+
+def rope(x, dim):
+ """Applies Rotary Position Embedding to input tensor.
+
+ Args:
+ x (torch.Tensor): Input tensor.
+ dim (int | list[int]): The spatial dimension(s) to apply
+ rotary position embedding.
+
+ Returns:
+ torch.Tensor: The tensor after applying rotary position
+ embedding.
+
+ Reference:
+ `RoFormer: Enhanced Transformer with Rotary
+ Position Embedding `_
+ """
+ shape = x.shape
+ if isinstance(dim, int):
+ dim = [dim]
+
+ spatial_shape = [shape[i] for i in dim]
+ total_len = 1
+ for i in spatial_shape:
+ total_len *= i
+
+ position = torch.reshape(
+ torch.arange(total_len, dtype=torch.int, device=x.device),
+ spatial_shape)
+
+ for i in range(dim[-1] + 1, len(shape) - 1, 1):
+ position = torch.unsqueeze(position, dim=-1)
+
+ half_size = shape[-1] // 2
+ freq_seq = -torch.arange(
+ half_size, dtype=torch.int, device=x.device) / float(half_size)
+ inv_freq = 10000**-freq_seq
+
+ sinusoid = position[..., None] * inv_freq[None, None, :]
+
+ sin = torch.sin(sinusoid)
+ cos = torch.cos(sinusoid)
+ x1, x2 = torch.chunk(x, 2, dim=-1)
+
+ return torch.cat([x1 * cos - x2 * sin, x2 * cos + x1 * sin], dim=-1)
+
+
+class Scale(nn.Module):
+ """Scale vector by element multiplications.
+
+ Args:
+ dim (int): The dimension of the scale vector.
+ init_value (float, optional): The initial value of the scale vector.
+ Defaults to 1.0.
+ trainable (bool, optional): Whether the scale vector is trainable.
+ Defaults to True.
+ """
+
+ def __init__(self, dim, init_value=1., trainable=True):
+ super().__init__()
+ self.scale = nn.Parameter(
+ init_value * torch.ones(dim), requires_grad=trainable)
+
+ def forward(self, x):
+ """Forward function."""
+
+ return x * self.scale
+
+
+class ScaleNorm(nn.Module):
+ """Scale Norm.
+
+ Args:
+ dim (int): The dimension of the scale vector.
+ eps (float, optional): The minimum value in clamp. Defaults to 1e-5.
+
+ Reference:
+ `Transformers without Tears: Improving the Normalization
+ of Self-Attention `_
+ """
+
+ def __init__(self, dim, eps=1e-5):
+ super().__init__()
+ self.scale = dim**-0.5
+ self.eps = eps
+ self.g = nn.Parameter(torch.ones(1))
+
+ def forward(self, x):
+ """Forward function.
+
+ Args:
+ x (torch.Tensor): Input tensor.
+
+ Returns:
+ torch.Tensor: The tensor after applying scale norm.
+ """
+
+ norm = torch.norm(x, dim=2, keepdim=True) * self.scale
+ return x / norm.clamp(min=self.eps) * self.g
+
+
+class RTMCCBlock(nn.Module):
+ """Gated Attention Unit (GAU) in RTMBlock.
+
+ Args:
+ num_token (int): The number of tokens.
+ in_token_dims (int): The input token dimension.
+ out_token_dims (int): The output token dimension.
+ expansion_factor (int, optional): The expansion factor of the
+ intermediate token dimension. Defaults to 2.
+ s (int, optional): The self-attention feature dimension.
+ Defaults to 128.
+ eps (float, optional): The minimum value in clamp. Defaults to 1e-5.
+ dropout_rate (float, optional): The dropout rate. Defaults to 0.0.
+ drop_path (float, optional): The drop path rate. Defaults to 0.0.
+ attn_type (str, optional): Type of attention which should be one of
+ the following options:
+
+ - 'self-attn': Self-attention.
+ - 'cross-attn': Cross-attention.
+
+ Defaults to 'self-attn'.
+ act_fn (str, optional): The activation function which should be one
+ of the following options:
+
+ - 'ReLU': ReLU activation.
+ - 'SiLU': SiLU activation.
+
+ Defaults to 'SiLU'.
+ bias (bool, optional): Whether to use bias in linear layers.
+ Defaults to False.
+ use_rel_bias (bool, optional): Whether to use relative bias.
+ Defaults to True.
+ pos_enc (bool, optional): Whether to use rotary position
+ embedding. Defaults to False.
+
+ Reference:
+ `Transformer Quality in Linear Time
+ `_
+ """
+
+ def __init__(self,
+ num_token,
+ in_token_dims,
+ out_token_dims,
+ expansion_factor=2,
+ s=128,
+ eps=1e-5,
+ dropout_rate=0.,
+ drop_path=0.,
+ attn_type='self-attn',
+ act_fn='SiLU',
+ bias=False,
+ use_rel_bias=True,
+ pos_enc=False):
+
+ super(RTMCCBlock, self).__init__()
+ self.s = s
+ self.num_token = num_token
+ self.use_rel_bias = use_rel_bias
+ self.attn_type = attn_type
+ self.pos_enc = pos_enc
+ self.drop_path = DropPath(drop_path) \
+ if drop_path > 0. else nn.Identity()
+
+ self.e = int(in_token_dims * expansion_factor)
+ if use_rel_bias:
+ if attn_type == 'self-attn':
+ self.w = nn.Parameter(
+ torch.rand([2 * num_token - 1], dtype=torch.float))
+ else:
+ self.a = nn.Parameter(torch.rand([1, s], dtype=torch.float))
+ self.b = nn.Parameter(torch.rand([1, s], dtype=torch.float))
+ self.o = nn.Linear(self.e, out_token_dims, bias=bias)
+
+ if attn_type == 'self-attn':
+ self.uv = nn.Linear(in_token_dims, 2 * self.e + self.s, bias=bias)
+ self.gamma = nn.Parameter(torch.rand((2, self.s)))
+ self.beta = nn.Parameter(torch.rand((2, self.s)))
+ else:
+ self.uv = nn.Linear(in_token_dims, self.e + self.s, bias=bias)
+ self.k_fc = nn.Linear(in_token_dims, self.s, bias=bias)
+ self.v_fc = nn.Linear(in_token_dims, self.e, bias=bias)
+ nn.init.xavier_uniform_(self.k_fc.weight)
+ nn.init.xavier_uniform_(self.v_fc.weight)
+
+ self.ln = ScaleNorm(in_token_dims, eps=eps)
+
+ nn.init.xavier_uniform_(self.uv.weight)
+
+ if act_fn == 'SiLU':
+ assert digit_version(TORCH_VERSION) >= digit_version('1.7.0'), \
+ 'SiLU activation requires PyTorch version >= 1.7'
+
+ self.act_fn = nn.SiLU(True)
+ else:
+ self.act_fn = nn.ReLU(True)
+
+ if in_token_dims == out_token_dims:
+ self.shortcut = True
+ self.res_scale = Scale(in_token_dims)
+ else:
+ self.shortcut = False
+
+ self.sqrt_s = math.sqrt(s)
+
+ self.dropout_rate = dropout_rate
+
+ if dropout_rate > 0.:
+ self.dropout = nn.Dropout(dropout_rate)
+
+ def rel_pos_bias(self, seq_len, k_len=None):
+ """Add relative position bias."""
+
+ if self.attn_type == 'self-attn':
+ t = F.pad(self.w[:2 * seq_len - 1], [0, seq_len]).repeat(seq_len)
+ t = t[..., :-seq_len].reshape(-1, seq_len, 3 * seq_len - 2)
+ r = (2 * seq_len - 1) // 2
+ t = t[..., r:-r]
+ else:
+ a = rope(self.a.repeat(seq_len, 1), dim=0)
+ b = rope(self.b.repeat(k_len, 1), dim=0)
+ t = torch.bmm(a, b.permute(0, 2, 1))
+ return t
+
+ def _forward(self, inputs):
+ """GAU Forward function."""
+
+ if self.attn_type == 'self-attn':
+ x = inputs
+ else:
+ x, k, v = inputs
+
+ x = self.ln(x)
+
+ # [B, K, in_token_dims] -> [B, K, e + e + s]
+ uv = self.uv(x)
+ uv = self.act_fn(uv)
+
+ if self.attn_type == 'self-attn':
+ # [B, K, e + e + s] -> [B, K, e], [B, K, e], [B, K, s]
+ u, v, base = torch.split(uv, [self.e, self.e, self.s], dim=2)
+ # [B, K, 1, s] * [1, 1, 2, s] + [2, s] -> [B, K, 2, s]
+ base = base.unsqueeze(2) * self.gamma[None, None, :] + self.beta
+
+ if self.pos_enc:
+ base = rope(base, dim=1)
+ # [B, K, 2, s] -> [B, K, s], [B, K, s]
+ q, k = torch.unbind(base, dim=2)
+
+ else:
+ # [B, K, e + s] -> [B, K, e], [B, K, s]
+ u, q = torch.split(uv, [self.e, self.s], dim=2)
+
+ k = self.k_fc(k) # -> [B, K, s]
+ v = self.v_fc(v) # -> [B, K, e]
+
+ if self.pos_enc:
+ q = rope(q, 1)
+ k = rope(k, 1)
+
+ # [B, K, s].permute() -> [B, s, K]
+ # [B, K, s] x [B, s, K] -> [B, K, K]
+ qk = torch.bmm(q, k.permute(0, 2, 1))
+
+ if self.use_rel_bias:
+ if self.attn_type == 'self-attn':
+ bias = self.rel_pos_bias(q.size(1))
+ else:
+ bias = self.rel_pos_bias(q.size(1), k.size(1))
+ qk += bias[:, :q.size(1), :k.size(1)]
+ # [B, K, K]
+ kernel = torch.square(F.relu(qk / self.sqrt_s))
+
+ if self.dropout_rate > 0.:
+ kernel = self.dropout(kernel)
+ # [B, K, K] x [B, K, e] -> [B, K, e]
+ x = u * torch.bmm(kernel, v)
+ # [B, K, e] -> [B, K, out_token_dims]
+ x = self.o(x)
+
+ return x
+
+ def forward(self, x):
+ """Forward function."""
+
+ if self.shortcut:
+ if self.attn_type == 'cross-attn':
+ res_shortcut = x[0]
+ else:
+ res_shortcut = x
+ main_branch = self.drop_path(self._forward(x))
+ return self.res_scale(res_shortcut) + main_branch
+ else:
+ return self.drop_path(self._forward(x))
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/transformer.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/transformer.py
new file mode 100644
index 0000000000000000000000000000000000000000..713f9dac57d0b9110a57a3d341fdc7b9ac5dbae9
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/transformer.py
@@ -0,0 +1,374 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import math
+from typing import Sequence
+
+import torch.nn as nn
+import torch.nn.functional as F
+from mmcv.cnn import build_conv_layer, build_norm_layer
+from mmengine.model import BaseModule
+from mmengine.utils import to_2tuple
+
+
+def nlc_to_nchw(x, hw_shape):
+ """Convert [N, L, C] shape tensor to [N, C, H, W] shape tensor.
+
+ Args:
+ x (Tensor): The input tensor of shape [N, L, C] before conversion.
+ hw_shape (Sequence[int]): The height and width of output feature map.
+
+ Returns:
+ Tensor: The output tensor of shape [N, C, H, W] after conversion.
+ """
+ H, W = hw_shape
+ assert len(x.shape) == 3
+ B, L, C = x.shape
+ assert L == H * W, 'The seq_len does not match H, W'
+ return x.transpose(1, 2).reshape(B, C, H, W).contiguous()
+
+
+def nchw_to_nlc(x):
+ """Flatten [N, C, H, W] shape tensor to [N, L, C] shape tensor.
+
+ Args:
+ x (Tensor): The input tensor of shape [N, C, H, W] before conversion.
+
+ Returns:
+ Tensor: The output tensor of shape [N, L, C] after conversion.
+ """
+ assert len(x.shape) == 4
+ return x.flatten(2).transpose(1, 2).contiguous()
+
+
+class AdaptivePadding(nn.Module):
+ """Applies padding to input (if needed) so that input can get fully covered
+ by filter you specified. It support two modes "same" and "corner". The
+ "same" mode is same with "SAME" padding mode in TensorFlow, pad zero around
+ input. The "corner" mode would pad zero to bottom right.
+
+ Args:
+ kernel_size (int | tuple): Size of the kernel:
+ stride (int | tuple): Stride of the filter. Default: 1:
+ dilation (int | tuple): Spacing between kernel elements.
+ Default: 1
+ padding (str): Support "same" and "corner", "corner" mode
+ would pad zero to bottom right, and "same" mode would
+ pad zero around input. Default: "corner".
+ Example:
+ >>> kernel_size = 16
+ >>> stride = 16
+ >>> dilation = 1
+ >>> input = torch.rand(1, 1, 15, 17)
+ >>> adap_pad = AdaptivePadding(
+ >>> kernel_size=kernel_size,
+ >>> stride=stride,
+ >>> dilation=dilation,
+ >>> padding="corner")
+ >>> out = adap_pad(input)
+ >>> assert (out.shape[2], out.shape[3]) == (16, 32)
+ >>> input = torch.rand(1, 1, 16, 17)
+ >>> out = adap_pad(input)
+ >>> assert (out.shape[2], out.shape[3]) == (16, 32)
+ """
+
+ def __init__(self, kernel_size=1, stride=1, dilation=1, padding='corner'):
+
+ super(AdaptivePadding, self).__init__()
+
+ assert padding in ('same', 'corner')
+
+ kernel_size = to_2tuple(kernel_size)
+ stride = to_2tuple(stride)
+ padding = to_2tuple(padding)
+ dilation = to_2tuple(dilation)
+
+ self.padding = padding
+ self.kernel_size = kernel_size
+ self.stride = stride
+ self.dilation = dilation
+
+ def get_pad_shape(self, input_shape):
+ """Get horizontal and vertical padding shapes."""
+
+ input_h, input_w = input_shape
+ kernel_h, kernel_w = self.kernel_size
+ stride_h, stride_w = self.stride
+ output_h = math.ceil(input_h / stride_h)
+ output_w = math.ceil(input_w / stride_w)
+ pad_h = max((output_h - 1) * stride_h +
+ (kernel_h - 1) * self.dilation[0] + 1 - input_h, 0)
+ pad_w = max((output_w - 1) * stride_w +
+ (kernel_w - 1) * self.dilation[1] + 1 - input_w, 0)
+ return pad_h, pad_w
+
+ def forward(self, x):
+ """Forward function."""
+
+ pad_h, pad_w = self.get_pad_shape(x.size()[-2:])
+ if pad_h > 0 or pad_w > 0:
+ if self.padding == 'corner':
+ x = F.pad(x, [0, pad_w, 0, pad_h])
+ elif self.padding == 'same':
+ x = F.pad(x, [
+ pad_w // 2, pad_w - pad_w // 2, pad_h // 2,
+ pad_h - pad_h // 2
+ ])
+ return x
+
+
+class PatchEmbed(BaseModule):
+ """Image to Patch Embedding.
+
+ We use a conv layer to implement PatchEmbed.
+
+ Args:
+ in_channels (int): The num of input channels. Default: 3
+ embed_dims (int): The dimensions of embedding. Default: 768
+ conv_type (str): The config dict for embedding
+ conv layer type selection. Default: "Conv2d.
+ kernel_size (int): The kernel_size of embedding conv. Default: 16.
+ stride (int): The slide stride of embedding conv.
+ Default: None (Would be set as `kernel_size`).
+ padding (int | tuple | string ): The padding length of
+ embedding conv. When it is a string, it means the mode
+ of adaptive padding, support "same" and "corner" now.
+ Default: "corner".
+ dilation (int): The dilation rate of embedding conv. Default: 1.
+ bias (bool): Bias of embed conv. Default: True.
+ norm_cfg (dict, optional): Config dict for normalization layer.
+ Default: None.
+ input_size (int | tuple | None): The size of input, which will be
+ used to calculate the out size. Only work when `dynamic_size`
+ is False. Default: None.
+ init_cfg (`mmcv.ConfigDict`, optional): The Config for initialization.
+ Default: None.
+ """
+
+ def __init__(
+ self,
+ in_channels=3,
+ embed_dims=768,
+ conv_type='Conv2d',
+ kernel_size=16,
+ stride=16,
+ padding='corner',
+ dilation=1,
+ bias=True,
+ norm_cfg=None,
+ input_size=None,
+ init_cfg=None,
+ ):
+ super(PatchEmbed, self).__init__(init_cfg=init_cfg)
+
+ self.embed_dims = embed_dims
+ if stride is None:
+ stride = kernel_size
+
+ kernel_size = to_2tuple(kernel_size)
+ stride = to_2tuple(stride)
+ dilation = to_2tuple(dilation)
+
+ if isinstance(padding, str):
+ self.adap_padding = AdaptivePadding(
+ kernel_size=kernel_size,
+ stride=stride,
+ dilation=dilation,
+ padding=padding)
+ # disable the padding of conv
+ padding = 0
+ else:
+ self.adap_padding = None
+ padding = to_2tuple(padding)
+
+ self.projection = build_conv_layer(
+ dict(type=conv_type),
+ in_channels=in_channels,
+ out_channels=embed_dims,
+ kernel_size=kernel_size,
+ stride=stride,
+ padding=padding,
+ dilation=dilation,
+ bias=bias)
+
+ if norm_cfg is not None:
+ self.norm = build_norm_layer(norm_cfg, embed_dims)[1]
+ else:
+ self.norm = None
+
+ if input_size:
+ input_size = to_2tuple(input_size)
+ # `init_out_size` would be used outside to
+ # calculate the num_patches
+ # when `use_abs_pos_embed` outside
+ self.init_input_size = input_size
+ if self.adap_padding:
+ pad_h, pad_w = self.adap_padding.get_pad_shape(input_size)
+ input_h, input_w = input_size
+ input_h = input_h + pad_h
+ input_w = input_w + pad_w
+ input_size = (input_h, input_w)
+
+ # https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html
+ h_out = (input_size[0] + 2 * padding[0] - dilation[0] *
+ (kernel_size[0] - 1) - 1) // stride[0] + 1
+ w_out = (input_size[1] + 2 * padding[1] - dilation[1] *
+ (kernel_size[1] - 1) - 1) // stride[1] + 1
+ self.init_out_size = (h_out, w_out)
+ else:
+ self.init_input_size = None
+ self.init_out_size = None
+
+ def forward(self, x):
+ """
+ Args:
+ x (Tensor): Has shape (B, C, H, W). In most case, C is 3.
+
+ Returns:
+ tuple: Contains merged results and its spatial shape.
+
+ - x (Tensor): Has shape (B, out_h * out_w, embed_dims)
+ - out_size (tuple[int]): Spatial shape of x, arrange as
+ (out_h, out_w).
+ """
+
+ if self.adap_padding:
+ x = self.adap_padding(x)
+
+ x = self.projection(x)
+ out_size = (x.shape[2], x.shape[3])
+ x = x.flatten(2).transpose(1, 2)
+ if self.norm is not None:
+ x = self.norm(x)
+ return x, out_size
+
+
+class PatchMerging(BaseModule):
+ """Merge patch feature map.
+
+ This layer groups feature map by kernel_size, and applies norm and linear
+ layers to the grouped feature map. Our implementation uses `nn.Unfold` to
+ merge patch, which is about 25% faster than original implementation.
+ Instead, we need to modify pretrained models for compatibility.
+
+ Args:
+ in_channels (int): The num of input channels.
+ to gets fully covered by filter and stride you specified..
+ Default: True.
+ out_channels (int): The num of output channels.
+ kernel_size (int | tuple, optional): the kernel size in the unfold
+ layer. Defaults to 2.
+ stride (int | tuple, optional): the stride of the sliding blocks in the
+ unfold layer. Default: None. (Would be set as `kernel_size`)
+ padding (int | tuple | string ): The padding length of
+ embedding conv. When it is a string, it means the mode
+ of adaptive padding, support "same" and "corner" now.
+ Default: "corner".
+ dilation (int | tuple, optional): dilation parameter in the unfold
+ layer. Default: 1.
+ bias (bool, optional): Whether to add bias in linear layer or not.
+ Defaults: False.
+ norm_cfg (dict, optional): Config dict for normalization layer.
+ Default: dict(type='LN').
+ init_cfg (dict, optional): The extra config for initialization.
+ Default: None.
+ """
+
+ def __init__(self,
+ in_channels,
+ out_channels,
+ kernel_size=2,
+ stride=None,
+ padding='corner',
+ dilation=1,
+ bias=False,
+ norm_cfg=dict(type='LN'),
+ init_cfg=None):
+ super().__init__(init_cfg=init_cfg)
+ self.in_channels = in_channels
+ self.out_channels = out_channels
+ if stride:
+ stride = stride
+ else:
+ stride = kernel_size
+
+ kernel_size = to_2tuple(kernel_size)
+ stride = to_2tuple(stride)
+ dilation = to_2tuple(dilation)
+
+ if isinstance(padding, str):
+ self.adap_padding = AdaptivePadding(
+ kernel_size=kernel_size,
+ stride=stride,
+ dilation=dilation,
+ padding=padding)
+ # disable the padding of unfold
+ padding = 0
+ else:
+ self.adap_padding = None
+
+ padding = to_2tuple(padding)
+ self.sampler = nn.Unfold(
+ kernel_size=kernel_size,
+ dilation=dilation,
+ padding=padding,
+ stride=stride)
+
+ sample_dim = kernel_size[0] * kernel_size[1] * in_channels
+
+ if norm_cfg is not None:
+ self.norm = build_norm_layer(norm_cfg, sample_dim)[1]
+ else:
+ self.norm = None
+
+ self.reduction = nn.Linear(sample_dim, out_channels, bias=bias)
+
+ def forward(self, x, input_size):
+ """
+ Args:
+ x (Tensor): Has shape (B, H*W, C_in).
+ input_size (tuple[int]): The spatial shape of x, arrange as (H, W).
+ Default: None.
+
+ Returns:
+ tuple: Contains merged results and its spatial shape.
+
+ - x (Tensor): Has shape (B, Merged_H * Merged_W, C_out)
+ - out_size (tuple[int]): Spatial shape of x, arrange as
+ (Merged_H, Merged_W).
+ """
+ B, L, C = x.shape
+ assert isinstance(input_size, Sequence), f'Expect ' \
+ f'input_size is ' \
+ f'`Sequence` ' \
+ f'but get {input_size}'
+
+ H, W = input_size
+ assert L == H * W, 'input feature has wrong size'
+
+ x = x.view(B, H, W, C).permute([0, 3, 1, 2]) # B, C, H, W
+ # Use nn.Unfold to merge patch. About 25% faster than original method,
+ # but need to modify pretrained model for compatibility
+
+ if self.adap_padding:
+ x = self.adap_padding(x)
+ H, W = x.shape[-2:]
+
+ x = self.sampler(x)
+ # if kernel_size=2 and stride=2, x should has shape (B, 4*C, H/2*W/2)
+
+ out_h = (H + 2 * self.sampler.padding[0] - self.sampler.dilation[0] *
+ (self.sampler.kernel_size[0] - 1) -
+ 1) // self.sampler.stride[0] + 1
+ out_w = (W + 2 * self.sampler.padding[1] - self.sampler.dilation[1] *
+ (self.sampler.kernel_size[1] - 1) -
+ 1) // self.sampler.stride[1] + 1
+
+ output_size = (out_h, out_w)
+ x = x.transpose(1, 2) # B, H/2*W/2, 4*C
+ x = self.norm(x) if self.norm else x
+ x = self.reduction(x)
+ return x, output_size
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/tta.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/tta.py
new file mode 100644
index 0000000000000000000000000000000000000000..7538fce70d353c449fcef5dae2a3981a93b77697
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/models/utils/tta.py
@@ -0,0 +1,188 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import List, Optional, Tuple
+
+import torch
+import torch.nn.functional as F
+from torch import Tensor
+
+
+def flip_heatmaps(heatmaps: Tensor,
+ flip_indices: Optional[List[int]] = None,
+ flip_mode: str = 'heatmap',
+ shift_heatmap: bool = True):
+ """Flip heatmaps for test-time augmentation.
+
+ Args:
+ heatmaps (Tensor): The heatmaps to flip. Should be a tensor in shape
+ [B, C, H, W]
+ flip_indices (List[int]): The indices of each keypoint's symmetric
+ keypoint. Defaults to ``None``
+ flip_mode (str): Specify the flipping mode. Options are:
+
+ - ``'heatmap'``: horizontally flip the heatmaps and swap heatmaps
+ of symmetric keypoints according to ``flip_indices``
+ - ``'udp_combined'``: similar to ``'heatmap'`` mode but further
+ flip the x_offset values
+ - ``'offset'``: horizontally flip the offset fields and swap
+ heatmaps of symmetric keypoints according to
+ ``flip_indices``. x_offset values are also reversed
+ shift_heatmap (bool): Shift the flipped heatmaps to align with the
+ original heatmaps and improve accuracy. Defaults to ``True``
+
+ Returns:
+ Tensor: flipped heatmaps in shape [B, C, H, W]
+ """
+
+ if flip_mode == 'heatmap':
+ heatmaps = heatmaps.flip(-1)
+ if flip_indices is not None:
+ assert len(flip_indices) == heatmaps.shape[1]
+ heatmaps = heatmaps[:, flip_indices]
+ elif flip_mode == 'udp_combined':
+ B, C, H, W = heatmaps.shape
+ heatmaps = heatmaps.view(B, C // 3, 3, H, W)
+ heatmaps = heatmaps.flip(-1)
+ if flip_indices is not None:
+ assert len(flip_indices) == C // 3
+ heatmaps = heatmaps[:, flip_indices]
+ heatmaps[:, :, 1] = -heatmaps[:, :, 1]
+ heatmaps = heatmaps.view(B, C, H, W)
+
+ elif flip_mode == 'offset':
+ B, C, H, W = heatmaps.shape
+ heatmaps = heatmaps.view(B, C // 2, -1, H, W)
+ heatmaps = heatmaps.flip(-1)
+ if flip_indices is not None:
+ assert len(flip_indices) == C // 2
+ heatmaps = heatmaps[:, flip_indices]
+ heatmaps[:, :, 0] = -heatmaps[:, :, 0]
+ heatmaps = heatmaps.view(B, C, H, W)
+
+ else:
+ raise ValueError(f'Invalid flip_mode value "{flip_mode}"')
+
+ if shift_heatmap:
+ # clone data to avoid unexpected in-place operation when using CPU
+ heatmaps[..., 1:] = heatmaps[..., :-1].clone()
+
+ return heatmaps
+
+
+def flip_vectors(x_labels: Tensor, y_labels: Tensor, flip_indices: List[int]):
+ """Flip instance-level labels in specific axis for test-time augmentation.
+
+ Args:
+ x_labels (Tensor): The vector labels in x-axis to flip. Should be
+ a tensor in shape [B, C, Wx]
+ y_labels (Tensor): The vector labels in y-axis to flip. Should be
+ a tensor in shape [B, C, Wy]
+ flip_indices (List[int]): The indices of each keypoint's symmetric
+ keypoint
+ """
+ assert x_labels.ndim == 3 and y_labels.ndim == 3
+ assert len(flip_indices) == x_labels.shape[1] and len(
+ flip_indices) == y_labels.shape[1]
+ x_labels = x_labels[:, flip_indices].flip(-1)
+ y_labels = y_labels[:, flip_indices]
+
+ return x_labels, y_labels
+
+
+def flip_coordinates(coords: Tensor, flip_indices: List[int],
+ shift_coords: bool, input_size: Tuple[int, int]):
+ """Flip normalized coordinates for test-time augmentation.
+
+ Args:
+ coords (Tensor): The coordinates to flip. Should be a tensor in shape
+ [B, K, D]
+ flip_indices (List[int]): The indices of each keypoint's symmetric
+ keypoint
+ shift_coords (bool): Shift the flipped coordinates to align with the
+ original coordinates and improve accuracy. Defaults to ``True``
+ input_size (Tuple[int, int]): The size of input image in [w, h]
+ """
+ assert coords.ndim == 3
+ assert len(flip_indices) == coords.shape[1]
+
+ coords[:, :, 0] = 1.0 - coords[:, :, 0]
+
+ if shift_coords:
+ img_width = input_size[0]
+ coords[:, :, 0] -= 1.0 / img_width
+
+ coords = coords[:, flip_indices]
+ return coords
+
+
+def flip_visibility(vis: Tensor, flip_indices: List[int]):
+ """Flip keypoints visibility for test-time augmentation.
+
+ Args:
+ vis (Tensor): The keypoints visibility to flip. Should be a tensor
+ in shape [B, K]
+ flip_indices (List[int]): The indices of each keypoint's symmetric
+ keypoint
+ """
+ assert vis.ndim == 2
+
+ vis = vis[:, flip_indices]
+ return vis
+
+
+def aggregate_heatmaps(heatmaps: List[Tensor],
+ size: Optional[Tuple[int, int]],
+ align_corners: bool = False,
+ mode: str = 'average'):
+ """Aggregate multiple heatmaps.
+
+ Args:
+ heatmaps (List[Tensor]): Multiple heatmaps to aggregate. Each should
+ be in shape (B, C, H, W)
+ size (Tuple[int, int], optional): The target size in (w, h). All
+ heatmaps will be resized to the target size. If not given, the
+ first heatmap tensor's width and height will be used as the target
+ size. Defaults to ``None``
+ align_corners (bool): Whether align corners when resizing heatmaps.
+ Defaults to ``False``
+ mode (str): Aggregation mode in one of the following:
+
+ - ``'average'``: Get average of heatmaps. All heatmaps mush have
+ the same channel number
+ - ``'concat'``: Concate the heatmaps at the channel dim
+ """
+
+ if mode not in {'average', 'concat'}:
+ raise ValueError(f'Invalid aggregation mode `{mode}`')
+
+ if size is None:
+ h, w = heatmaps[0].shape[2:4]
+ else:
+ w, h = size
+
+ for i, _heatmaps in enumerate(heatmaps):
+ assert _heatmaps.ndim == 4
+ if mode == 'average':
+ assert _heatmaps.shape[:2] == heatmaps[0].shape[:2]
+ else:
+ assert _heatmaps.shape[0] == heatmaps[0].shape[0]
+
+ if _heatmaps.shape[2:4] != (h, w):
+ heatmaps[i] = F.interpolate(
+ _heatmaps,
+ size=(h, w),
+ mode='bilinear',
+ align_corners=align_corners)
+
+ if mode == 'average':
+ output = sum(heatmaps).div(len(heatmaps))
+ elif mode == 'concat':
+ output = torch.cat(heatmaps, dim=1)
+ else:
+ raise ValueError()
+
+ return output
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/registry.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/registry.py
new file mode 100644
index 0000000000000000000000000000000000000000..f4e93938a2d5c9b6d856469bc49f4ee3c4f81323
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/registry.py
@@ -0,0 +1,137 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+"""MMPose provides following registry nodes to support using modules across
+projects.
+
+Each node is a child of the root registry in MMEngine.
+More details can be found at
+https://mmengine.readthedocs.io/en/latest/tutorials/registry.html.
+"""
+
+from mmengine.registry import DATA_SAMPLERS as MMENGINE_DATA_SAMPLERS
+from mmengine.registry import DATASETS as MMENGINE_DATASETS
+from mmengine.registry import EVALUATOR as MMENGINE_EVALUATOR
+from mmengine.registry import HOOKS as MMENGINE_HOOKS
+from mmengine.registry import INFERENCERS as MMENGINE_INFERENCERS
+from mmengine.registry import LOG_PROCESSORS as MMENGINE_LOG_PROCESSORS
+from mmengine.registry import LOOPS as MMENGINE_LOOPS
+from mmengine.registry import METRICS as MMENGINE_METRICS
+from mmengine.registry import MODEL_WRAPPERS as MMENGINE_MODEL_WRAPPERS
+from mmengine.registry import MODELS as MMENGINE_MODELS
+from mmengine.registry import \
+ OPTIM_WRAPPER_CONSTRUCTORS as MMENGINE_OPTIM_WRAPPER_CONSTRUCTORS
+from mmengine.registry import OPTIM_WRAPPERS as MMENGINE_OPTIM_WRAPPERS
+from mmengine.registry import OPTIMIZERS as MMENGINE_OPTIMIZERS
+from mmengine.registry import PARAM_SCHEDULERS as MMENGINE_PARAM_SCHEDULERS
+from mmengine.registry import \
+ RUNNER_CONSTRUCTORS as MMENGINE_RUNNER_CONSTRUCTORS
+from mmengine.registry import RUNNERS as MMENGINE_RUNNERS
+from mmengine.registry import TASK_UTILS as MMENGINE_TASK_UTILS
+from mmengine.registry import TRANSFORMS as MMENGINE_TRANSFORMS
+from mmengine.registry import VISBACKENDS as MMENGINE_VISBACKENDS
+from mmengine.registry import VISUALIZERS as MMENGINE_VISUALIZERS
+from mmengine.registry import \
+ WEIGHT_INITIALIZERS as MMENGINE_WEIGHT_INITIALIZERS
+from mmengine.registry import Registry
+
+# Registries For Runner and the related
+# manage all kinds of runners like `EpochBasedRunner` and `IterBasedRunner`
+RUNNERS = Registry('runner', parent=MMENGINE_RUNNERS)
+# manage runner constructors that define how to initialize runners
+RUNNER_CONSTRUCTORS = Registry(
+ 'runner constructor', parent=MMENGINE_RUNNER_CONSTRUCTORS)
+# manage all kinds of loops like `EpochBasedTrainLoop`
+LOOPS = Registry('loop', parent=MMENGINE_LOOPS)
+# manage all kinds of hooks like `CheckpointHook`
+HOOKS = Registry(
+ 'hook', parent=MMENGINE_HOOKS, locations=['mmpose.engine.hooks'])
+
+# Registries For Data and the related
+# manage data-related modules
+DATASETS = Registry(
+ 'dataset', parent=MMENGINE_DATASETS, locations=['mmpose.datasets'])
+DATA_SAMPLERS = Registry(
+ 'data sampler',
+ parent=MMENGINE_DATA_SAMPLERS,
+ locations=['mmpose.datasets.samplers'])
+TRANSFORMS = Registry(
+ 'transform',
+ parent=MMENGINE_TRANSFORMS,
+ locations=['mmpose.datasets.transforms'])
+
+# manage all kinds of modules inheriting `nn.Module`
+MODELS = Registry('model', parent=MMENGINE_MODELS, locations=['mmpose.models'])
+# manage all kinds of model wrappers like 'MMDistributedDataParallel'
+MODEL_WRAPPERS = Registry(
+ 'model_wrapper',
+ parent=MMENGINE_MODEL_WRAPPERS,
+ locations=['mmpose.models'])
+# manage all kinds of weight initialization modules like `Uniform`
+WEIGHT_INITIALIZERS = Registry(
+ 'weight initializer',
+ parent=MMENGINE_WEIGHT_INITIALIZERS,
+ locations=['mmpose.models'])
+# manage all kinds of batch augmentations like Mixup and CutMix.
+BATCH_AUGMENTS = Registry('batch augment', locations=['mmpose.models'])
+
+# Registries For Optimizer and the related
+# manage all kinds of optimizers like `SGD` and `Adam`
+OPTIMIZERS = Registry(
+ 'optimizer', parent=MMENGINE_OPTIMIZERS, locations=['mmpose.engine'])
+# manage optimizer wrapper
+OPTIM_WRAPPERS = Registry(
+ 'optimizer_wrapper',
+ parent=MMENGINE_OPTIM_WRAPPERS,
+ locations=['mmpose.engine'])
+# manage constructors that customize the optimization hyperparameters.
+OPTIM_WRAPPER_CONSTRUCTORS = Registry(
+ 'optimizer wrapper constructor',
+ parent=MMENGINE_OPTIM_WRAPPER_CONSTRUCTORS,
+ locations=['mmpose.engine.optim_wrappers'])
+# manage all kinds of parameter schedulers like `MultiStepLR`
+PARAM_SCHEDULERS = Registry(
+ 'parameter scheduler',
+ parent=MMENGINE_PARAM_SCHEDULERS,
+ locations=['mmpose.engine'])
+
+# manage all kinds of metrics
+METRICS = Registry(
+ 'metric', parent=MMENGINE_METRICS, locations=['mmpose.evaluation.metrics'])
+# manage all kinds of evaluators
+EVALUATORS = Registry(
+ 'evaluator', parent=MMENGINE_EVALUATOR, locations=['mmpose.evaluation'])
+
+# manage task-specific modules like anchor generators and box coders
+TASK_UTILS = Registry(
+ 'task util', parent=MMENGINE_TASK_UTILS, locations=['mmpose.models'])
+
+# Registries For Visualizer and the related
+# manage visualizer
+VISUALIZERS = Registry(
+ 'visualizer',
+ parent=MMENGINE_VISUALIZERS,
+ locations=['mmpose.visualization'])
+# manage visualizer backend
+VISBACKENDS = Registry(
+ 'vis_backend',
+ parent=MMENGINE_VISBACKENDS,
+ locations=['mmpose.visualization'])
+
+# manage all kinds log processors
+LOG_PROCESSORS = Registry(
+ 'log processor',
+ parent=MMENGINE_LOG_PROCESSORS,
+ locations=['mmpose.visualization'])
+
+# manager keypoint encoder/decoder
+KEYPOINT_CODECS = Registry('KEYPOINT_CODECS', locations=['mmpose.codecs'])
+
+# manage inferencer
+INFERENCERS = Registry(
+ 'inferencer',
+ parent=MMENGINE_INFERENCERS,
+ locations=['mmpose.apis.inferencers'])
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..965b23b2f33bc36db8b7d4eec005511e82611319
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/__init__.py
@@ -0,0 +1,20 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .bbox import (bbox_cs2xywh, bbox_cs2xyxy, bbox_xywh2cs, bbox_xywh2xyxy,
+ bbox_xyxy2cs, bbox_xyxy2xywh, flip_bbox,
+ get_udp_warp_matrix, get_warp_matrix)
+from .keypoint import flip_keypoints
+from .multilevel_pixel_data import MultilevelPixelData
+from .pose_data_sample import PoseDataSample
+from .utils import merge_data_samples, revert_heatmap, split_instances
+
+__all__ = [
+ 'PoseDataSample', 'MultilevelPixelData', 'bbox_cs2xywh', 'bbox_cs2xyxy',
+ 'bbox_xywh2cs', 'bbox_xywh2xyxy', 'bbox_xyxy2cs', 'bbox_xyxy2xywh',
+ 'flip_bbox', 'get_udp_warp_matrix', 'get_warp_matrix', 'flip_keypoints',
+ 'merge_data_samples', 'revert_heatmap', 'split_instances'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..72fe316758dbcc7ac0284f94a94b3c401dc3644f
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/__pycache__/multilevel_pixel_data.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/__pycache__/multilevel_pixel_data.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..acdda8c81ad04b459cd1d4f968166304271088f5
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/__pycache__/multilevel_pixel_data.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/__pycache__/pose_data_sample.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/__pycache__/pose_data_sample.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..45469321bcbae9a296c85ce32eb0be44e4638ed5
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/__pycache__/pose_data_sample.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/__pycache__/utils.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/__pycache__/utils.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d9de9b4e4ac7c179d15837b043094ffa41063b98
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/__pycache__/utils.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/bbox/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/bbox/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..c742c93a35a941ba0b8f7fd40d7cc735390b3039
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/bbox/__init__.py
@@ -0,0 +1,15 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .transforms import (bbox_cs2xywh, bbox_cs2xyxy, bbox_xywh2cs,
+ bbox_xywh2xyxy, bbox_xyxy2cs, bbox_xyxy2xywh,
+ flip_bbox, get_udp_warp_matrix, get_warp_matrix)
+
+__all__ = [
+ 'bbox_cs2xywh', 'bbox_cs2xyxy', 'bbox_xywh2cs', 'bbox_xywh2xyxy',
+ 'bbox_xyxy2cs', 'bbox_xyxy2xywh', 'flip_bbox', 'get_udp_warp_matrix',
+ 'get_warp_matrix'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/bbox/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/bbox/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e5346d863f9967f6cd0570c30af3278babb5b01e
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/bbox/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/bbox/__pycache__/transforms.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/bbox/__pycache__/transforms.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..afb8728153604e29d3e1861bab2abfe167b8521c
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/bbox/__pycache__/transforms.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/bbox/transforms.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/bbox/transforms.py
new file mode 100644
index 0000000000000000000000000000000000000000..f9358e856e6d701cd398be427fe0f6f3d7a01989
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/bbox/transforms.py
@@ -0,0 +1,366 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import math
+from typing import Tuple
+
+import cv2
+import numpy as np
+
+
+def bbox_xyxy2xywh(bbox_xyxy: np.ndarray) -> np.ndarray:
+ """Transform the bbox format from x1y1x2y2 to xywh.
+
+ Args:
+ bbox_xyxy (np.ndarray): Bounding boxes (with scores), shaped (n, 4) or
+ (n, 5). (left, top, right, bottom, [score])
+
+ Returns:
+ np.ndarray: Bounding boxes (with scores),
+ shaped (n, 4) or (n, 5). (left, top, width, height, [score])
+ """
+ bbox_xywh = bbox_xyxy.copy()
+ bbox_xywh[:, 2] = bbox_xywh[:, 2] - bbox_xywh[:, 0]
+ bbox_xywh[:, 3] = bbox_xywh[:, 3] - bbox_xywh[:, 1]
+
+ return bbox_xywh
+
+
+def bbox_xywh2xyxy(bbox_xywh: np.ndarray) -> np.ndarray:
+ """Transform the bbox format from xywh to x1y1x2y2.
+
+ Args:
+ bbox_xywh (ndarray): Bounding boxes (with scores),
+ shaped (n, 4) or (n, 5). (left, top, width, height, [score])
+ Returns:
+ np.ndarray: Bounding boxes (with scores), shaped (n, 4) or
+ (n, 5). (left, top, right, bottom, [score])
+ """
+ bbox_xyxy = bbox_xywh.copy()
+ bbox_xyxy[:, 2] = bbox_xyxy[:, 2] + bbox_xyxy[:, 0]
+ bbox_xyxy[:, 3] = bbox_xyxy[:, 3] + bbox_xyxy[:, 1]
+
+ return bbox_xyxy
+
+
+def bbox_xyxy2cs(bbox: np.ndarray,
+ padding: float = 1.) -> Tuple[np.ndarray, np.ndarray]:
+ """Transform the bbox format from (x,y,w,h) into (center, scale)
+
+ Args:
+ bbox (ndarray): Bounding box(es) in shape (4,) or (n, 4), formatted
+ as (left, top, right, bottom)
+ padding (float): BBox padding factor that will be multilied to scale.
+ Default: 1.0
+
+ Returns:
+ tuple: A tuple containing center and scale.
+ - np.ndarray[float32]: Center (x, y) of the bbox in shape (2,) or
+ (n, 2)
+ - np.ndarray[float32]: Scale (w, h) of the bbox in shape (2,) or
+ (n, 2)
+ """
+ # convert single bbox from (4, ) to (1, 4)
+ dim = bbox.ndim
+ if dim == 1:
+ bbox = bbox[None, :]
+
+ x1, y1, x2, y2 = np.hsplit(bbox, [1, 2, 3])
+ center = np.hstack([x1 + x2, y1 + y2]) * 0.5
+ scale = np.hstack([x2 - x1, y2 - y1]) * padding
+
+ if dim == 1:
+ center = center[0]
+ scale = scale[0]
+
+ return center, scale
+
+
+def bbox_xywh2cs(bbox: np.ndarray,
+ padding: float = 1.) -> Tuple[np.ndarray, np.ndarray]:
+ """Transform the bbox format from (x,y,w,h) into (center, scale)
+
+ Args:
+ bbox (ndarray): Bounding box(es) in shape (4,) or (n, 4), formatted
+ as (x, y, h, w)
+ padding (float): BBox padding factor that will be multilied to scale.
+ Default: 1.0
+
+ Returns:
+ tuple: A tuple containing center and scale.
+ - np.ndarray[float32]: Center (x, y) of the bbox in shape (2,) or
+ (n, 2)
+ - np.ndarray[float32]: Scale (w, h) of the bbox in shape (2,) or
+ (n, 2)
+ """
+
+ # convert single bbox from (4, ) to (1, 4)
+ dim = bbox.ndim
+ if dim == 1:
+ bbox = bbox[None, :]
+
+ x, y, w, h = np.hsplit(bbox, [1, 2, 3])
+ center = np.hstack([x + w * 0.5, y + h * 0.5])
+ scale = np.hstack([w, h]) * padding
+
+ if dim == 1:
+ center = center[0]
+ scale = scale[0]
+
+ return center, scale
+
+
+def bbox_cs2xyxy(center: np.ndarray,
+ scale: np.ndarray,
+ padding: float = 1.) -> np.ndarray:
+ """Transform the bbox format from (center, scale) to (x1,y1,x2,y2).
+
+ Args:
+ center (ndarray): BBox center (x, y) in shape (2,) or (n, 2)
+ scale (ndarray): BBox scale (w, h) in shape (2,) or (n, 2)
+ padding (float): BBox padding factor that will be multilied to scale.
+ Default: 1.0
+
+ Returns:
+ ndarray[float32]: BBox (x1, y1, x2, y2) in shape (4, ) or (n, 4)
+ """
+
+ dim = center.ndim
+ assert scale.ndim == dim
+
+ if dim == 1:
+ center = center[None, :]
+ scale = scale[None, :]
+
+ wh = scale / padding
+ xy = center - 0.5 * wh
+ bbox = np.hstack((xy, xy + wh))
+
+ if dim == 1:
+ bbox = bbox[0]
+
+ return bbox
+
+
+def bbox_cs2xywh(center: np.ndarray,
+ scale: np.ndarray,
+ padding: float = 1.) -> np.ndarray:
+ """Transform the bbox format from (center, scale) to (x,y,w,h).
+
+ Args:
+ center (ndarray): BBox center (x, y) in shape (2,) or (n, 2)
+ scale (ndarray): BBox scale (w, h) in shape (2,) or (n, 2)
+ padding (float): BBox padding factor that will be multilied to scale.
+ Default: 1.0
+
+ Returns:
+ ndarray[float32]: BBox (x, y, w, h) in shape (4, ) or (n, 4)
+ """
+
+ dim = center.ndim
+ assert scale.ndim == dim
+
+ if dim == 1:
+ center = center[None, :]
+ scale = scale[None, :]
+
+ wh = scale / padding
+ xy = center - 0.5 * wh
+ bbox = np.hstack((xy, wh))
+
+ if dim == 1:
+ bbox = bbox[0]
+
+ return bbox
+
+
+def flip_bbox(bbox: np.ndarray,
+ image_size: Tuple[int, int],
+ bbox_format: str = 'xywh',
+ direction: str = 'horizontal') -> np.ndarray:
+ """Flip the bbox in the given direction.
+
+ Args:
+ bbox (np.ndarray): The bounding boxes. The shape should be (..., 4)
+ if ``bbox_format`` is ``'xyxy'`` or ``'xywh'``, and (..., 2) if
+ ``bbox_format`` is ``'center'``
+ image_size (tuple): The image shape in [w, h]
+ bbox_format (str): The bbox format. Options are ``'xywh'``, ``'xyxy'``
+ and ``'center'``.
+ direction (str): The flip direction. Options are ``'horizontal'``,
+ ``'vertical'`` and ``'diagonal'``. Defaults to ``'horizontal'``
+
+ Returns:
+ np.ndarray: The flipped bounding boxes.
+ """
+ direction_options = {'horizontal', 'vertical', 'diagonal'}
+ assert direction in direction_options, (
+ f'Invalid flipping direction "{direction}". '
+ f'Options are {direction_options}')
+
+ format_options = {'xywh', 'xyxy', 'center'}
+ assert bbox_format in format_options, (
+ f'Invalid bbox format "{bbox_format}". '
+ f'Options are {format_options}')
+
+ bbox_flipped = bbox.copy()
+ w, h = image_size
+
+ # TODO: consider using "integer corner" coordinate system
+ if direction == 'horizontal':
+ if bbox_format == 'xywh' or bbox_format == 'center':
+ bbox_flipped[..., 0] = w - bbox[..., 0] - 1
+ elif bbox_format == 'xyxy':
+ bbox_flipped[..., ::2] = w - bbox[..., ::2] - 1
+ elif direction == 'vertical':
+ if bbox_format == 'xywh' or bbox_format == 'center':
+ bbox_flipped[..., 1] = h - bbox[..., 1] - 1
+ elif bbox_format == 'xyxy':
+ bbox_flipped[..., 1::2] = h - bbox[..., 1::2] - 1
+ elif direction == 'diagonal':
+ if bbox_format == 'xywh' or bbox_format == 'center':
+ bbox_flipped[..., :2] = [w, h] - bbox[..., :2] - 1
+ elif bbox_format == 'xyxy':
+ bbox_flipped[...] = [w, h, w, h] - bbox - 1
+
+ return bbox_flipped
+
+
+def get_udp_warp_matrix(
+ center: np.ndarray,
+ scale: np.ndarray,
+ rot: float,
+ output_size: Tuple[int, int],
+) -> np.ndarray:
+ """Calculate the affine transformation matrix under the unbiased
+ constraint. See `UDP (CVPR 2020)`_ for details.
+
+ Note:
+
+ - The bbox number: N
+
+ Args:
+ center (np.ndarray[2, ]): Center of the bounding box (x, y).
+ scale (np.ndarray[2, ]): Scale of the bounding box
+ wrt [width, height].
+ rot (float): Rotation angle (degree).
+ output_size (tuple): Size ([w, h]) of the output image
+
+ Returns:
+ np.ndarray: A 2x3 transformation matrix
+
+ .. _`UDP (CVPR 2020)`: https://arxiv.org/abs/1911.07524
+ """
+ assert len(center) == 2
+ assert len(scale) == 2
+ assert len(output_size) == 2
+
+ input_size = center * 2
+ rot_rad = np.deg2rad(rot)
+ warp_mat = np.zeros((2, 3), dtype=np.float32)
+ scale_x = (output_size[0] - 1) / scale[0]
+ scale_y = (output_size[1] - 1) / scale[1]
+ warp_mat[0, 0] = math.cos(rot_rad) * scale_x
+ warp_mat[0, 1] = -math.sin(rot_rad) * scale_x
+ warp_mat[0, 2] = scale_x * (-0.5 * input_size[0] * math.cos(rot_rad) +
+ 0.5 * input_size[1] * math.sin(rot_rad) +
+ 0.5 * scale[0])
+ warp_mat[1, 0] = math.sin(rot_rad) * scale_y
+ warp_mat[1, 1] = math.cos(rot_rad) * scale_y
+ warp_mat[1, 2] = scale_y * (-0.5 * input_size[0] * math.sin(rot_rad) -
+ 0.5 * input_size[1] * math.cos(rot_rad) +
+ 0.5 * scale[1])
+ return warp_mat
+
+
+def get_warp_matrix(center: np.ndarray,
+ scale: np.ndarray,
+ rot: float,
+ output_size: Tuple[int, int],
+ shift: Tuple[float, float] = (0., 0.),
+ inv: bool = False) -> np.ndarray:
+ """Calculate the affine transformation matrix that can warp the bbox area
+ in the input image to the output size.
+
+ Args:
+ center (np.ndarray[2, ]): Center of the bounding box (x, y).
+ scale (np.ndarray[2, ]): Scale of the bounding box
+ wrt [width, height].
+ rot (float): Rotation angle (degree).
+ output_size (np.ndarray[2, ] | list(2,)): Size of the
+ destination heatmaps.
+ shift (0-100%): Shift translation ratio wrt the width/height.
+ Default (0., 0.).
+ inv (bool): Option to inverse the affine transform direction.
+ (inv=False: src->dst or inv=True: dst->src)
+
+ Returns:
+ np.ndarray: A 2x3 transformation matrix
+ """
+ assert len(center) == 2
+ assert len(scale) == 2
+ assert len(output_size) == 2
+ assert len(shift) == 2
+
+ shift = np.array(shift)
+ src_w = scale[0]
+ dst_w = output_size[0]
+ dst_h = output_size[1]
+
+ rot_rad = np.deg2rad(rot)
+ src_dir = _rotate_point(np.array([0., src_w * -0.5]), rot_rad)
+ dst_dir = np.array([0., dst_w * -0.5])
+
+ src = np.zeros((3, 2), dtype=np.float32)
+ src[0, :] = center + scale * shift
+ src[1, :] = center + src_dir + scale * shift
+ src[2, :] = _get_3rd_point(src[0, :], src[1, :])
+
+ dst = np.zeros((3, 2), dtype=np.float32)
+ dst[0, :] = [dst_w * 0.5, dst_h * 0.5]
+ dst[1, :] = np.array([dst_w * 0.5, dst_h * 0.5]) + dst_dir
+ dst[2, :] = _get_3rd_point(dst[0, :], dst[1, :])
+
+ if inv:
+ warp_mat = cv2.getAffineTransform(np.float32(dst), np.float32(src))
+ else:
+ warp_mat = cv2.getAffineTransform(np.float32(src), np.float32(dst))
+ return warp_mat
+
+
+def _rotate_point(pt: np.ndarray, angle_rad: float) -> np.ndarray:
+ """Rotate a point by an angle.
+
+ Args:
+ pt (np.ndarray): 2D point coordinates (x, y) in shape (2, )
+ angle_rad (float): rotation angle in radian
+
+ Returns:
+ np.ndarray: Rotated point in shape (2, )
+ """
+
+ sn, cs = np.sin(angle_rad), np.cos(angle_rad)
+ rot_mat = np.array([[cs, -sn], [sn, cs]])
+ return rot_mat @ pt
+
+
+def _get_3rd_point(a: np.ndarray, b: np.ndarray):
+ """To calculate the affine matrix, three pairs of points are required. This
+ function is used to get the 3rd point, given 2D points a & b.
+
+ The 3rd point is defined by rotating vector `a - b` by 90 degrees
+ anticlockwise, using b as the rotation center.
+
+ Args:
+ a (np.ndarray): The 1st point (x,y) in shape (2, )
+ b (np.ndarray): The 2nd point (x,y) in shape (2, )
+
+ Returns:
+ np.ndarray: The 3rd point.
+ """
+ direction = a - b
+ c = b + np.r_[-direction[1], direction[0]]
+ return c
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/keypoint/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/keypoint/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..7f56ca04d0d4e44d80280bf51fc63e121928e6d2
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/keypoint/__init__.py
@@ -0,0 +1,10 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+
+from .transforms import flip_keypoints, flip_keypoints_custom_center
+
+__all__ = ['flip_keypoints', 'flip_keypoints_custom_center']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/keypoint/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/keypoint/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a1a80d86c55e4089b8afda17d55c19cc084ca2e0
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/keypoint/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/keypoint/__pycache__/transforms.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/keypoint/__pycache__/transforms.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9c33d8bb2a5d116cb6b94a8ea1f50f6d106d873e
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/keypoint/__pycache__/transforms.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/keypoint/transforms.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/keypoint/transforms.py
new file mode 100644
index 0000000000000000000000000000000000000000..5c95b4927b864b19c0f5e2d801a6a7a90643b92e
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/keypoint/transforms.py
@@ -0,0 +1,126 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import List, Optional, Tuple
+
+import numpy as np
+
+
+def flip_keypoints(keypoints: np.ndarray,
+ keypoints_visible: Optional[np.ndarray],
+ image_size: Tuple[int, int],
+ flip_indices: List[int],
+ direction: str = 'horizontal'
+ ) -> Tuple[np.ndarray, Optional[np.ndarray]]:
+ """Flip keypoints in the given direction.
+
+ Note:
+
+ - keypoint number: K
+ - keypoint dimension: D
+
+ Args:
+ keypoints (np.ndarray): Keypoints in shape (..., K, D)
+ keypoints_visible (np.ndarray, optional): The visibility of keypoints
+ in shape (..., K, 1). Set ``None`` if the keypoint visibility is
+ unavailable
+ image_size (tuple): The image shape in [w, h]
+ flip_indices (List[int]): The indices of each keypoint's symmetric
+ keypoint
+ direction (str): The flip direction. Options are ``'horizontal'``,
+ ``'vertical'`` and ``'diagonal'``. Defaults to ``'horizontal'``
+
+ Returns:
+ tuple:
+ - keypoints_flipped (np.ndarray): Flipped keypoints in shape
+ (..., K, D)
+ - keypoints_visible_flipped (np.ndarray, optional): Flipped keypoints'
+ visibility in shape (..., K, 1). Return ``None`` if the input
+ ``keypoints_visible`` is ``None``
+ """
+
+ assert keypoints.shape[:-1] == keypoints_visible.shape, (
+ f'Mismatched shapes of keypoints {keypoints.shape} and '
+ f'keypoints_visible {keypoints_visible.shape}')
+
+ direction_options = {'horizontal', 'vertical', 'diagonal'}
+ assert direction in direction_options, (
+ f'Invalid flipping direction "{direction}". '
+ f'Options are {direction_options}')
+
+ # swap the symmetric keypoint pairs
+ if direction == 'horizontal' or direction == 'vertical':
+ keypoints = keypoints[..., flip_indices, :]
+ if keypoints_visible is not None:
+ keypoints_visible = keypoints_visible[..., flip_indices]
+
+ # flip the keypoints
+ w, h = image_size
+ if direction == 'horizontal':
+ keypoints[..., 0] = w - 1 - keypoints[..., 0]
+ elif direction == 'vertical':
+ keypoints[..., 1] = h - 1 - keypoints[..., 1]
+ else:
+ keypoints = [w, h] - keypoints - 1
+
+ return keypoints, keypoints_visible
+
+
+def flip_keypoints_custom_center(keypoints: np.ndarray,
+ keypoints_visible: np.ndarray,
+ flip_indices: List[int],
+ center_mode: str = 'static',
+ center_x: float = 0.5,
+ center_index: int = 0):
+ """Flip human joints horizontally.
+
+ Note:
+ - num_keypoint: K
+ - dimension: D
+
+ Args:
+ keypoints (np.ndarray([..., K, D])): Coordinates of keypoints.
+ keypoints_visible (np.ndarray([..., K])): Visibility item of keypoints.
+ flip_indices (list[int]): The indices to flip the keypoints.
+ center_mode (str): The mode to set the center location on the x-axis
+ to flip around. Options are:
+
+ - static: use a static x value (see center_x also)
+ - root: use a root joint (see center_index also)
+
+ Defaults: ``'static'``.
+ center_x (float): Set the x-axis location of the flip center. Only used
+ when ``center_mode`` is ``'static'``. Defaults: 0.5.
+ center_index (int): Set the index of the root joint, whose x location
+ will be used as the flip center. Only used when ``center_mode`` is
+ ``'root'``. Defaults: 0.
+
+ Returns:
+ np.ndarray([..., K, C]): Flipped joints.
+ """
+
+ assert keypoints.ndim >= 2, f'Invalid pose shape {keypoints.shape}'
+
+ allowed_center_mode = {'static', 'root'}
+ assert center_mode in allowed_center_mode, 'Get invalid center_mode ' \
+ f'{center_mode}, allowed choices are {allowed_center_mode}'
+
+ if center_mode == 'static':
+ x_c = center_x
+ elif center_mode == 'root':
+ assert keypoints.shape[-2] > center_index
+ x_c = keypoints[..., center_index, 0]
+
+ keypoints_flipped = keypoints.copy()
+ keypoints_visible_flipped = keypoints_visible.copy()
+ # Swap left-right parts
+ for left, right in enumerate(flip_indices):
+ keypoints_flipped[..., left, :] = keypoints[..., right, :]
+ keypoints_visible_flipped[..., left] = keypoints_visible[..., right]
+
+ # Flip horizontally
+ keypoints_flipped[..., 0] = x_c * 2 - keypoints_flipped[..., 0]
+ return keypoints_flipped, keypoints_visible_flipped
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/multilevel_pixel_data.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/multilevel_pixel_data.py
new file mode 100644
index 0000000000000000000000000000000000000000..d38962b160811b8c0be1d5e1412882caf23c6b22
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/multilevel_pixel_data.py
@@ -0,0 +1,278 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from collections import abc
+from typing import Any, Callable, List, Optional, Sequence, Tuple, Type, Union
+
+import numpy as np
+import torch
+from mmengine.structures import BaseDataElement, PixelData
+from mmengine.utils import is_list_of
+
+IndexType = Union[str, slice, int, list, torch.LongTensor,
+ torch.cuda.LongTensor, torch.BoolTensor,
+ torch.cuda.BoolTensor, np.ndarray]
+
+
+class MultilevelPixelData(BaseDataElement):
+ """Data structure for multi-level pixel-wise annotations or predictions.
+
+ All data items in ``data_fields`` of ``MultilevelPixelData`` are lists
+ of np.ndarray or torch.Tensor, and should meet the following requirements:
+
+ - Have the same length, which is the number of levels
+ - At each level, the data should have 3 dimensions in order of channel,
+ height and weight
+ - At each level, the data should have the same height and weight
+
+ Examples:
+ >>> metainfo = dict(num_keypoints=17)
+ >>> sizes = [(64, 48), (128, 96), (256, 192)]
+ >>> heatmaps = [np.random.rand(17, h, w) for h, w in sizes]
+ >>> masks = [torch.rand(1, h, w) for h, w in sizes]
+ >>> data = MultilevelPixelData(metainfo=metainfo,
+ ... heatmaps=heatmaps,
+ ... masks=masks)
+
+ >>> # get data item
+ >>> heatmaps = data.heatmaps # A list of 3 numpy.ndarrays
+ >>> masks = data.masks # A list of 3 torch.Tensors
+
+ >>> # get level
+ >>> data_l0 = data[0] # PixelData with fields 'heatmaps' and 'masks'
+ >>> data.nlevel
+ 3
+
+ >>> # get shape
+ >>> data.shape
+ ((64, 48), (128, 96), (256, 192))
+
+ >>> # set
+ >>> offset_maps = [torch.rand(2, h, w) for h, w in sizes]
+ >>> data.offset_maps = offset_maps
+ """
+
+ def __init__(self, *, metainfo: Optional[dict] = None, **kwargs) -> None:
+ object.__setattr__(self, '_nlevel', None)
+ super().__init__(metainfo=metainfo, **kwargs)
+
+ @property
+ def nlevel(self):
+ """Return the level number.
+
+ Returns:
+ Optional[int]: The level number, or ``None`` if the data has not
+ been assigned.
+ """
+ return self._nlevel
+
+ def __getitem__(self, item: Union[int, str, list,
+ slice]) -> Union[PixelData, Sequence]:
+ if isinstance(item, int):
+ if self.nlevel is None or item >= self.nlevel:
+ raise IndexError(
+ f'Lcale index {item} out of range ({self.nlevel})')
+ return self.get(f'_level_{item}')
+
+ if isinstance(item, str):
+ if item not in self:
+ raise KeyError(item)
+ return getattr(self, item)
+
+ # TODO: support indexing by list and slice over levels
+ raise NotImplementedError(
+ f'{self.__class__.__name__} does not support index type '
+ f'{type(item)}')
+
+ def levels(self) -> List[PixelData]:
+ if self.nlevel:
+ return list(self[i] for i in range(self.nlevel))
+ return []
+
+ @property
+ def shape(self) -> Optional[Tuple[Tuple]]:
+ """Get the shape of multi-level pixel data.
+
+ Returns:
+ Optional[tuple]: A tuple of data shape at each level, or ``None``
+ if the data has not been assigned.
+ """
+ if self.nlevel is None:
+ return None
+
+ return tuple(level.shape for level in self.levels())
+
+ def set_data(self, data: dict) -> None:
+ """Set or change key-value pairs in ``data_field`` by parameter
+ ``data``.
+
+ Args:
+ data (dict): A dict contains annotations of image or
+ model predictions.
+ """
+ assert isinstance(data,
+ dict), f'meta should be a `dict` but got {data}'
+ for k, v in data.items():
+ self.set_field(v, k, field_type='data')
+
+ def set_field(self,
+ value: Any,
+ name: str,
+ dtype: Optional[Union[Type, Tuple[Type, ...]]] = None,
+ field_type: str = 'data') -> None:
+ """Special method for set union field, used as property.setter
+ functions."""
+ assert field_type in ['metainfo', 'data']
+ if dtype is not None:
+ assert isinstance(
+ value,
+ dtype), f'{value} should be a {dtype} but got {type(value)}'
+
+ if name.startswith('_level_'):
+ raise AttributeError(
+ f'Cannot set {name} to be a field because the pattern '
+ '<_level_{n}> is reserved for inner data field')
+
+ if field_type == 'metainfo':
+ if name in self._data_fields:
+ raise AttributeError(
+ f'Cannot set {name} to be a field of metainfo '
+ f'because {name} is already a data field')
+ self._metainfo_fields.add(name)
+
+ else:
+ if name in self._metainfo_fields:
+ raise AttributeError(
+ f'Cannot set {name} to be a field of data '
+ f'because {name} is already a metainfo field')
+
+ if not isinstance(value, abc.Sequence):
+ raise TypeError(
+ 'The value should be a sequence (of numpy.ndarray or'
+ f'torch.Tesnor), but got a {type(value)}')
+
+ if len(value) == 0:
+ raise ValueError('Setting empty value is not allowed')
+
+ if not isinstance(value[0], (torch.Tensor, np.ndarray)):
+ raise TypeError(
+ 'The value should be a sequence of numpy.ndarray or'
+ f'torch.Tesnor, but got a sequence of {type(value[0])}')
+
+ if self.nlevel is not None:
+ assert len(value) == self.nlevel, (
+ f'The length of the value ({len(value)}) should match the'
+ f'number of the levels ({self.nlevel})')
+ else:
+ object.__setattr__(self, '_nlevel', len(value))
+ for i in range(self.nlevel):
+ object.__setattr__(self, f'_level_{i}', PixelData())
+
+ for i, v in enumerate(value):
+ self[i].set_field(v, name, field_type='data')
+
+ self._data_fields.add(name)
+
+ object.__setattr__(self, name, value)
+
+ def __delattr__(self, item: str):
+ """delete the item in dataelement.
+
+ Args:
+ item (str): The key to delete.
+ """
+ if item in ('_metainfo_fields', '_data_fields'):
+ raise AttributeError(f'{item} has been used as a '
+ 'private attribute, which is immutable. ')
+
+ if item in self._metainfo_fields:
+ super().__delattr__(item)
+ else:
+ for level in self.levels():
+ level.__delattr__(item)
+ self._data_fields.remove(item)
+
+ def __getattr__(self, name):
+ if name in {'_data_fields', '_metainfo_fields'
+ } or name not in self._data_fields:
+ raise AttributeError(
+ f'\'{self.__class__.__name__}\' object has no attribute '
+ f'\'{name}\'')
+
+ return [getattr(level, name) for level in self.levels()]
+
+ def pop(self, *args) -> Any:
+ """pop property in data and metainfo as the same as python."""
+ assert len(args) < 3, '``pop`` get more than 2 arguments'
+ name = args[0]
+ if name in self._metainfo_fields:
+ self._metainfo_fields.remove(name)
+ return self.__dict__.pop(*args)
+
+ elif name in self._data_fields:
+ self._data_fields.remove(name)
+ return [level.pop(*args) for level in self.levels()]
+
+ # with default value
+ elif len(args) == 2:
+ return args[1]
+ else:
+ # don't just use 'self.__dict__.pop(*args)' for only popping key in
+ # metainfo or data
+ raise KeyError(f'{args[0]} is not contained in metainfo or data')
+
+ def _convert(self, apply_to: Type,
+ func: Callable[[Any], Any]) -> 'MultilevelPixelData':
+ """Convert data items with the given function.
+
+ Args:
+ apply_to (Type): The type of data items to apply the conversion
+ func (Callable): The conversion function that takes a data item
+ as the input and return the converted result
+
+ Returns:
+ MultilevelPixelData: the converted data element.
+ """
+ new_data = self.new()
+ for k, v in self.items():
+ if is_list_of(v, apply_to):
+ v = [func(_v) for _v in v]
+ data = {k: v}
+ new_data.set_data(data)
+ return new_data
+
+ def cpu(self) -> 'MultilevelPixelData':
+ """Convert all tensors to CPU in data."""
+ return self._convert(apply_to=torch.Tensor, func=lambda x: x.cpu())
+
+ def cuda(self) -> 'MultilevelPixelData':
+ """Convert all tensors to GPU in data."""
+ return self._convert(apply_to=torch.Tensor, func=lambda x: x.cuda())
+
+ def detach(self) -> 'MultilevelPixelData':
+ """Detach all tensors in data."""
+ return self._convert(apply_to=torch.Tensor, func=lambda x: x.detach())
+
+ def numpy(self) -> 'MultilevelPixelData':
+ """Convert all tensor to np.narray in data."""
+ return self._convert(
+ apply_to=torch.Tensor, func=lambda x: x.detach().cpu().numpy())
+
+ def to_tensor(self) -> 'MultilevelPixelData':
+ """Convert all tensor to np.narray in data."""
+ return self._convert(
+ apply_to=np.ndarray, func=lambda x: torch.from_numpy(x))
+
+ # Tensor-like methods
+ def to(self, *args, **kwargs) -> 'MultilevelPixelData':
+ """Apply same name function to all tensors in data_fields."""
+ new_data = self.new()
+ for k, v in self.items():
+ if hasattr(v[0], 'to'):
+ v = [v_.to(*args, **kwargs) for v_ in v]
+ data = {k: v}
+ new_data.set_data(data)
+ return new_data
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/pose_data_sample.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/pose_data_sample.py
new file mode 100644
index 0000000000000000000000000000000000000000..5258dec988b8f02a54a444c504a6ebaa8852197b
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/pose_data_sample.py
@@ -0,0 +1,109 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Union
+
+from mmengine.structures import BaseDataElement, InstanceData, PixelData
+
+from mmpose.structures import MultilevelPixelData
+
+
+class PoseDataSample(BaseDataElement):
+ """The base data structure of MMPose that is used as the interface between
+ modules.
+
+ The attributes of ``PoseDataSample`` includes:
+
+ - ``gt_instances``(InstanceData): Ground truth of instances with
+ keypoint annotations
+ - ``pred_instances``(InstanceData): Instances with keypoint
+ predictions
+ - ``gt_fields``(PixelData): Ground truth of spatial distribution
+ annotations like keypoint heatmaps and part affine fields (PAF)
+ - ``pred_fields``(PixelData): Predictions of spatial distributions
+
+ Examples:
+ >>> import torch
+ >>> from mmengine.structures import InstanceData, PixelData
+ >>> from mmpose.structures import PoseDataSample
+
+ >>> pose_meta = dict(img_shape=(800, 1216),
+ ... crop_size=(256, 192),
+ ... heatmap_size=(64, 48))
+ >>> gt_instances = InstanceData()
+ >>> gt_instances.bboxes = torch.rand((1, 4))
+ >>> gt_instances.keypoints = torch.rand((1, 17, 2))
+ >>> gt_instances.keypoints_visible = torch.rand((1, 17, 1))
+ >>> gt_fields = PixelData()
+ >>> gt_fields.heatmaps = torch.rand((17, 64, 48))
+
+ >>> data_sample = PoseDataSample(gt_instances=gt_instances,
+ ... gt_fields=gt_fields,
+ ... metainfo=pose_meta)
+ >>> assert 'img_shape' in data_sample
+ >>> len(data_sample.gt_intances)
+ 1
+ """
+
+ @property
+ def gt_instances(self) -> InstanceData:
+ return self._gt_instances
+
+ @gt_instances.setter
+ def gt_instances(self, value: InstanceData):
+ self.set_field(value, '_gt_instances', dtype=InstanceData)
+
+ @gt_instances.deleter
+ def gt_instances(self):
+ del self._gt_instances
+
+ @property
+ def gt_instance_labels(self) -> InstanceData:
+ return self._gt_instance_labels
+
+ @gt_instance_labels.setter
+ def gt_instance_labels(self, value: InstanceData):
+ self.set_field(value, '_gt_instance_labels', dtype=InstanceData)
+
+ @gt_instance_labels.deleter
+ def gt_instance_labels(self):
+ del self._gt_instance_labels
+
+ @property
+ def pred_instances(self) -> InstanceData:
+ return self._pred_instances
+
+ @pred_instances.setter
+ def pred_instances(self, value: InstanceData):
+ self.set_field(value, '_pred_instances', dtype=InstanceData)
+
+ @pred_instances.deleter
+ def pred_instances(self):
+ del self._pred_instances
+
+ @property
+ def gt_fields(self) -> Union[PixelData, MultilevelPixelData]:
+ return self._gt_fields
+
+ @gt_fields.setter
+ def gt_fields(self, value: Union[PixelData, MultilevelPixelData]):
+ self.set_field(value, '_gt_fields', dtype=type(value))
+
+ @gt_fields.deleter
+ def gt_fields(self):
+ del self._gt_fields
+
+ @property
+ def pred_fields(self) -> PixelData:
+ return self._pred_heatmaps
+
+ @pred_fields.setter
+ def pred_fields(self, value: PixelData):
+ self.set_field(value, '_pred_heatmaps', dtype=PixelData)
+
+ @pred_fields.deleter
+ def pred_fields(self):
+ del self._pred_heatmaps
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/utils.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..61064cc2b87702857c91b451c611e929d13d7d7b
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/structures/utils.py
@@ -0,0 +1,143 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import warnings
+from typing import List
+
+import cv2
+import numpy as np
+import torch
+from mmengine.structures import InstanceData, PixelData
+from mmengine.utils import is_list_of
+
+from .bbox.transforms import get_warp_matrix
+from .pose_data_sample import PoseDataSample
+
+
+def merge_data_samples(data_samples: List[PoseDataSample]) -> PoseDataSample:
+ """Merge the given data samples into a single data sample.
+
+ This function can be used to merge the top-down predictions with
+ bboxes from the same image. The merged data sample will contain all
+ instances from the input data samples, and the identical metainfo with
+ the first input data sample.
+
+ Args:
+ data_samples (List[:obj:`PoseDataSample`]): The data samples to
+ merge
+
+ Returns:
+ PoseDataSample: The merged data sample.
+ """
+
+ if not is_list_of(data_samples, PoseDataSample):
+ raise ValueError('Invalid input type, should be a list of '
+ ':obj:`PoseDataSample`')
+
+ if len(data_samples) == 0:
+ warnings.warn('Try to merge an empty list of data samples.')
+ return PoseDataSample()
+
+ merged = PoseDataSample(metainfo=data_samples[0].metainfo)
+
+ if 'gt_instances' in data_samples[0]:
+ merged.gt_instances = InstanceData.cat(
+ [d.gt_instances for d in data_samples])
+
+ if 'pred_instances' in data_samples[0]:
+ merged.pred_instances = InstanceData.cat(
+ [d.pred_instances for d in data_samples])
+
+ if 'pred_fields' in data_samples[0] and 'heatmaps' in data_samples[
+ 0].pred_fields:
+ reverted_heatmaps = [
+ revert_heatmap(data_sample.pred_fields.heatmaps,
+ data_sample.gt_instances.bbox_centers,
+ data_sample.gt_instances.bbox_scales,
+ data_sample.ori_shape)
+ for data_sample in data_samples
+ ]
+
+ merged_heatmaps = np.max(reverted_heatmaps, axis=0)
+ pred_fields = PixelData()
+ pred_fields.set_data(dict(heatmaps=merged_heatmaps))
+ merged.pred_fields = pred_fields
+
+ if 'gt_fields' in data_samples[0] and 'heatmaps' in data_samples[
+ 0].gt_fields:
+ reverted_heatmaps = [
+ revert_heatmap(data_sample.gt_fields.heatmaps,
+ data_sample.gt_instances.bbox_centers,
+ data_sample.gt_instances.bbox_scales,
+ data_sample.ori_shape)
+ for data_sample in data_samples
+ ]
+
+ merged_heatmaps = np.max(reverted_heatmaps, axis=0)
+ gt_fields = PixelData()
+ gt_fields.set_data(dict(heatmaps=merged_heatmaps))
+ merged.gt_fields = gt_fields
+
+ return merged
+
+
+def revert_heatmap(heatmap, bbox_center, bbox_scale, img_shape):
+ """Revert predicted heatmap on the original image.
+
+ Args:
+ heatmap (np.ndarray or torch.tensor): predicted heatmap.
+ bbox_center (np.ndarray): bounding box center coordinate.
+ bbox_scale (np.ndarray): bounding box scale.
+ img_shape (tuple or list): size of original image.
+ """
+ if torch.is_tensor(heatmap):
+ heatmap = heatmap.cpu().detach().numpy()
+
+ ndim = heatmap.ndim
+ # [K, H, W] -> [H, W, K]
+ if ndim == 3:
+ heatmap = heatmap.transpose(1, 2, 0)
+
+ hm_h, hm_w = heatmap.shape[:2]
+ img_h, img_w = img_shape
+ warp_mat = get_warp_matrix(
+ bbox_center.reshape((2, )),
+ bbox_scale.reshape((2, )),
+ rot=0,
+ output_size=(hm_w, hm_h),
+ inv=True)
+
+ heatmap = cv2.warpAffine(
+ heatmap, warp_mat, (img_w, img_h), flags=cv2.INTER_LINEAR)
+
+ # [H, W, K] -> [K, H, W]
+ if ndim == 3:
+ heatmap = heatmap.transpose(2, 0, 1)
+
+ return heatmap
+
+
+def split_instances(instances: InstanceData) -> List[InstanceData]:
+ """Convert instances into a list where each element is a dict that contains
+ information about one instance."""
+ results = []
+
+ # return an empty list if there is no instance detected by the model
+ if instances is None:
+ return results
+
+ for i in range(len(instances.keypoints)):
+ result = dict(
+ keypoints=instances.keypoints[i].tolist(),
+ keypoint_scores=instances.keypoint_scores[i].tolist(),
+ )
+ if 'bboxes' in instances:
+ result['bbox'] = instances.bboxes[i].tolist(),
+ if 'bbox_scores' in instances:
+ result['bbox_score'] = instances.bbox_scores[i]
+ results.append(result)
+
+ return results
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/testing/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/testing/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3ef5495760c2bfb92496eda5c847333f6ab9d367
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/testing/__init__.py
@@ -0,0 +1,13 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from ._utils import (get_coco_sample, get_config_file, get_packed_inputs,
+ get_pose_estimator_cfg, get_repo_dir)
+
+__all__ = [
+ 'get_packed_inputs', 'get_coco_sample', 'get_config_file',
+ 'get_pose_estimator_cfg', 'get_repo_dir'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/testing/_utils.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/testing/_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..fbb5cca36d866df4f158ee47a54a8db8295d1b8c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/testing/_utils.py
@@ -0,0 +1,253 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import os.path as osp
+from copy import deepcopy
+from typing import Optional
+
+import numpy as np
+import torch
+from mmengine.config import Config
+from mmengine.dataset import pseudo_collate
+from mmengine.structures import InstanceData, PixelData
+
+from mmpose.structures import MultilevelPixelData, PoseDataSample
+from mmpose.structures.bbox import bbox_xyxy2cs
+
+
+def get_coco_sample(
+ img_shape=(240, 320),
+ img_fill: Optional[int] = None,
+ num_instances=1,
+ with_bbox_cs=True,
+ with_img_mask=False,
+ random_keypoints_visible=False,
+ non_occlusion=False):
+ """Create a dummy data sample in COCO style."""
+ rng = np.random.RandomState(0)
+ h, w = img_shape
+ if img_fill is None:
+ img = np.random.randint(0, 256, (h, w, 3), dtype=np.uint8)
+ else:
+ img = np.full((h, w, 3), img_fill, dtype=np.uint8)
+
+ if non_occlusion:
+ bbox = _rand_bboxes(rng, num_instances, w / num_instances, h)
+ for i in range(num_instances):
+ bbox[i, 0::2] += w / num_instances * i
+ else:
+ bbox = _rand_bboxes(rng, num_instances, w, h)
+
+ keypoints = _rand_keypoints(rng, bbox, 17)
+ if random_keypoints_visible:
+ keypoints_visible = np.random.randint(0, 2, (num_instances,
+ 17)).astype(np.float32)
+ else:
+ keypoints_visible = np.full((num_instances, 17), 1, dtype=np.float32)
+
+ upper_body_ids = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+ lower_body_ids = [11, 12, 13, 14, 15, 16]
+ flip_pairs = [[2, 1], [1, 2], [4, 3], [3, 4], [6, 5], [5, 6], [8, 7],
+ [7, 8], [10, 9], [9, 10], [12, 11], [11, 12], [14, 13],
+ [13, 14], [16, 15], [15, 16]]
+ flip_indices = [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15]
+ dataset_keypoint_weights = np.array([
+ 1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.5, 1.5, 1., 1., 1.2, 1.2, 1.5,
+ 1.5
+ ]).astype(np.float32)
+
+ data = {
+ 'img': img,
+ 'img_shape': img_shape,
+ 'ori_shape': img_shape,
+ 'bbox': bbox,
+ 'keypoints': keypoints,
+ 'keypoints_visible': keypoints_visible,
+ 'upper_body_ids': upper_body_ids,
+ 'lower_body_ids': lower_body_ids,
+ 'flip_pairs': flip_pairs,
+ 'flip_indices': flip_indices,
+ 'dataset_keypoint_weights': dataset_keypoint_weights,
+ 'invalid_segs': [],
+ }
+
+ if with_bbox_cs:
+ data['bbox_center'], data['bbox_scale'] = bbox_xyxy2cs(data['bbox'])
+
+ if with_img_mask:
+ data['img_mask'] = np.random.randint(0, 2, (h, w), dtype=np.uint8)
+
+ return data
+
+
+def get_packed_inputs(batch_size=2,
+ num_instances=1,
+ num_keypoints=17,
+ num_levels=1,
+ img_shape=(256, 192),
+ input_size=(192, 256),
+ heatmap_size=(48, 64),
+ simcc_split_ratio=2.0,
+ with_heatmap=True,
+ with_reg_label=True,
+ with_simcc_label=True):
+ """Create a dummy batch of model inputs and data samples."""
+ rng = np.random.RandomState(0)
+
+ inputs_list = []
+ for idx in range(batch_size):
+ inputs = dict()
+
+ # input
+ h, w = img_shape
+ image = rng.randint(0, 255, size=(3, h, w), dtype=np.uint8)
+ inputs['inputs'] = torch.from_numpy(image)
+
+ # meta
+ img_meta = {
+ 'id': idx,
+ 'img_id': idx,
+ 'img_path': '.png',
+ 'img_shape': img_shape,
+ 'input_size': input_size,
+ 'flip': False,
+ 'flip_direction': None,
+ 'flip_indices': list(range(num_keypoints))
+ }
+
+ np.random.shuffle(img_meta['flip_indices'])
+ data_sample = PoseDataSample(metainfo=img_meta)
+
+ # gt_instance
+ gt_instances = InstanceData()
+ gt_instance_labels = InstanceData()
+ bboxes = _rand_bboxes(rng, num_instances, w, h)
+ bbox_centers, bbox_scales = bbox_xyxy2cs(bboxes)
+
+ keypoints = _rand_keypoints(rng, bboxes, num_keypoints)
+ keypoints_visible = np.ones((num_instances, num_keypoints),
+ dtype=np.float32)
+
+ # [N, K] -> [N, num_levels, K]
+ # keep the first dimension as the num_instances
+ if num_levels > 1:
+ keypoint_weights = np.tile(keypoints_visible[:, None],
+ (1, num_levels, 1))
+ else:
+ keypoint_weights = keypoints_visible.copy()
+
+ gt_instances.bboxes = bboxes
+ gt_instances.bbox_centers = bbox_centers
+ gt_instances.bbox_scales = bbox_scales
+ gt_instances.bbox_scores = np.ones((num_instances, ), dtype=np.float32)
+ gt_instances.keypoints = keypoints
+ gt_instances.keypoints_visible = keypoints_visible
+
+ gt_instance_labels.keypoint_weights = torch.FloatTensor(
+ keypoint_weights)
+
+ if with_reg_label:
+ gt_instance_labels.keypoint_labels = torch.FloatTensor(keypoints /
+ input_size)
+
+ if with_simcc_label:
+ len_x = np.around(input_size[0] * simcc_split_ratio)
+ len_y = np.around(input_size[1] * simcc_split_ratio)
+ gt_instance_labels.keypoint_x_labels = torch.FloatTensor(
+ _rand_simcc_label(rng, num_instances, num_keypoints, len_x))
+ gt_instance_labels.keypoint_y_labels = torch.FloatTensor(
+ _rand_simcc_label(rng, num_instances, num_keypoints, len_y))
+
+ # gt_fields
+ if with_heatmap:
+ if num_levels == 1:
+ gt_fields = PixelData()
+ # generate single-level heatmaps
+ W, H = heatmap_size
+ heatmaps = rng.rand(num_keypoints, H, W)
+ gt_fields.heatmaps = torch.FloatTensor(heatmaps)
+ else:
+ # generate multilevel heatmaps
+ heatmaps = []
+ for _ in range(num_levels):
+ W, H = heatmap_size
+ heatmaps_ = rng.rand(num_keypoints, H, W)
+ heatmaps.append(torch.FloatTensor(heatmaps_))
+ # [num_levels*K, H, W]
+ gt_fields = MultilevelPixelData()
+ gt_fields.heatmaps = heatmaps
+ data_sample.gt_fields = gt_fields
+
+ data_sample.gt_instances = gt_instances
+ data_sample.gt_instance_labels = gt_instance_labels
+
+ inputs['data_samples'] = data_sample
+ inputs_list.append(inputs)
+
+ packed_inputs = pseudo_collate(inputs_list)
+ return packed_inputs
+
+
+def _rand_keypoints(rng, bboxes, num_keypoints):
+ n = bboxes.shape[0]
+ relative_pos = rng.rand(n, num_keypoints, 2)
+ keypoints = relative_pos * bboxes[:, None, :2] + (
+ 1 - relative_pos) * bboxes[:, None, 2:4]
+
+ return keypoints
+
+
+def _rand_simcc_label(rng, num_instances, num_keypoints, len_feats):
+ simcc_label = rng.rand(num_instances, num_keypoints, int(len_feats))
+ return simcc_label
+
+
+def _rand_bboxes(rng, num_instances, img_w, img_h):
+ cx, cy = rng.rand(num_instances, 2).T
+ bw, bh = 0.2 + 0.8 * rng.rand(num_instances, 2).T
+
+ tl_x = ((cx * img_w) - (img_w * bw / 2)).clip(0, img_w)
+ tl_y = ((cy * img_h) - (img_h * bh / 2)).clip(0, img_h)
+ br_x = ((cx * img_w) + (img_w * bw / 2)).clip(0, img_w)
+ br_y = ((cy * img_h) + (img_h * bh / 2)).clip(0, img_h)
+
+ bboxes = np.vstack([tl_x, tl_y, br_x, br_y]).T
+ return bboxes
+
+
+def get_repo_dir():
+ """Return the path of the MMPose repo directory."""
+ try:
+ # Assume the function in invoked is the source mmpose repo
+ repo_dir = osp.dirname(osp.dirname(osp.dirname(__file__)))
+ except NameError:
+ # For IPython development when __file__ is not defined
+ import mmpose
+ repo_dir = osp.dirname(osp.dirname(mmpose.__file__))
+
+ return repo_dir
+
+
+def get_config_file(fn: str):
+ """Return full path of a config file from the given relative path."""
+ repo_dir = get_repo_dir()
+ if fn.startswith('configs'):
+ fn_config = osp.join(repo_dir, fn)
+ else:
+ fn_config = osp.join(repo_dir, 'configs', fn)
+
+ if not osp.isfile(fn_config):
+ raise FileNotFoundError(f'Cannot find config file {fn_config}')
+
+ return fn_config
+
+
+def get_pose_estimator_cfg(fn: str):
+ """Load model config from a config file."""
+
+ fn_config = get_config_file(fn)
+ config = Config.fromfile(fn_config)
+ return deepcopy(config.model)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..a7908d355f52ab73137d0e8433a07c23c32a2034
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__init__.py
@@ -0,0 +1,18 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .camera import SimpleCamera, SimpleCameraTorch
+from .collect_env import collect_env
+from .config_utils import adapt_mmdet_pipeline
+from .logger import get_root_logger
+from .setup_env import register_all_modules, setup_multi_processes
+from .timer import StopWatch
+
+__all__ = [
+ 'get_root_logger', 'collect_env', 'StopWatch', 'setup_multi_processes',
+ 'register_all_modules', 'SimpleCamera', 'SimpleCameraTorch',
+ 'adapt_mmdet_pipeline'
+]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/__init__.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f3530851767b70059de6c30275f6365cb8647f46
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/__init__.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/camera.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/camera.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d1b2a7b37ec1875db497dfa7741906ed433db888
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/camera.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/collect_env.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/collect_env.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..949c0544d7736f1537057b1b2b69d920c956ce95
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/collect_env.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/config_utils.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/config_utils.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..10cec26ca5dd9a7a0c04aa5478d04c6f2667173c
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/config_utils.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/logger.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/logger.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fdfae2c420ddc302211254183ddf99312f502079
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/logger.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/setup_env.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/setup_env.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..449a71cd2d9e3f48c0e27887451fbcbfc9bee8c1
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/setup_env.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/tensor_utils.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/tensor_utils.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6a691fdb3f9d139477d7c90d7973ab3c57373ed4
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/tensor_utils.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/timer.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/timer.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a9013026230feca4dcfbaf00d0057ef1c365de5e
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/timer.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/typing.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/typing.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b967fa923a5d5a84a463804ad87be5da4eabb1a0
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/__pycache__/typing.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/camera.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/camera.py
new file mode 100644
index 0000000000000000000000000000000000000000..1f92980184421fcdd509a7814f6e333da89ea415
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/camera.py
@@ -0,0 +1,285 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from abc import ABCMeta, abstractmethod
+
+import numpy as np
+import torch
+from mmengine.registry import Registry
+
+CAMERAS = Registry('camera')
+
+
+class SingleCameraBase(metaclass=ABCMeta):
+ """Base class for single camera model.
+
+ Args:
+ param (dict): Camera parameters
+
+ Methods:
+ world_to_camera: Project points from world coordinates to camera
+ coordinates
+ camera_to_world: Project points from camera coordinates to world
+ coordinates
+ camera_to_pixel: Project points from camera coordinates to pixel
+ coordinates
+ world_to_pixel: Project points from world coordinates to pixel
+ coordinates
+ """
+
+ @abstractmethod
+ def __init__(self, param):
+ """Load camera parameters and check validity."""
+
+ def world_to_camera(self, X):
+ """Project points from world coordinates to camera coordinates."""
+ raise NotImplementedError
+
+ def camera_to_world(self, X):
+ """Project points from camera coordinates to world coordinates."""
+ raise NotImplementedError
+
+ def camera_to_pixel(self, X):
+ """Project points from camera coordinates to pixel coordinates."""
+ raise NotImplementedError
+
+ def world_to_pixel(self, X):
+ """Project points from world coordinates to pixel coordinates."""
+ _X = self.world_to_camera(X)
+ return self.camera_to_pixel(_X)
+
+
+@CAMERAS.register_module()
+class SimpleCamera(SingleCameraBase):
+ """Camera model to calculate coordinate transformation with given
+ intrinsic/extrinsic camera parameters.
+
+ Note:
+ The keypoint coordinate should be an np.ndarray with a shape of
+ [...,J, C] where J is the keypoint number of an instance, and C is
+ the coordinate dimension. For example:
+
+ [J, C]: shape of joint coordinates of a person with J joints.
+ [N, J, C]: shape of a batch of person joint coordinates.
+ [N, T, J, C]: shape of a batch of pose sequences.
+
+ Args:
+ param (dict): camera parameters including:
+ - R: 3x3, camera rotation matrix (camera-to-world)
+ - T: 3x1, camera translation (camera-to-world)
+ - K: (optional) 2x3, camera intrinsic matrix
+ - k: (optional) nx1, camera radial distortion coefficients
+ - p: (optional) mx1, camera tangential distortion coefficients
+ - f: (optional) 2x1, camera focal length
+ - c: (optional) 2x1, camera center
+ if K is not provided, it will be calculated from f and c.
+
+ Methods:
+ world_to_camera: Project points from world coordinates to camera
+ coordinates
+ camera_to_pixel: Project points from camera coordinates to pixel
+ coordinates
+ world_to_pixel: Project points from world coordinates to pixel
+ coordinates
+ """
+
+ def __init__(self, param):
+
+ self.param = {}
+ # extrinsic param
+ R = np.array(param['R'], dtype=np.float32)
+ T = np.array(param['T'], dtype=np.float32)
+ assert R.shape == (3, 3)
+ assert T.shape == (3, 1)
+ # The camera matrices are transposed in advance because the joint
+ # coordinates are stored as row vectors.
+ self.param['R_c2w'] = R.T
+ self.param['T_c2w'] = T.T
+ self.param['R_w2c'] = R
+ self.param['T_w2c'] = -self.param['T_c2w'] @ self.param['R_w2c']
+
+ # intrinsic param
+ if 'K' in param:
+ K = np.array(param['K'], dtype=np.float32)
+ assert K.shape == (2, 3)
+ self.param['K'] = K.T
+ self.param['f'] = np.array([K[0, 0], K[1, 1]])[:, np.newaxis]
+ self.param['c'] = np.array([K[0, 2], K[1, 2]])[:, np.newaxis]
+ elif 'f' in param and 'c' in param:
+ f = np.array(param['f'], dtype=np.float32)
+ c = np.array(param['c'], dtype=np.float32)
+ assert f.shape == (2, 1)
+ assert c.shape == (2, 1)
+ self.param['K'] = np.concatenate((np.diagflat(f), c), axis=-1).T
+ self.param['f'] = f
+ self.param['c'] = c
+ else:
+ raise ValueError('Camera intrinsic parameters are missing. '
+ 'Either "K" or "f"&"c" should be provided.')
+
+ # distortion param
+ if 'k' in param and 'p' in param:
+ self.undistortion = True
+ self.param['k'] = np.array(param['k'], dtype=np.float32).flatten()
+ self.param['p'] = np.array(param['p'], dtype=np.float32).flatten()
+ assert self.param['k'].size in {3, 6}
+ assert self.param['p'].size == 2
+ else:
+ self.undistortion = False
+
+ def world_to_camera(self, X):
+ assert isinstance(X, np.ndarray)
+ assert X.ndim >= 2 and X.shape[-1] == 3
+ return X @ self.param['R_w2c'] + self.param['T_w2c']
+
+ def camera_to_world(self, X):
+ assert isinstance(X, np.ndarray)
+ assert X.ndim >= 2 and X.shape[-1] == 3
+ return X @ self.param['R_c2w'] + self.param['T_c2w']
+
+ def camera_to_pixel(self, X):
+ assert isinstance(X, np.ndarray)
+ assert X.ndim >= 2 and X.shape[-1] == 3
+
+ _X = X / X[..., 2:]
+
+ if self.undistortion:
+ k = self.param['k']
+ p = self.param['p']
+ _X_2d = _X[..., :2]
+ r2 = (_X_2d**2).sum(-1)
+ radial = 1 + sum(ki * r2**(i + 1) for i, ki in enumerate(k[:3]))
+ if k.size == 6:
+ radial /= 1 + sum(
+ (ki * r2**(i + 1) for i, ki in enumerate(k[3:])))
+
+ tangential = 2 * (p[1] * _X[..., 0] + p[0] * _X[..., 1])
+
+ _X[..., :2] = _X_2d * (radial + tangential)[..., None] + np.outer(
+ r2, p[::-1]).reshape(_X_2d.shape)
+ return _X @ self.param['K']
+
+ def pixel_to_camera(self, X):
+ assert isinstance(X, np.ndarray)
+ assert X.ndim >= 2 and X.shape[-1] == 3
+ _X = X.copy()
+ _X[:, :2] = (X[:, :2] - self.param['c'].T) / self.param['f'].T * X[:,
+ [2]]
+ return _X
+
+
+@CAMERAS.register_module()
+class SimpleCameraTorch(SingleCameraBase):
+ """Camera model to calculate coordinate transformation with given
+ intrinsic/extrinsic camera parameters.
+
+ Notes:
+ The keypoint coordinate should be an np.ndarray with a shape of
+ [...,J, C] where J is the keypoint number of an instance, and C is
+ the coordinate dimension. For example:
+
+ [J, C]: shape of joint coordinates of a person with J joints.
+ [N, J, C]: shape of a batch of person joint coordinates.
+ [N, T, J, C]: shape of a batch of pose sequences.
+
+ Args:
+ param (dict): camera parameters including:
+ - R: 3x3, camera rotation matrix (camera-to-world)
+ - T: 3x1, camera translation (camera-to-world)
+ - K: (optional) 2x3, camera intrinsic matrix
+ - k: (optional) nx1, camera radial distortion coefficients
+ - p: (optional) mx1, camera tangential distortion coefficients
+ - f: (optional) 2x1, camera focal length
+ - c: (optional) 2x1, camera center
+ if K is not provided, it will be calculated from f and c.
+
+ Methods:
+ world_to_camera: Project points from world coordinates to camera
+ coordinates
+ camera_to_pixel: Project points from camera coordinates to pixel
+ coordinates
+ world_to_pixel: Project points from world coordinates to pixel
+ coordinates
+ """
+
+ def __init__(self, param, device):
+
+ self.param = {}
+ # extrinsic param
+ R = torch.tensor(param['R'], device=device)
+ T = torch.tensor(param['T'], device=device)
+
+ assert R.shape == (3, 3)
+ assert T.shape == (3, 1)
+ # The camera matrices are transposed in advance because the joint
+ # coordinates are stored as row vectors.
+ self.param['R_c2w'] = R.T
+ self.param['T_c2w'] = T.T
+ self.param['R_w2c'] = R
+ self.param['T_w2c'] = -self.param['T_c2w'] @ self.param['R_w2c']
+
+ # intrinsic param
+ if 'K' in param:
+ K = torch.tensor(param['K'], device=device)
+ assert K.shape == (2, 3)
+ self.param['K'] = K.T
+ self.param['f'] = torch.tensor([[K[0, 0]], [K[1, 1]]],
+ device=device)
+ self.param['c'] = torch.tensor([[K[0, 2]], [K[1, 2]]],
+ device=device)
+ elif 'f' in param and 'c' in param:
+ f = torch.tensor(param['f'], device=device)
+ c = torch.tensor(param['c'], device=device)
+ assert f.shape == (2, 1)
+ assert c.shape == (2, 1)
+ self.param['K'] = torch.cat([torch.diagflat(f), c], dim=-1).T
+ self.param['f'] = f
+ self.param['c'] = c
+ else:
+ raise ValueError('Camera intrinsic parameters are missing. '
+ 'Either "K" or "f"&"c" should be provided.')
+
+ # distortion param
+ if 'k' in param and 'p' in param:
+ self.undistortion = True
+ self.param['k'] = torch.tensor(param['k'], device=device).view(-1)
+ self.param['p'] = torch.tensor(param['p'], device=device).view(-1)
+ assert len(self.param['k']) in {3, 6}
+ assert len(self.param['p']) == 2
+ else:
+ self.undistortion = False
+
+ def world_to_camera(self, X):
+ assert isinstance(X, torch.Tensor)
+ assert X.ndim >= 2 and X.shape[-1] == 3
+ return X @ self.param['R_w2c'] + self.param['T_w2c']
+
+ def camera_to_world(self, X):
+ assert isinstance(X, torch.Tensor)
+ assert X.ndim >= 2 and X.shape[-1] == 3
+ return X @ self.param['R_c2w'] + self.param['T_c2w']
+
+ def camera_to_pixel(self, X):
+ assert isinstance(X, torch.Tensor)
+ assert X.ndim >= 2 and X.shape[-1] == 3
+
+ _X = X / X[..., 2:]
+
+ if self.undistortion:
+ k = self.param['k']
+ p = self.param['p']
+ _X_2d = _X[..., :2]
+ r2 = (_X_2d**2).sum(-1)
+ radial = 1 + sum(ki * r2**(i + 1) for i, ki in enumerate(k[:3]))
+ if k.size == 6:
+ radial /= 1 + sum(
+ (ki * r2**(i + 1) for i, ki in enumerate(k[3:])))
+
+ tangential = 2 * (p[1] * _X[..., 0] + p[0] * _X[..., 1])
+
+ _X[..., :2] = _X_2d * (radial + tangential)[..., None] + torch.ger(
+ r2, p.flip([0])).reshape(_X_2d.shape)
+ return _X @ self.param['K']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/collect_env.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/collect_env.py
new file mode 100644
index 0000000000000000000000000000000000000000..022b6eae5246bc317c7714e50735fbe8b57b5852
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/collect_env.py
@@ -0,0 +1,21 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmengine.utils import get_git_hash
+from mmengine.utils.dl_utils import collect_env as collect_base_env
+
+import mmpose
+
+
+def collect_env():
+ env_info = collect_base_env()
+ env_info['MMPose'] = (mmpose.__version__ + '+' + get_git_hash(digits=7))
+ return env_info
+
+
+if __name__ == '__main__':
+ for name, val in collect_env().items():
+ print(f'{name}: {val}')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/config_utils.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/config_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..1c55092571b79dba3fd475eaf0f15050d79ba991
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/config_utils.py
@@ -0,0 +1,31 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from mmpose.utils.typing import ConfigDict
+
+
+def adapt_mmdet_pipeline(cfg: ConfigDict) -> ConfigDict:
+ """Converts pipeline types in MMDetection's test dataloader to use the
+ 'mmdet' namespace.
+
+ Args:
+ cfg (ConfigDict): Configuration dictionary for MMDetection.
+
+ Returns:
+ ConfigDict: Configuration dictionary with updated pipeline types.
+ """
+ # use lazy import to avoid hard dependence on mmdet
+ from mmdet.datasets import transforms
+
+ if 'test_dataloader' not in cfg:
+ return cfg
+
+ pipeline = cfg.test_dataloader.dataset.pipeline
+ for trans in pipeline:
+ if trans['type'] in dir(transforms):
+ trans['type'] = 'mmdet.' + trans['type']
+
+ return cfg
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/hooks.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/hooks.py
new file mode 100644
index 0000000000000000000000000000000000000000..98dfc2f49a9d1dcf99e5a2b94fc13c160d68d62b
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/hooks.py
@@ -0,0 +1,65 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import functools
+
+
+class OutputHook:
+
+ def __init__(self, module, outputs=None, as_tensor=False):
+ self.outputs = outputs
+ self.as_tensor = as_tensor
+ self.layer_outputs = {}
+ self.register(module)
+
+ def register(self, module):
+
+ def hook_wrapper(name):
+
+ def hook(model, input, output):
+ if self.as_tensor:
+ self.layer_outputs[name] = output
+ else:
+ if isinstance(output, list):
+ self.layer_outputs[name] = [
+ out.detach().cpu().numpy() for out in output
+ ]
+ else:
+ self.layer_outputs[name] = output.detach().cpu().numpy(
+ )
+
+ return hook
+
+ self.handles = []
+ if isinstance(self.outputs, (list, tuple)):
+ for name in self.outputs:
+ try:
+ layer = rgetattr(module, name)
+ h = layer.register_forward_hook(hook_wrapper(name))
+ except ModuleNotFoundError as module_not_found:
+ raise ModuleNotFoundError(
+ f'Module {name} not found') from module_not_found
+ self.handles.append(h)
+
+ def remove(self):
+ for h in self.handles:
+ h.remove()
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ self.remove()
+
+
+# using wonder's beautiful simplification:
+# https://stackoverflow.com/questions/31174295/getattr-and-setattr-on-nested-objects
+def rgetattr(obj, attr, *args):
+
+ def _getattr(obj, attr):
+ return getattr(obj, attr, *args)
+
+ return functools.reduce(_getattr, [obj] + attr.split('.'))
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/logger.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/logger.py
new file mode 100644
index 0000000000000000000000000000000000000000..fea6276e2cb69ec752d0771083869da73c48d780
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/logger.py
@@ -0,0 +1,30 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import logging
+
+from mmengine.logging import MMLogger
+
+
+def get_root_logger(log_file=None, log_level=logging.INFO):
+ """Use `MMLogger` class in mmengine to get the root logger.
+
+ The logger will be initialized if it has not been initialized. By default a
+ StreamHandler will be added. If `log_file` is specified, a FileHandler will
+ also be added. The name of the root logger is the top-level package name,
+ e.g., "mmpose".
+
+ Args:
+ log_file (str | None): The log filename. If specified, a FileHandler
+ will be added to the root logger.
+ log_level (int): The root logger level. Note that only the process of
+ rank 0 is affected, while other processes will set the level to
+ "Error" and be silent most of the time.
+
+ Returns:
+ logging.Logger: The root logger.
+ """
+ return MMLogger('MMLogger', __name__.split('.')[0], log_file, log_level)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/setup_env.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/setup_env.py
new file mode 100644
index 0000000000000000000000000000000000000000..b583fcba3490399b04d5daaf993ec399a7b72b10
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/setup_env.py
@@ -0,0 +1,91 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import datetime
+import os
+import platform
+import warnings
+
+import cv2
+import torch.multiprocessing as mp
+from mmengine import DefaultScope
+
+
+def setup_multi_processes(cfg):
+ """Setup multi-processing environment variables."""
+ # set multi-process start method as `fork` to speed up the training
+ if platform.system() != 'Windows':
+ mp_start_method = cfg.get('mp_start_method', 'fork')
+ current_method = mp.get_start_method(allow_none=True)
+ if current_method is not None and current_method != mp_start_method:
+ warnings.warn(
+ f'Multi-processing start method `{mp_start_method}` is '
+ f'different from the previous setting `{current_method}`.'
+ f'It will be force set to `{mp_start_method}`. You can change '
+ f'this behavior by changing `mp_start_method` in your config.')
+ mp.set_start_method(mp_start_method, force=True)
+
+ # disable opencv multithreading to avoid system being overloaded
+ opencv_num_threads = cfg.get('opencv_num_threads', 0)
+ cv2.setNumThreads(opencv_num_threads)
+
+ # setup OMP threads
+ # This code is referred from https://github.com/pytorch/pytorch/blob/master/torch/distributed/run.py # noqa
+ if 'OMP_NUM_THREADS' not in os.environ and cfg.data.workers_per_gpu > 1:
+ omp_num_threads = 1
+ warnings.warn(
+ f'Setting OMP_NUM_THREADS environment variable for each process '
+ f'to be {omp_num_threads} in default, to avoid your system being '
+ f'overloaded, please further tune the variable for optimal '
+ f'performance in your application as needed.')
+ os.environ['OMP_NUM_THREADS'] = str(omp_num_threads)
+
+ # setup MKL threads
+ if 'MKL_NUM_THREADS' not in os.environ and cfg.data.workers_per_gpu > 1:
+ mkl_num_threads = 1
+ warnings.warn(
+ f'Setting MKL_NUM_THREADS environment variable for each process '
+ f'to be {mkl_num_threads} in default, to avoid your system being '
+ f'overloaded, please further tune the variable for optimal '
+ f'performance in your application as needed.')
+ os.environ['MKL_NUM_THREADS'] = str(mkl_num_threads)
+
+
+def register_all_modules(init_default_scope: bool = True) -> None:
+ """Register all modules in mmpose into the registries.
+
+ Args:
+ init_default_scope (bool): Whether initialize the mmpose default scope.
+ When `init_default_scope=True`, the global default scope will be
+ set to `mmpose`, and all registries will build modules from mmpose's
+ registry node. To understand more about the registry, please refer
+ to https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/registry.md
+ Defaults to True.
+ """ # noqa
+
+ import mmpose.codecs # noqa: F401, F403
+ import mmpose.datasets # noqa: F401,F403
+ import mmpose.engine # noqa: F401,F403
+ import mmpose.evaluation # noqa: F401,F403
+ import mmpose.models # noqa: F401,F403
+ import mmpose.visualization # noqa: F401,F403
+
+ if init_default_scope:
+ never_created = DefaultScope.get_current_instance() is None \
+ or not DefaultScope.check_instance_created('mmpose')
+ if never_created:
+ DefaultScope.get_instance('mmpose', scope_name='mmpose')
+ return
+ current_scope = DefaultScope.get_current_instance()
+ if current_scope.scope_name != 'mmpose':
+ warnings.warn('The current default scope '
+ f'"{current_scope.scope_name}" is not "mmpose", '
+ '`register_all_modules` will force the current'
+ 'default scope to be "mmpose". If this is not '
+ 'expected, please set `init_default_scope=False`.')
+ # avoid name conflict
+ new_instance_name = f'mmpose-{datetime.datetime.now()}'
+ DefaultScope.get_instance(new_instance_name, scope_name='mmpose')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/tensor_utils.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/tensor_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..8387e5c011d330ba8a0cd9674c7a3b36232c4f9b
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/tensor_utils.py
@@ -0,0 +1,76 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+
+from typing import Any, Optional, Sequence, Union
+
+import numpy as np
+import torch
+from mmengine.utils import is_seq_of
+from torch import Tensor
+
+
+def to_numpy(x: Union[Tensor, Sequence[Tensor]],
+ return_device: bool = False,
+ unzip: bool = False) -> Union[np.ndarray, tuple]:
+ """Convert torch tensor to numpy.ndarray.
+
+ Args:
+ x (Tensor | Sequence[Tensor]): A single tensor or a sequence of
+ tensors
+ return_device (bool): Whether return the tensor device. Defaults to
+ ``False``
+ unzip (bool): Whether unzip the input sequence. Defaults to ``False``
+
+ Returns:
+ np.ndarray | tuple: If ``return_device`` is ``True``, return a tuple
+ of converted numpy array(s) and the device indicator; otherwise only
+ return the numpy array(s)
+ """
+
+ if isinstance(x, Tensor):
+ arrays = x.detach().cpu().float().numpy()
+ device = x.device
+ elif is_seq_of(x, Tensor):
+ if unzip:
+ # convert (A, B) -> [(A[0], B[0]), (A[1], B[1]), ...]
+ arrays = [
+ tuple(to_numpy(_x[None, :]) for _x in _each)
+ for _each in zip(*x)
+ ]
+ else:
+ arrays = [to_numpy(_x) for _x in x]
+
+ device = x[0].device
+
+ else:
+ raise ValueError(f'Invalid input type {type(x)}')
+
+ if return_device:
+ return arrays, device
+ else:
+ return arrays
+
+
+def to_tensor(x: Union[np.ndarray, Sequence[np.ndarray]],
+ device: Optional[Any] = None) -> Union[Tensor, Sequence[Tensor]]:
+ """Convert numpy.ndarray to torch tensor.
+
+ Args:
+ x (np.ndarray | Sequence[np.ndarray]): A single np.ndarray or a
+ sequence of tensors
+ tensor (Any, optional): The device indicator. Defaults to ``None``
+
+ Returns:
+ tuple:
+ - Tensor | Sequence[Tensor]: The converted Tensor or Tensor sequence
+ """
+ if isinstance(x, np.ndarray):
+ return torch.tensor(x, device=device)
+ elif is_seq_of(x, np.ndarray):
+ return [to_tensor(_x, device=device) for _x in x]
+ else:
+ raise ValueError(f'Invalid input type {type(x)}')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/timer.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/timer.py
new file mode 100644
index 0000000000000000000000000000000000000000..4fa1ececb8d2068ca939c33979763ad5934cde5c
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/timer.py
@@ -0,0 +1,122 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from collections import defaultdict
+from contextlib import contextmanager
+from functools import partial
+
+import numpy as np
+from mmengine import Timer
+
+
+class RunningAverage():
+ r"""A helper class to calculate running average in a sliding window.
+
+ Args:
+ window (int): The size of the sliding window.
+ """
+
+ def __init__(self, window: int = 1):
+ self.window = window
+ self._data = []
+
+ def update(self, value):
+ """Update a new data sample."""
+ self._data.append(value)
+ self._data = self._data[-self.window:]
+
+ def average(self):
+ """Get the average value of current window."""
+ return np.mean(self._data)
+
+
+class StopWatch:
+ r"""A helper class to measure FPS and detailed time consuming of each phase
+ in a video processing loop or similar scenarios.
+
+ Args:
+ window (int): The sliding window size to calculate the running average
+ of the time consuming.
+
+ Example:
+ >>> from mmpose.utils import StopWatch
+ >>> import time
+ >>> stop_watch = StopWatch(window=10)
+ >>> with stop_watch.timeit('total'):
+ >>> time.sleep(0.1)
+ >>> # 'timeit' support nested use
+ >>> with stop_watch.timeit('phase1'):
+ >>> time.sleep(0.1)
+ >>> with stop_watch.timeit('phase2'):
+ >>> time.sleep(0.2)
+ >>> time.sleep(0.2)
+ >>> report = stop_watch.report()
+ """
+
+ def __init__(self, window=1):
+ self.window = window
+ self._record = defaultdict(partial(RunningAverage, window=self.window))
+ self._timer_stack = []
+
+ @contextmanager
+ def timeit(self, timer_name='_FPS_'):
+ """Timing a code snippet with an assigned name.
+
+ Args:
+ timer_name (str): The unique name of the interested code snippet to
+ handle multiple timers and generate reports. Note that '_FPS_'
+ is a special key that the measurement will be in `fps` instead
+ of `millisecond`. Also see `report` and `report_strings`.
+ Default: '_FPS_'.
+ Note:
+ This function should always be used in a `with` statement, as shown
+ in the example.
+ """
+ self._timer_stack.append((timer_name, Timer()))
+ try:
+ yield
+ finally:
+ timer_name, timer = self._timer_stack.pop()
+ self._record[timer_name].update(timer.since_start())
+
+ def report(self, key=None):
+ """Report timing information.
+
+ Returns:
+ dict: The key is the timer name and the value is the \
+ corresponding average time consuming.
+ """
+ result = {
+ name: r.average() * 1000.
+ for name, r in self._record.items()
+ }
+
+ if '_FPS_' in result:
+ result['_FPS_'] = 1000. / result.pop('_FPS_')
+
+ if key is None:
+ return result
+ return result[key]
+
+ def report_strings(self):
+ """Report timing information in texture strings.
+
+ Returns:
+ list(str): Each element is the information string of a timed \
+ event, in format of '{timer_name}: {time_in_ms}'. \
+ Specially, if timer_name is '_FPS_', the result will \
+ be converted to fps.
+ """
+ result = self.report()
+ strings = []
+ if '_FPS_' in result:
+ strings.append(f'FPS: {result["_FPS_"]:>5.1f}')
+ strings += [f'{name}: {val:>3.0f}' for name, val in result.items()]
+ return strings
+
+ def reset(self):
+ self._record = defaultdict(list)
+ self._active_timer_stack = []
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/typing.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/typing.py
new file mode 100644
index 0000000000000000000000000000000000000000..dfb0ee3f1955edb12996e992d726f6846a794c05
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/utils/typing.py
@@ -0,0 +1,34 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Dict, List, Optional, Tuple, Union
+
+from mmengine.config import ConfigDict
+from mmengine.structures import InstanceData, PixelData
+from torch import Tensor
+
+from mmpose.structures import PoseDataSample
+
+# Type hint of config data
+ConfigType = Union[ConfigDict, dict]
+OptConfigType = Optional[ConfigType]
+# Type hint of one or more config data
+MultiConfig = Union[ConfigType, List[ConfigType]]
+OptMultiConfig = Optional[MultiConfig]
+# Type hint of data samples
+SampleList = List[PoseDataSample]
+OptSampleList = Optional[SampleList]
+InstanceList = List[InstanceData]
+PixelDataList = List[PixelData]
+Predictions = Union[InstanceList, Tuple[InstanceList, PixelDataList]]
+# Type hint of model outputs
+ForwardResults = Union[Dict[str, Tensor], List[PoseDataSample], Tuple[Tensor],
+ Tensor]
+# Type hint of features
+# - Tuple[Tensor]: multi-level features extracted by the network
+# - List[Tuple[Tensor]]: multiple feature pyramids for TTA
+# - List[List[Tuple[Tensor]]]: multi-scale feature pyramids
+Features = Union[Tuple[Tensor], List[Tuple[Tensor]], List[List[Tuple[Tensor]]]]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/version.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/version.py
new file mode 100644
index 0000000000000000000000000000000000000000..58dc097b25bc7499e69063e18ac4b1f0a4acd1dd
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/version.py
@@ -0,0 +1,36 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+# __version__ = '1.1.0' ## forked mmpose version
+__version__ = '1.0.0'
+
+short_version = __version__
+
+def parse_version_info(version_str):
+ """Parse a version string into a tuple.
+
+ Args:
+ version_str (str): The version string.
+ Returns:
+ tuple[int | str]: The version info, e.g., "1.3.0" is parsed into
+ (1, 3, 0), and "2.0.0rc1" is parsed into (2, 0, 0, 'rc1').
+ """
+ version_info = []
+ for x in version_str.split('.'):
+ if x.isdigit():
+ version_info.append(int(x))
+ elif x.find('rc') != -1:
+ patch_version = x.split('rc')
+ version_info.append(int(patch_version[0]))
+ version_info.append(f'rc{patch_version[1]}')
+ elif x.find('b') != -1:
+ patch_version = x.split('b')
+ version_info.append(int(patch_version[0]))
+ version_info.append(f'b{patch_version[1]}')
+ return tuple(version_info)
+
+
+version_info = parse_version_info(__version__)
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/__init__.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a68b190e320cd6cd2f252e552349ec473ca8d5
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/__init__.py
@@ -0,0 +1,11 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from .fast_visualizer import FastVisualizer
+from .local_visualizer import PoseLocalVisualizer
+from .local_visualizer_3d import Pose3dLocalVisualizer
+
+__all__ = ['PoseLocalVisualizer', 'FastVisualizer', 'Pose3dLocalVisualizer']
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/fast_visualizer.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/fast_visualizer.py
new file mode 100644
index 0000000000000000000000000000000000000000..7933a0f412bba53fa081d3ab84a65410bc9e7b99
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/fast_visualizer.py
@@ -0,0 +1,83 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import cv2
+
+
+class FastVisualizer:
+ """MMPose Fast Visualizer.
+
+ A simple yet fast visualizer for video/webcam inference.
+
+ Args:
+ metainfo (dict): pose meta information
+ radius (int, optional)): Keypoint radius for visualization.
+ Defaults to 6.
+ line_width (int, optional): Link width for visualization.
+ Defaults to 3.
+ kpt_thr (float, optional): Threshold for keypoints' confidence score,
+ keypoints with score below this value will not be drawn.
+ Defaults to 0.3.
+ """
+
+ def __init__(self, metainfo, radius=6, line_width=3, kpt_thr=0.3):
+ self.radius = radius
+ self.line_width = line_width
+ self.kpt_thr = kpt_thr
+
+ self.keypoint_id2name = metainfo['keypoint_id2name']
+ self.keypoint_name2id = metainfo['keypoint_name2id']
+ self.keypoint_colors = metainfo['keypoint_colors']
+ self.skeleton_links = metainfo['skeleton_links']
+ self.skeleton_link_colors = metainfo['skeleton_link_colors']
+
+ def draw_pose(self, img, instances):
+ """Draw pose estimations on the given image.
+
+ This method draws keypoints and skeleton links on the input image
+ using the provided instances.
+
+ Args:
+ img (numpy.ndarray): The input image on which to
+ draw the pose estimations.
+ instances (object): An object containing detected instances'
+ information, including keypoints and keypoint_scores.
+
+ Returns:
+ None: The input image will be modified in place.
+ """
+
+ if instances is None:
+ print('no instance detected')
+ return
+
+ keypoints = instances.keypoints
+ scores = instances.keypoint_scores
+
+ for kpts, score in zip(keypoints, scores):
+ for sk_id, sk in enumerate(self.skeleton_links):
+ if score[sk[0]] < self.kpt_thr or score[sk[1]] < self.kpt_thr:
+ # skip the link that should not be drawn
+ continue
+
+ pos1 = (int(kpts[sk[0], 0]), int(kpts[sk[0], 1]))
+ pos2 = (int(kpts[sk[1], 0]), int(kpts[sk[1], 1]))
+
+ color = self.skeleton_link_colors[sk_id].tolist()
+ cv2.line(img, pos1, pos2, color, thickness=self.line_width)
+
+ for kid, kpt in enumerate(kpts):
+ if score[kid] < self.kpt_thr:
+ # skip the point that should not be drawn
+ continue
+
+ x_coord, y_coord = int(kpt[0]), int(kpt[1])
+
+ color = self.keypoint_colors[kid].tolist()
+ cv2.circle(img, (int(x_coord), int(y_coord)), self.radius,
+ color, -1)
+ cv2.circle(img, (int(x_coord), int(y_coord)), self.radius,
+ (255, 255, 255))
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/local_visualizer.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/local_visualizer.py
new file mode 100644
index 0000000000000000000000000000000000000000..53af7590687dad5cd715414aa55445f984eef4d3
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/local_visualizer.py
@@ -0,0 +1,601 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import math
+from typing import Dict, List, Optional, Tuple, Union
+
+import cv2
+import mmcv
+import numpy as np
+import torch
+from mmengine.dist import master_only
+from mmengine.structures import InstanceData, PixelData
+
+from mmpose.datasets.datasets.utils import parse_pose_metainfo
+from mmpose.registry import VISUALIZERS
+from mmpose.structures import PoseDataSample
+from .opencv_backend_visualizer import OpencvBackendVisualizer
+from .simcc_vis import SimCCVisualizer
+
+
+def _get_adaptive_scales(areas: np.ndarray,
+ min_area: int = 800,
+ max_area: int = 30000) -> np.ndarray:
+ """Get adaptive scales according to areas.
+
+ The scale range is [0.5, 1.0]. When the area is less than
+ ``min_area``, the scale is 0.5 while the area is larger than
+ ``max_area``, the scale is 1.0.
+
+ Args:
+ areas (ndarray): The areas of bboxes or masks with the
+ shape of (n, ).
+ min_area (int): Lower bound areas for adaptive scales.
+ Defaults to 800.
+ max_area (int): Upper bound areas for adaptive scales.
+ Defaults to 30000.
+
+ Returns:
+ ndarray: The adaotive scales with the shape of (n, ).
+ """
+ scales = 0.5 + (areas - min_area) / (max_area - min_area)
+ scales = np.clip(scales, 0.5, 1.0)
+ return scales
+
+
+@VISUALIZERS.register_module()
+class PoseLocalVisualizer(OpencvBackendVisualizer):
+ """MMPose Local Visualizer.
+
+ Args:
+ name (str): Name of the instance. Defaults to 'visualizer'.
+ image (np.ndarray, optional): the origin image to draw. The format
+ should be RGB. Defaults to ``None``
+ vis_backends (list, optional): Visual backend config list. Defaults to
+ ``None``
+ save_dir (str, optional): Save file dir for all storage backends.
+ If it is ``None``, the backend storage will not save any data.
+ Defaults to ``None``
+ bbox_color (str, tuple(int), optional): Color of bbox lines.
+ The tuple of color should be in BGR order. Defaults to ``'green'``
+ kpt_color (str, tuple(tuple(int)), optional): Color of keypoints.
+ The tuple of color should be in BGR order. Defaults to ``'red'``
+ link_color (str, tuple(tuple(int)), optional): Color of skeleton.
+ The tuple of color should be in BGR order. Defaults to ``None``
+ line_width (int, float): The width of lines. Defaults to 1
+ radius (int, float): The radius of keypoints. Defaults to 4
+ show_keypoint_weight (bool): Whether to adjust the transparency
+ of keypoints according to their score. Defaults to ``False``
+ alpha (int, float): The transparency of bboxes. Defaults to ``1.0``
+
+ Examples:
+ >>> import numpy as np
+ >>> from mmengine.structures import InstanceData
+ >>> from mmpose.structures import PoseDataSample
+ >>> from mmpose.visualization import PoseLocalVisualizer
+
+ >>> pose_local_visualizer = PoseLocalVisualizer(radius=1)
+ >>> image = np.random.randint(0, 256,
+ ... size=(10, 12, 3)).astype('uint8')
+ >>> gt_instances = InstanceData()
+ >>> gt_instances.keypoints = np.array([[[1, 1], [2, 2], [4, 4],
+ ... [8, 8]]])
+ >>> gt_pose_data_sample = PoseDataSample()
+ >>> gt_pose_data_sample.gt_instances = gt_instances
+ >>> dataset_meta = {'skeleton_links': [[0, 1], [1, 2], [2, 3]]}
+ >>> pose_local_visualizer.set_dataset_meta(dataset_meta)
+ >>> pose_local_visualizer.add_datasample('image', image,
+ ... gt_pose_data_sample)
+ >>> pose_local_visualizer.add_datasample(
+ ... 'image', image, gt_pose_data_sample,
+ ... out_file='out_file.jpg')
+ >>> pose_local_visualizer.add_datasample(
+ ... 'image', image, gt_pose_data_sample,
+ ... show=True)
+ >>> pred_instances = InstanceData()
+ >>> pred_instances.keypoints = np.array([[[1, 1], [2, 2], [4, 4],
+ ... [8, 8]]])
+ >>> pred_instances.score = np.array([0.8, 1, 0.9, 1])
+ >>> pred_pose_data_sample = PoseDataSample()
+ >>> pred_pose_data_sample.pred_instances = pred_instances
+ >>> pose_local_visualizer.add_datasample('image', image,
+ ... gt_pose_data_sample,
+ ... pred_pose_data_sample)
+ """
+
+ def __init__(self,
+ name: str = 'visualizer',
+ image: Optional[np.ndarray] = None,
+ vis_backends: Optional[Dict] = None,
+ save_dir: Optional[str] = None,
+ bbox_color: Optional[Union[str, Tuple[int]]] = 'green',
+ kpt_color: Optional[Union[str, Tuple[Tuple[int]]]] = 'red',
+ link_color: Optional[Union[str, Tuple[Tuple[int]]]] = None,
+ text_color: Optional[Union[str,
+ Tuple[int]]] = (255, 255, 255),
+ skeleton: Optional[Union[List, Tuple]] = None,
+ line_width: Union[int, float] = 1,
+ radius: Union[int, float] = 3,
+ show_keypoint_weight: bool = False,
+ backend: str = 'opencv',
+ alpha: float = 1.0):
+ super().__init__(
+ name=name,
+ image=image,
+ vis_backends=vis_backends,
+ save_dir=save_dir,
+ backend=backend)
+
+ self.bbox_color = bbox_color
+ self.kpt_color = kpt_color
+ self.link_color = link_color
+ self.line_width = line_width
+ self.text_color = text_color
+ self.skeleton = skeleton
+ self.radius = radius
+ self.alpha = alpha
+ self.show_keypoint_weight = show_keypoint_weight
+ # Set default value. When calling
+ # `PoseLocalVisualizer().set_dataset_meta(xxx)`,
+ # it will override the default value.
+ self.dataset_meta = {}
+
+ def set_dataset_meta(self,
+ dataset_meta: Dict,
+ skeleton_style: str = 'mmpose'):
+ """Assign dataset_meta to the visualizer. The default visualization
+ settings will be overridden.
+
+ Args:
+ dataset_meta (dict): meta information of dataset.
+ """
+ if dataset_meta.get(
+ 'dataset_name') == 'coco' and skeleton_style == 'openpose':
+ dataset_meta = parse_pose_metainfo(
+ dict(from_file='configs/_base_/datasets/coco_openpose.py'))
+
+ if dataset_meta.get(
+ 'dataset_name') == 'coco_mpii_crowdpose_aic' and skeleton_style == 'openpose':
+ dataset_meta = parse_pose_metainfo(
+ dict(from_file='configs/_base_/datasets/coco_openpose.py'))
+
+ if dataset_meta.get(
+ 'dataset_name') == 'coco_wholebody' and skeleton_style == 'openpose':
+ dataset_meta = parse_pose_metainfo(
+ dict(from_file='configs/_base_/datasets/coco_wholebody_openpose.py'))
+
+ if isinstance(dataset_meta, dict):
+ self.dataset_meta = dataset_meta.copy()
+ self.bbox_color = dataset_meta.get('bbox_color', self.bbox_color)
+ self.kpt_color = dataset_meta.get('keypoint_colors',
+ self.kpt_color)
+ self.link_color = dataset_meta.get('skeleton_link_colors',
+ self.link_color)
+ self.skeleton = dataset_meta.get('skeleton_links', self.skeleton)
+ # sometimes self.dataset_meta is manually set, which might be None.
+ # it should be converted to a dict at these times
+ if self.dataset_meta is None:
+ self.dataset_meta = {}
+
+ def _draw_instances_bbox(self, image: np.ndarray,
+ instances: InstanceData) -> np.ndarray:
+ """Draw bounding boxes and corresponding labels of GT or prediction.
+
+ Args:
+ image (np.ndarray): The image to draw.
+ instances (:obj:`InstanceData`): Data structure for
+ instance-level annotations or predictions.
+
+ Returns:
+ np.ndarray: the drawn image which channel is RGB.
+ """
+ self.set_image(image)
+
+ if 'bboxes' in instances:
+ bboxes = instances.bboxes
+ self.draw_bboxes(
+ bboxes,
+ edge_colors=self.bbox_color,
+ alpha=self.alpha,
+ line_widths=self.line_width)
+ else:
+ return self.get_image()
+
+ if 'labels' in instances and self.text_color is not None:
+ classes = self.dataset_meta.get('classes', None)
+ labels = instances.labels
+
+ positions = bboxes[:, :2]
+ areas = (bboxes[:, 3] - bboxes[:, 1]) * (
+ bboxes[:, 2] - bboxes[:, 0])
+ scales = _get_adaptive_scales(areas)
+
+ for i, (pos, label) in enumerate(zip(positions, labels)):
+ label_text = classes[
+ label] if classes is not None else f'class {label}'
+
+ if isinstance(self.bbox_color,
+ tuple) and max(self.bbox_color) > 1:
+ facecolor = [c / 255.0 for c in self.bbox_color]
+ else:
+ facecolor = self.bbox_color
+
+ self.draw_texts(
+ label_text,
+ pos,
+ colors=self.text_color,
+ font_sizes=int(13 * scales[i]),
+ vertical_alignments='bottom',
+ bboxes=[{
+ 'facecolor': facecolor,
+ 'alpha': 0.8,
+ 'pad': 0.7,
+ 'edgecolor': 'none'
+ }])
+
+ return self.get_image()
+
+ def _draw_instances_kpts(self,
+ image: np.ndarray,
+ instances: InstanceData,
+ kpt_thr: float = 0.3,
+ show_kpt_idx: bool = False,
+ skeleton_style: str = 'mmpose'):
+ """Draw keypoints and skeletons (optional) of GT or prediction.
+
+ Args:
+ image (np.ndarray): The image to draw.
+ instances (:obj:`InstanceData`): Data structure for
+ instance-level annotations or predictions.
+ kpt_thr (float, optional): Minimum threshold of keypoints
+ to be shown. Default: 0.3.
+ show_kpt_idx (bool): Whether to show the index of keypoints.
+ Defaults to ``False``
+ skeleton_style (str): Skeleton style selection. Defaults to
+ ``'mmpose'``
+
+ Returns:
+ np.ndarray: the drawn image which channel is RGB.
+ """
+
+ if skeleton_style == 'openpose':
+ self.set_image(0*image) ## black background
+ else:
+ self.set_image(image)
+
+ img_h, img_w, _ = image.shape
+
+ if 'keypoints' in instances:
+ keypoints = instances.get('transformed_keypoints', instances.keypoints)
+
+ if 'keypoint_scores' in instances:
+ scores = instances.keypoint_scores
+ else:
+ scores = np.ones(keypoints.shape[:-1])
+
+ if 'keypoints_visible' in instances:
+ keypoints_visible = instances.keypoints_visible
+ else:
+ keypoints_visible = np.ones(keypoints.shape[:-1])
+
+ if skeleton_style == 'openpose':
+ keypoints_info = np.concatenate(
+ (keypoints, scores[..., None], keypoints_visible[...,
+ None]),
+ axis=-1)
+ # compute neck joint
+ neck = np.mean(keypoints_info[:, [5, 6]], axis=1)
+ # neck score when visualizing pred
+ neck[:, 2:4] = np.logical_and(
+ keypoints_info[:, 5, 2:4] > kpt_thr,
+ keypoints_info[:, 6, 2:4] > kpt_thr).astype(int)
+ new_keypoints_info = np.insert(
+ keypoints_info, 17, neck, axis=1)
+
+ mmpose_idx = [
+ 17, 6, 8, 10, 7, 9, 12, 14, 16, 13, 15, 2, 1, 4, 3
+ ]
+ openpose_idx = [
+ 1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17
+ ]
+ new_keypoints_info[:, openpose_idx] = \
+ new_keypoints_info[:, mmpose_idx]
+ keypoints_info = new_keypoints_info
+
+ keypoints, scores, keypoints_visible = keypoints_info[
+ ..., :2], keypoints_info[..., 2], keypoints_info[..., 3]
+
+ for kpts, score, visible in zip(keypoints, scores,
+ keypoints_visible):
+ kpts = np.array(kpts, copy=False)
+
+ if self.kpt_color is None or isinstance(self.kpt_color, str):
+ kpt_color = [self.kpt_color] * len(kpts)
+ elif len(self.kpt_color) == len(kpts):
+ kpt_color = self.kpt_color
+ else:
+ raise ValueError(
+ f'the length of kpt_color '
+ f'({len(self.kpt_color)}) does not matches '
+ f'that of keypoints ({len(kpts)})')
+
+ # draw links
+ if self.skeleton is not None and self.link_color is not None:
+ if self.link_color is None or isinstance(
+ self.link_color, str):
+ link_color = [self.link_color] * len(self.skeleton)
+ elif len(self.link_color) == len(self.skeleton):
+ link_color = self.link_color
+ else:
+ raise ValueError(
+ f'the length of link_color '
+ f'({len(self.link_color)}) does not matches '
+ f'that of skeleton ({len(self.skeleton)})')
+
+ for sk_id, sk in enumerate(self.skeleton):
+ pos1 = (int(kpts[sk[0], 0]), int(kpts[sk[0], 1]))
+ pos2 = (int(kpts[sk[1], 0]), int(kpts[sk[1], 1]))
+ if not (visible[sk[0]] and visible[sk[1]]):
+ continue
+
+ if (pos1[0] <= 0 or pos1[0] >= img_w or pos1[1] <= 0
+ or pos1[1] >= img_h or pos2[0] <= 0
+ or pos2[0] >= img_w or pos2[1] <= 0
+ or pos2[1] >= img_h or score[sk[0]] < kpt_thr
+ or score[sk[1]] < kpt_thr
+ or link_color[sk_id] is None):
+ # skip the link that should not be drawn
+ continue
+ X = np.array((pos1[0], pos2[0]))
+ Y = np.array((pos1[1], pos2[1]))
+ color = link_color[sk_id]
+ if not isinstance(color, str):
+ color = tuple(int(c) for c in color)
+ transparency = self.alpha
+ if self.show_keypoint_weight:
+ transparency *= max(
+ 0, min(1, 0.5 * (score[sk[0]] + score[sk[1]])))
+
+ if skeleton_style == 'openpose':
+ mX = np.mean(X)
+ mY = np.mean(Y)
+ length = ((Y[0] - Y[1])**2 + (X[0] - X[1])**2)**0.5
+ transparency = 0.6
+ angle = math.degrees(
+ math.atan2(Y[0] - Y[1], X[0] - X[1]))
+ polygons = cv2.ellipse2Poly(
+ (int(mX), int(mY)),
+ (int(length / 2), int(self.line_width)),
+ int(angle), 0, 360, 1)
+
+ self.draw_polygons(
+ polygons,
+ edge_colors=color,
+ face_colors=color,
+ alpha=transparency)
+
+ else:
+ self.draw_lines(
+ X, Y, color, line_widths=self.line_width)
+
+ # draw each point on image
+ for kid, kpt in enumerate(kpts):
+ if score[kid] < kpt_thr or not visible[
+ kid] or kpt_color[kid] is None:
+ # skip the point that should not be drawn
+ continue
+
+ color = kpt_color[kid]
+ if not isinstance(color, str):
+ color = tuple(int(c) for c in color)
+ transparency = self.alpha
+ if self.show_keypoint_weight:
+ transparency *= max(0, min(1, score[kid]))
+ self.draw_circles(
+ kpt,
+ radius=np.array([self.radius]),
+ face_colors=color,
+ edge_colors=color,
+ alpha=transparency,
+ line_widths=self.radius)
+ if show_kpt_idx:
+ kpt[0] += self.radius
+ kpt[1] -= self.radius
+ self.draw_texts(
+ str(kid),
+ kpt,
+ colors=color,
+ font_sizes=self.radius * 3,
+ vertical_alignments='bottom',
+ horizontal_alignments='center')
+
+ return self.get_image()
+
+ def _draw_instance_heatmap(
+ self,
+ fields: PixelData,
+ overlaid_image: Optional[np.ndarray] = None,
+ ):
+ """Draw heatmaps of GT or prediction.
+
+ Args:
+ fields (:obj:`PixelData`): Data structure for
+ pixel-level annotations or predictions.
+ overlaid_image (np.ndarray): The image to draw.
+
+ Returns:
+ np.ndarray: the drawn image which channel is RGB.
+ """
+ if 'heatmaps' not in fields:
+ return None
+ heatmaps = fields.heatmaps
+ if isinstance(heatmaps, np.ndarray):
+ heatmaps = torch.from_numpy(heatmaps)
+ if heatmaps.dim() == 3:
+ heatmaps, _ = heatmaps.max(dim=0)
+ heatmaps = heatmaps.unsqueeze(0)
+ out_image = self.draw_featmap(heatmaps, overlaid_image)
+ return out_image
+
+ def _draw_instance_xy_heatmap(
+ self,
+ fields: PixelData,
+ overlaid_image: Optional[np.ndarray] = None,
+ n: int = 20,
+ ):
+ """Draw heatmaps of GT or prediction.
+
+ Args:
+ fields (:obj:`PixelData`): Data structure for
+ pixel-level annotations or predictions.
+ overlaid_image (np.ndarray): The image to draw.
+ n (int): Number of keypoint, up to 20.
+
+ Returns:
+ np.ndarray: the drawn image which channel is RGB.
+ """
+ if 'heatmaps' not in fields:
+ return None
+ heatmaps = fields.heatmaps
+ _, h, w = heatmaps.shape
+ if isinstance(heatmaps, np.ndarray):
+ heatmaps = torch.from_numpy(heatmaps)
+ out_image = SimCCVisualizer().draw_instance_xy_heatmap(
+ heatmaps, overlaid_image, n)
+ out_image = cv2.resize(out_image[:, :, ::-1], (w, h))
+ return out_image
+
+ @master_only
+ def add_datasample(self,
+ name: str,
+ image: np.ndarray,
+ data_sample: PoseDataSample,
+ draw_gt: bool = True,
+ draw_pred: bool = True,
+ draw_heatmap: bool = False,
+ draw_bbox: bool = False,
+ show_kpt_idx: bool = False,
+ skeleton_style: str = 'mmpose',
+ show: bool = False,
+ wait_time: float = 0,
+ out_file: Optional[str] = None,
+ kpt_thr: float = 0.3,
+ step: int = 0) -> None:
+ """Draw datasample and save to all backends.
+
+ - If GT and prediction are plotted at the same time, they are
+ displayed in a stitched image where the left image is the
+ ground truth and the right image is the prediction.
+ - If ``show`` is True, all storage backends are ignored, and
+ the images will be displayed in a local window.
+ - If ``out_file`` is specified, the drawn image will be
+ saved to ``out_file``. t is usually used when the display
+ is not available.
+
+ Args:
+ name (str): The image identifier
+ image (np.ndarray): The image to draw
+ data_sample (:obj:`PoseDataSample`, optional): The data sample
+ to visualize
+ draw_gt (bool): Whether to draw GT PoseDataSample. Default to
+ ``True``
+ draw_pred (bool): Whether to draw Prediction PoseDataSample.
+ Defaults to ``True``
+ draw_bbox (bool): Whether to draw bounding boxes. Default to
+ ``False``
+ draw_heatmap (bool): Whether to draw heatmaps. Defaults to
+ ``False``
+ show_kpt_idx (bool): Whether to show the index of keypoints.
+ Defaults to ``False``
+ skeleton_style (str): Skeleton style selection. Defaults to
+ ``'mmpose'``
+ show (bool): Whether to display the drawn image. Default to
+ ``False``
+ wait_time (float): The interval of show (s). Defaults to 0
+ out_file (str): Path to output file. Defaults to ``None``
+ kpt_thr (float, optional): Minimum threshold of keypoints
+ to be shown. Default: 0.3.
+ step (int): Global step value to record. Defaults to 0
+ """
+
+ gt_img_data = None
+ pred_img_data = None
+
+ if draw_gt:
+ gt_img_data = image.copy()
+ gt_img_heatmap = None
+
+ # draw bboxes & keypoints
+ if 'gt_instances' in data_sample:
+ gt_img_data = self._draw_instances_kpts(
+ gt_img_data, data_sample.gt_instances, kpt_thr,
+ show_kpt_idx, skeleton_style)
+ if draw_bbox:
+ gt_img_data = self._draw_instances_bbox(
+ gt_img_data, data_sample.gt_instances)
+
+ # draw heatmaps
+ if 'gt_fields' in data_sample and draw_heatmap:
+ gt_img_heatmap = self._draw_instance_heatmap(
+ data_sample.gt_fields, image)
+ if gt_img_heatmap is not None:
+ gt_img_data = np.concatenate((gt_img_data, gt_img_heatmap),
+ axis=0)
+
+ if draw_pred:
+ pred_img_data = image.copy()
+ pred_img_heatmap = None
+
+ # draw bboxes & keypoints
+ if 'pred_instances' in data_sample:
+ pred_img_data = self._draw_instances_kpts(
+ pred_img_data, data_sample.pred_instances, kpt_thr,
+ show_kpt_idx, skeleton_style)
+ if draw_bbox:
+ pred_img_data = self._draw_instances_bbox(
+ pred_img_data, data_sample.pred_instances)
+
+ # draw heatmaps
+ if 'pred_fields' in data_sample and draw_heatmap:
+ if 'keypoint_x_labels' in data_sample.pred_instances:
+ pred_img_heatmap = self._draw_instance_xy_heatmap(
+ data_sample.pred_fields, image)
+ else:
+ pred_img_heatmap = self._draw_instance_heatmap(
+ data_sample.pred_fields, image)
+ if pred_img_heatmap is not None:
+ pred_img_data = np.concatenate(
+ (pred_img_data, pred_img_heatmap), axis=0)
+
+ # merge visualization results
+ if gt_img_data is not None and pred_img_data is not None:
+ if gt_img_heatmap is None and pred_img_heatmap is not None:
+ gt_img_data = np.concatenate((gt_img_data, image), axis=0)
+ elif gt_img_heatmap is not None and pred_img_heatmap is None:
+ pred_img_data = np.concatenate((pred_img_data, image), axis=0)
+
+ drawn_img = np.concatenate((gt_img_data, pred_img_data), axis=1)
+
+ elif gt_img_data is not None:
+ drawn_img = gt_img_data
+ else:
+ drawn_img = pred_img_data
+
+ # It is convenient for users to obtain the drawn image.
+ # For example, the user wants to obtain the drawn image and
+ # save it as a video during video inference.
+ self.set_image(drawn_img)
+
+ if show:
+ self.show(drawn_img, win_name=name, wait_time=wait_time)
+
+ if out_file is not None:
+ mmcv.imwrite(drawn_img[..., ::-1], out_file)
+ else:
+ # save drawn_img to backends
+ self.add_image(name, drawn_img, step)
+
+ return self.get_image()
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/local_visualizer_3d.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/local_visualizer_3d.py
new file mode 100644
index 0000000000000000000000000000000000000000..44663be18f1f6618ddf3d0c8be554f1a3282cc59
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/local_visualizer_3d.py
@@ -0,0 +1,700 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+import math
+from typing import Dict, List, Optional, Tuple, Union
+
+import cv2
+import mmcv
+import numpy as np
+from matplotlib import pyplot as plt
+from mmengine.dist import master_only
+from mmengine.structures import InstanceData
+
+from mmpose.registry import VISUALIZERS
+from mmpose.structures import PoseDataSample
+from . import PoseLocalVisualizer
+
+
+@VISUALIZERS.register_module()
+class Pose3dLocalVisualizer(PoseLocalVisualizer):
+ def __init__(
+ self,
+ name: str = 'visualizer',
+ image: Optional[np.ndarray] = None,
+ vis_backends: Optional[Dict] = None,
+ save_dir: Optional[str] = None,
+ bbox_color: Optional[Union[str, Tuple[int]]] = 'green',
+ kpt_color: Optional[Union[str, Tuple[Tuple[int]]]] = 'red',
+ link_color: Optional[Union[str, Tuple[Tuple[int]]]] = None,
+ text_color: Optional[Union[str, Tuple[int]]] = (255, 255, 255),
+ skeleton: Optional[Union[List, Tuple]] = None,
+ line_width: Union[int, float] = 1,
+ radius: Union[int, float] = 3,
+ show_keypoint_weight: bool = False,
+ backend: str = 'opencv',
+ alpha: float = 0.8,
+ det_kpt_color: Optional[Union[str, Tuple[Tuple[int]]]] = None,
+ det_dataset_skeleton: Optional[Union[str,
+ Tuple[Tuple[int]]]] = None,
+ det_dataset_link_color: Optional[np.ndarray] = None):
+
+ super().__init__(name, image, vis_backends, save_dir, bbox_color,
+ kpt_color, link_color, text_color, skeleton,
+ line_width, radius, show_keypoint_weight, backend,
+ alpha)
+ self.det_kpt_color = det_kpt_color
+ self.det_dataset_skeleton = det_dataset_skeleton
+ self.det_dataset_link_color = det_dataset_link_color
+
+
+ def _draw_3d_keypoints(
+ self,
+ image: np.ndarray,
+ keypoints_3d: np.ndarray,
+ keypoints_3d_scores: np.ndarray,
+ kpt_thr: float = 0.3,
+ num_instances=-1,
+ axis_elev: float = 15.0,
+ axis_azimuth: float = 70,
+ axis_roll: float = 0,
+ x_axis_limit: float = 1.7,
+ y_axis_limit: float = 1.7,
+ z_axis_limit: float = 1.7,
+ axis_dist: float = 10.0,
+ radius: int = 10,
+ thickness: int = 10,
+ ):
+ """ axis_azimuth (float): axis azimuth angle for 3D visualizations.
+ axis_dist (float): axis distance for 3D visualizations.
+ axis_elev (float): axis elevation view angle for 3D visualizations.
+ axis_limit (float): The axis limit to visualize 3d pose. The xyz
+ range will be set as:
+ - x: [x_c - axis_limit/2, x_c + axis_limit/2]
+ - y: [y_c - axis_limit/2, y_c + axis_limit/2]
+ - z: [0, axis_limit]c
+ Where x_c, y_c is the mean value of x and y coordinates
+ """
+ vis_height, vis_width, _ = image.shape
+ num_instances = len(keypoints_3d)
+ num_fig = num_instances
+
+ plt.ioff()
+ fig = plt.figure(figsize=(vis_width * num_instances * 0.01, vis_height * 0.01))
+
+ def _draw_3d_instances_kpts(keypoints,
+ scores,
+ keypoints_visible,
+ fig_idx,
+ title=None):
+
+ for idx, (kpts, score, visible) in enumerate(zip(keypoints, scores, keypoints_visible)):
+ valid = np.logical_and(score >= kpt_thr, np.any(~np.isnan(kpts), axis=-1))
+
+ ax = fig.add_subplot(1, num_fig, fig_idx * (idx + 1), projection='3d')
+ ax.view_init(elev=axis_elev, azim=axis_azimuth, roll=axis_roll)
+ # ax.set_aspect('auto')
+ ax.set_aspect('equal')
+ ax.set_xticks([])
+ ax.set_yticks([])
+ ax.set_zticks([])
+ ax.set_xticklabels([])
+ ax.set_yticklabels([])
+ ax.set_zticklabels([])
+ if title:
+ ax.set_title(f'{title} ({idx})')
+ ax.dist = axis_dist
+
+ # x_c = 0
+ # y_c = 0
+
+ # ax.set_xlim3d([x_c - x_axis_limit / 2, x_c + x_axis_limit / 2])
+ # ax.set_ylim3d([y_c - y_axis_limit / 2, y_c + y_axis_limit / 2])
+ # ax.set_zlim3d([0, z_axis_limit])
+
+ kpts = np.array(kpts, copy=False)
+
+ kpts_valid = kpts[valid] # only use valid keypoints
+ # Calculate min and max for each dimension
+ min_x, min_y, min_z = np.min(kpts_valid, axis=0)
+ max_x, max_y, max_z = np.max(kpts_valid, axis=0)
+
+ # Add a margin (e.g., 10% of the range)
+ margin_x = 0.1 * (max_x - min_x)
+ margin_y = 0.1 * (max_y - min_y)
+ margin_z = 0.1 * (max_z - min_z)
+
+ # Set limits with margin
+ ax.set_xlim3d([min_x - margin_x, max_x + margin_x])
+ ax.set_ylim3d([min_y - margin_y, max_y + margin_y])
+ ax.set_zlim3d([min_z - margin_z, max_z + margin_z])
+
+ # Adjust aspect ratio based on data range
+ max_range = np.array([max_x-min_x, max_y-min_y, max_z-min_z]).max()
+ mid_x = (max_x + min_x) * 0.5
+ mid_y = (max_y + min_y) * 0.5
+ mid_z = (max_z + min_z) * 0.5
+ ax.set_xlim(mid_x - max_range * 0.5, mid_x + max_range * 0.5)
+ ax.set_ylim(mid_y - max_range * 0.5, mid_y + max_range * 0.5)
+ ax.set_zlim(mid_z - max_range * 0.5, mid_z + max_range * 0.5)
+
+ # Set aspect to 'equal' for true proportions
+ ax.set_aspect('equal')
+
+ if self.kpt_color is None or isinstance(self.kpt_color, str):
+ kpt_color = [self.kpt_color] * len(kpts)
+ elif len(self.kpt_color) == len(kpts):
+ kpt_color = self.kpt_color
+ else:
+ raise ValueError(
+ f'the length of kpt_color '
+ f'({len(self.kpt_color)}) does not matches '
+ f'that of keypoints ({len(kpts)})')
+
+ kpts_valid = kpts[valid] ## only draw valid keypoints
+ x_3d, y_3d, z_3d = np.split(kpts_valid[:, :3], [1, 2], axis=1)
+ kpt_color = kpt_color[valid][..., ::-1] / 255.
+
+ ax.scatter(x_3d, y_3d, z_3d, marker='o', color=kpt_color, s=radius)
+
+ if self.skeleton is not None and self.link_color is not None:
+ if self.link_color is None or isinstance(
+ self.link_color, str):
+ link_color = [self.link_color] * len(self.skeleton)
+ elif len(self.link_color) == len(self.skeleton):
+ link_color = self.link_color
+ else:
+ raise ValueError(
+ f'the length of link_color '
+ f'({len(self.link_color)}) does not matches '
+ f'that of skeleton ({len(self.skeleton)})')
+
+ for sk_id, sk in enumerate(self.skeleton):
+ sk_indices = [_i for _i in sk]
+ xs_3d = kpts[sk_indices, 0]
+ ys_3d = kpts[sk_indices, 1]
+ zs_3d = kpts[sk_indices, 2]
+ kpt_score = score[sk_indices]
+ if kpt_score.min() > kpt_thr:
+ # matplotlib uses RGB color in [0, 1] value range
+ _color = link_color[sk_id][::-1] / 255.
+ ax.plot(xs_3d, ys_3d, zs_3d, color=_color, zdir='z', linewidth=thickness) # Set the linewidth here
+
+ if keypoints_3d_scores is not None:
+ scores = keypoints_3d_scores
+ else:
+ scores = np.ones(keypoints_3d.shape[:-1])
+
+ keypoints_3d_visible = np.ones(keypoints_3d.shape[:-1])
+ _draw_3d_instances_kpts(keypoints_3d, scores, keypoints_3d_visible, 1)
+
+ # convert figure to numpy array
+ fig.tight_layout()
+ fig.canvas.draw()
+
+ pred_img_data = fig.canvas.tostring_rgb()
+ pred_img_data = np.frombuffer(
+ fig.canvas.tostring_rgb(), dtype=np.uint8)
+
+ if not pred_img_data.any():
+ pred_img_data = np.full((vis_height, vis_width, 3), 255)
+ else:
+ pred_img_data = pred_img_data.reshape(vis_height,
+ vis_width * num_instances,
+ -1)
+
+ plt.close(fig)
+
+ return pred_img_data
+
+ def _draw_3d_data_samples(
+ self,
+ image: np.ndarray,
+ pose_samples: PoseDataSample,
+ draw_gt: bool = True,
+ kpt_thr: float = 0.3,
+ num_instances=-1,
+ axis_azimuth: float = 70,
+ axis_limit: float = 1.7,
+ axis_dist: float = 10.0,
+ axis_elev: float = 15.0,
+ ):
+ """Draw keypoints and skeletons (optional) of GT or prediction.
+
+ Args:
+ image (np.ndarray): The image to draw.
+ instances (:obj:`InstanceData`): Data structure for
+ instance-level annotations or predictions.
+ draw_gt (bool): Whether to draw GT PoseDataSample. Default to
+ ``True``
+ kpt_thr (float, optional): Minimum threshold of keypoints
+ to be shown. Default: 0.3.
+ num_instances (int): Number of instances to be shown in 3D. If
+ smaller than 0, all the instances in the pose_result will be
+ shown. Otherwise, pad or truncate the pose_result to a length
+ of num_instances.
+ axis_azimuth (float): axis azimuth angle for 3D visualizations.
+ axis_dist (float): axis distance for 3D visualizations.
+ axis_elev (float): axis elevation view angle for 3D visualizations.
+ axis_limit (float): The axis limit to visualize 3d pose. The xyz
+ range will be set as:
+ - x: [x_c - axis_limit/2, x_c + axis_limit/2]
+ - y: [y_c - axis_limit/2, y_c + axis_limit/2]
+ - z: [0, axis_limit]
+ Where x_c, y_c is the mean value of x and y coordinates
+
+ Returns:
+ Tuple(np.ndarray): the drawn image which channel is RGB.
+ """
+ vis_height, vis_width, _ = image.shape
+
+ if 'pred_instances' in pose_samples:
+ pred_instances = pose_samples.pred_instances
+ else:
+ pred_instances = InstanceData()
+ if num_instances < 0:
+ if 'keypoints' in pred_instances:
+ num_instances = len(pred_instances)
+ else:
+ num_instances = 0
+ else:
+ if len(pred_instances) > num_instances:
+ pred_instances_ = InstanceData()
+ for k in pred_instances.keys():
+ new_val = pred_instances[k][:num_instances]
+ pred_instances_.set_field(new_val, k)
+ pred_instances = pred_instances_
+ elif num_instances < len(pred_instances):
+ num_instances = len(pred_instances)
+
+ num_fig = num_instances
+ if draw_gt:
+ vis_width *= 2
+ num_fig *= 2
+
+ plt.ioff()
+ fig = plt.figure(
+ figsize=(vis_width * num_instances * 0.01, vis_height * 0.01))
+
+ def _draw_3d_instances_kpts(keypoints,
+ scores,
+ keypoints_visible,
+ fig_idx,
+ title=None):
+
+ for idx, (kpts, score, visible) in enumerate(
+ zip(keypoints, scores, keypoints_visible)):
+
+ valid = np.logical_and(score >= kpt_thr,
+ np.any(~np.isnan(kpts), axis=-1))
+
+ ax = fig.add_subplot(
+ 1, num_fig, fig_idx * (idx + 1), projection='3d')
+ ax.view_init(elev=axis_elev, azim=axis_azimuth)
+ ax.set_zlim3d([0, axis_limit])
+ ax.set_aspect('auto')
+ ax.set_xticks([])
+ ax.set_yticks([])
+ ax.set_zticks([])
+ ax.set_xticklabels([])
+ ax.set_yticklabels([])
+ ax.set_zticklabels([])
+ ax.scatter([0], [0], [0], marker='o', color='red')
+ if title:
+ ax.set_title(f'{title} ({idx})')
+ ax.dist = axis_dist
+
+ x_c = np.mean(kpts[valid, 0]) if valid.any() else 0
+ y_c = np.mean(kpts[valid, 1]) if valid.any() else 0
+
+ ax.set_xlim3d([x_c - axis_limit / 2, x_c + axis_limit / 2])
+ ax.set_ylim3d([y_c - axis_limit / 2, y_c + axis_limit / 2])
+
+ kpts = np.array(kpts, copy=False)
+
+ if self.kpt_color is None or isinstance(self.kpt_color, str):
+ kpt_color = [self.kpt_color] * len(kpts)
+ elif len(self.kpt_color) == len(kpts):
+ kpt_color = self.kpt_color
+ else:
+ raise ValueError(
+ f'the length of kpt_color '
+ f'({len(self.kpt_color)}) does not matches '
+ f'that of keypoints ({len(kpts)})')
+
+ kpts = kpts[valid]
+ x_3d, y_3d, z_3d = np.split(kpts[:, :3], [1, 2], axis=1)
+
+ kpt_color = kpt_color[valid][..., ::-1] / 255.
+
+ ax.scatter(x_3d, y_3d, z_3d, marker='o', color=kpt_color)
+
+ for kpt_idx in range(len(x_3d)):
+ ax.text(x_3d[kpt_idx][0], y_3d[kpt_idx][0],
+ z_3d[kpt_idx][0], str(kpt_idx))
+
+ if self.skeleton is not None and self.link_color is not None:
+ if self.link_color is None or isinstance(
+ self.link_color, str):
+ link_color = [self.link_color] * len(self.skeleton)
+ elif len(self.link_color) == len(self.skeleton):
+ link_color = self.link_color
+ else:
+ raise ValueError(
+ f'the length of link_color '
+ f'({len(self.link_color)}) does not matches '
+ f'that of skeleton ({len(self.skeleton)})')
+
+ for sk_id, sk in enumerate(self.skeleton):
+ sk_indices = [_i for _i in sk]
+ xs_3d = kpts[sk_indices, 0]
+ ys_3d = kpts[sk_indices, 1]
+ zs_3d = kpts[sk_indices, 2]
+ kpt_score = score[sk_indices]
+ if kpt_score.min() > kpt_thr:
+ # matplotlib uses RGB color in [0, 1] value range
+ _color = link_color[sk_id][::-1] / 255.
+ ax.plot(
+ xs_3d, ys_3d, zs_3d, color=_color, zdir='z')
+
+ if 'keypoints' in pred_instances:
+ keypoints = pred_instances.get('keypoints',
+ pred_instances.keypoints)
+
+ if 'keypoint_scores' in pred_instances:
+ scores = pred_instances.keypoint_scores
+ else:
+ scores = np.ones(keypoints.shape[:-1])
+
+ if 'keypoints_visible' in pred_instances:
+ keypoints_visible = pred_instances.keypoints_visible
+ else:
+ keypoints_visible = np.ones(keypoints.shape[:-1])
+
+ _draw_3d_instances_kpts(keypoints, scores, keypoints_visible, 1,
+ 'Prediction')
+
+ if draw_gt and 'gt_instances' in pose_samples:
+ gt_instances = pose_samples.gt_instances
+ if 'lifting_target' in gt_instances:
+ keypoints = gt_instances.get('lifting_target',
+ gt_instances.lifting_target)
+ scores = np.ones(keypoints.shape[:-1])
+
+ if 'lifting_target_visible' in gt_instances:
+ keypoints_visible = gt_instances.lifting_target_visible
+ else:
+ keypoints_visible = np.ones(keypoints.shape[:-1])
+
+ _draw_3d_instances_kpts(keypoints, scores, keypoints_visible,
+ 2, 'Ground Truth')
+
+ # convert figure to numpy array
+ fig.tight_layout()
+ fig.canvas.draw()
+
+ pred_img_data = fig.canvas.tostring_rgb()
+ pred_img_data = np.frombuffer(
+ fig.canvas.tostring_rgb(), dtype=np.uint8)
+
+ if not pred_img_data.any():
+ pred_img_data = np.full((vis_height, vis_width, 3), 255)
+ else:
+ pred_img_data = pred_img_data.reshape(vis_height,
+ vis_width * num_instances,
+ -1)
+
+ plt.close(fig)
+
+ return pred_img_data
+
+ def _draw_instances_kpts(self,
+ image: np.ndarray,
+ instances: InstanceData,
+ kpt_thr: float = 0.3,
+ show_kpt_idx: bool = False,
+ skeleton_style: str = 'mmpose'):
+ """Draw keypoints and skeletons (optional) of GT or prediction.
+
+ Args:
+ image (np.ndarray): The image to draw.
+ instances (:obj:`InstanceData`): Data structure for
+ instance-level annotations or predictions.
+ kpt_thr (float, optional): Minimum threshold of keypoints
+ to be shown. Default: 0.3.
+ show_kpt_idx (bool): Whether to show the index of keypoints.
+ Defaults to ``False``
+ skeleton_style (str): Skeleton style selection. Defaults to
+ ``'mmpose'``
+
+ Returns:
+ np.ndarray: the drawn image which channel is RGB.
+ """
+
+ self.set_image(image)
+ img_h, img_w, _ = image.shape
+
+ if 'keypoints' in instances:
+ keypoints = instances.get('transformed_keypoints',
+ instances.keypoints)
+
+ if 'keypoint_scores' in instances:
+ scores = instances.keypoint_scores
+ else:
+ scores = np.ones(keypoints.shape[:-1])
+
+ if 'keypoints_visible' in instances:
+ keypoints_visible = instances.keypoints_visible
+ else:
+ keypoints_visible = np.ones(keypoints.shape[:-1])
+
+ if skeleton_style == 'openpose':
+ keypoints_info = np.concatenate(
+ (keypoints, scores[..., None], keypoints_visible[...,
+ None]),
+ axis=-1)
+ # compute neck joint
+ neck = np.mean(keypoints_info[:, [5, 6]], axis=1)
+ # neck score when visualizing pred
+ neck[:, 2:4] = np.logical_and(
+ keypoints_info[:, 5, 2:4] > kpt_thr,
+ keypoints_info[:, 6, 2:4] > kpt_thr).astype(int)
+ new_keypoints_info = np.insert(
+ keypoints_info, 17, neck, axis=1)
+
+ mmpose_idx = [
+ 17, 6, 8, 10, 7, 9, 12, 14, 16, 13, 15, 2, 1, 4, 3
+ ]
+ openpose_idx = [
+ 1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17
+ ]
+ new_keypoints_info[:, openpose_idx] = \
+ new_keypoints_info[:, mmpose_idx]
+ keypoints_info = new_keypoints_info
+
+ keypoints, scores, keypoints_visible = keypoints_info[
+ ..., :2], keypoints_info[..., 2], keypoints_info[..., 3]
+
+ kpt_color = self.kpt_color
+ if self.det_kpt_color is not None:
+ kpt_color = self.det_kpt_color
+
+ for kpts, score, visible in zip(keypoints, scores,
+ keypoints_visible):
+ kpts = np.array(kpts, copy=False)
+
+ if kpt_color is None or isinstance(kpt_color, str):
+ kpt_color = [kpt_color] * len(kpts)
+ elif len(kpt_color) == len(kpts):
+ kpt_color = kpt_color
+ else:
+ raise ValueError(f'the length of kpt_color '
+ f'({len(kpt_color)}) does not matches '
+ f'that of keypoints ({len(kpts)})')
+
+ # draw each point on image
+ for kid, kpt in enumerate(kpts):
+ if score[kid] < kpt_thr or not visible[
+ kid] or kpt_color[kid] is None:
+ # skip the point that should not be drawn
+ continue
+
+ color = kpt_color[kid]
+ if not isinstance(color, str):
+ color = tuple(int(c) for c in color)
+ transparency = self.alpha
+ if self.show_keypoint_weight:
+ transparency *= max(0, min(1, score[kid]))
+ self.draw_circles(
+ kpt,
+ radius=np.array([self.radius]),
+ face_colors=color,
+ edge_colors=color,
+ alpha=transparency,
+ line_widths=self.radius)
+ if show_kpt_idx:
+ self.draw_texts(
+ str(kid),
+ kpt,
+ colors=color,
+ font_sizes=self.radius * 3,
+ vertical_alignments='bottom',
+ horizontal_alignments='center')
+
+ # draw links
+ skeleton = self.skeleton
+ if self.det_dataset_skeleton is not None:
+ skeleton = self.det_dataset_skeleton
+ link_color = self.link_color
+ if self.det_dataset_link_color is not None:
+ link_color = self.det_dataset_link_color
+ if skeleton is not None and link_color is not None:
+ if link_color is None or isinstance(link_color, str):
+ link_color = [link_color] * len(skeleton)
+ elif len(link_color) == len(skeleton):
+ link_color = link_color
+ else:
+ raise ValueError(
+ f'the length of link_color '
+ f'({len(link_color)}) does not matches '
+ f'that of skeleton ({len(skeleton)})')
+
+ for sk_id, sk in enumerate(skeleton):
+ pos1 = (int(kpts[sk[0], 0]), int(kpts[sk[0], 1]))
+ pos2 = (int(kpts[sk[1], 0]), int(kpts[sk[1], 1]))
+ if not (visible[sk[0]] and visible[sk[1]]):
+ continue
+
+ if (pos1[0] <= 0 or pos1[0] >= img_w or pos1[1] <= 0
+ or pos1[1] >= img_h or pos2[0] <= 0
+ or pos2[0] >= img_w or pos2[1] <= 0
+ or pos2[1] >= img_h or score[sk[0]] < kpt_thr
+ or score[sk[1]] < kpt_thr
+ or link_color[sk_id] is None):
+ # skip the link that should not be drawn
+ continue
+ X = np.array((pos1[0], pos2[0]))
+ Y = np.array((pos1[1], pos2[1]))
+ color = link_color[sk_id]
+ if not isinstance(color, str):
+ color = tuple(int(c) for c in color)
+ transparency = self.alpha
+ if self.show_keypoint_weight:
+ transparency *= max(
+ 0, min(1, 0.5 * (score[sk[0]] + score[sk[1]])))
+
+ if skeleton_style == 'openpose':
+ mX = np.mean(X)
+ mY = np.mean(Y)
+ length = ((Y[0] - Y[1])**2 + (X[0] - X[1])**2)**0.5
+ angle = math.degrees(
+ math.atan2(Y[0] - Y[1], X[0] - X[1]))
+ stickwidth = 2
+ polygons = cv2.ellipse2Poly(
+ (int(mX), int(mY)),
+ (int(length / 2), int(stickwidth)), int(angle),
+ 0, 360, 1)
+
+ self.draw_polygons(
+ polygons,
+ edge_colors=color,
+ face_colors=color,
+ alpha=transparency)
+
+ else:
+ self.draw_lines(
+ X, Y, color, line_widths=self.line_width)
+
+ return self.get_image()
+
+ @master_only
+ def add_datasample(self,
+ name: str,
+ image: np.ndarray,
+ data_sample: PoseDataSample,
+ det_data_sample: Optional[PoseDataSample] = None,
+ draw_gt: bool = True,
+ draw_pred: bool = True,
+ draw_2d: bool = True,
+ draw_bbox: bool = False,
+ show_kpt_idx: bool = False,
+ skeleton_style: str = 'mmpose',
+ num_instances: int = -1,
+ show: bool = False,
+ wait_time: float = 0,
+ out_file: Optional[str] = None,
+ kpt_thr: float = 0.3,
+ step: int = 0) -> None:
+ """Draw datasample and save to all backends.
+
+ - If GT and prediction are plotted at the same time, they are
+ displayed in a stitched image where the left image is the
+ ground truth and the right image is the prediction.
+ - If ``show`` is True, all storage backends are ignored, and
+ the images will be displayed in a local window.
+ - If ``out_file`` is specified, the drawn image will be
+ saved to ``out_file``. t is usually used when the display
+ is not available.
+
+ Args:
+ name (str): The image identifier
+ image (np.ndarray): The image to draw
+ data_sample (:obj:`PoseDataSample`): The 3d data sample
+ to visualize
+ det_data_sample (:obj:`PoseDataSample`, optional): The 2d detection
+ data sample to visualize
+ draw_gt (bool): Whether to draw GT PoseDataSample. Default to
+ ``True``
+ draw_pred (bool): Whether to draw Prediction PoseDataSample.
+ Defaults to ``True``
+ draw_2d (bool): Whether to draw 2d detection results. Defaults to
+ ``True``
+ draw_bbox (bool): Whether to draw bounding boxes. Default to
+ ``False``
+ show_kpt_idx (bool): Whether to show the index of keypoints.
+ Defaults to ``False``
+ skeleton_style (str): Skeleton style selection. Defaults to
+ ``'mmpose'``
+ num_instances (int): Number of instances to be shown in 3D. If
+ smaller than 0, all the instances in the pose_result will be
+ shown. Otherwise, pad or truncate the pose_result to a length
+ of num_instances. Defaults to -1
+ show (bool): Whether to display the drawn image. Default to
+ ``False``
+ wait_time (float): The interval of show (s). Defaults to 0
+ out_file (str): Path to output file. Defaults to ``None``
+ kpt_thr (float, optional): Minimum threshold of keypoints
+ to be shown. Default: 0.3.
+ step (int): Global step value to record. Defaults to 0
+ """
+
+ det_img_data = None
+ gt_img_data = None
+
+ if draw_2d:
+ det_img_data = image.copy()
+
+ # draw bboxes & keypoints
+ if 'pred_instances' in det_data_sample:
+ det_img_data = self._draw_instances_kpts(
+ det_img_data, det_data_sample.pred_instances, kpt_thr,
+ show_kpt_idx, skeleton_style)
+ if draw_bbox:
+ det_img_data = self._draw_instances_bbox(
+ det_img_data, det_data_sample.pred_instances)
+
+ pred_img_data = self._draw_3d_data_samples(
+ image.copy(),
+ data_sample,
+ draw_gt=draw_gt,
+ num_instances=num_instances)
+
+ # merge visualization results
+ if det_img_data is not None and gt_img_data is not None:
+ drawn_img = np.concatenate(
+ (det_img_data, pred_img_data, gt_img_data), axis=1)
+ elif det_img_data is not None:
+ drawn_img = np.concatenate((det_img_data, pred_img_data), axis=1)
+ elif gt_img_data is not None:
+ drawn_img = np.concatenate((det_img_data, gt_img_data), axis=1)
+ else:
+ drawn_img = pred_img_data
+
+ # It is convenient for users to obtain the drawn image.
+ # For example, the user wants to obtain the drawn image and
+ # save it as a video during video inference.
+ self.set_image(drawn_img)
+
+ if show:
+ self.show(drawn_img, win_name=name, wait_time=wait_time)
+
+ if out_file is not None:
+ mmcv.imwrite(drawn_img[..., ::-1], out_file)
+ else:
+ # save drawn_img to backends
+ self.add_image(name, drawn_img, step)
+
+ return self.get_image()
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/opencv_backend_visualizer.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/opencv_backend_visualizer.py
new file mode 100644
index 0000000000000000000000000000000000000000..391bbeea0ebe26e65a2a0e7cf2e1005411ae3f77
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/opencv_backend_visualizer.py
@@ -0,0 +1,469 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import List, Optional, Union
+
+import cv2
+import mmcv
+import numpy as np
+import torch
+from mmengine.dist import master_only
+from mmengine.visualization import Visualizer
+
+
+class OpencvBackendVisualizer(Visualizer):
+ """Base visualizer with opencv backend support.
+
+ Args:
+ name (str): Name of the instance. Defaults to 'visualizer'.
+ image (np.ndarray, optional): the origin image to draw. The format
+ should be RGB. Defaults to None.
+ vis_backends (list, optional): Visual backend config list.
+ Defaults to None.
+ save_dir (str, optional): Save file dir for all storage backends.
+ If it is None, the backend storage will not save any data.
+ fig_save_cfg (dict): Keyword parameters of figure for saving.
+ Defaults to empty dict.
+ fig_show_cfg (dict): Keyword parameters of figure for showing.
+ Defaults to empty dict.
+ backend (str): Backend used to draw elements on the image and display
+ the image. Defaults to 'matplotlib'.
+ alpha (int, float): The transparency of bboxes. Defaults to ``1.0``
+ """
+
+ def __init__(self,
+ name='visualizer',
+ backend: str = 'matplotlib',
+ *args,
+ **kwargs):
+ super().__init__(name, *args, **kwargs)
+ assert backend in ('opencv', 'matplotlib'), f'the argument ' \
+ f'\'backend\' must be either \'opencv\' or \'matplotlib\', ' \
+ f'but got \'{backend}\'.'
+ self.backend = backend
+
+ @master_only
+ def set_image(self, image: np.ndarray) -> None:
+ """Set the image to draw.
+
+ Args:
+ image (np.ndarray): The image to draw.
+ backend (str): The backend to save the image.
+ """
+ assert image is not None
+ image = image.astype('uint8')
+ self._image = image
+ self.width, self.height = image.shape[1], image.shape[0]
+ self._default_font_size = max(
+ np.sqrt(self.height * self.width) // 90, 10)
+
+ if self.backend == 'matplotlib':
+ # add a small 1e-2 to avoid precision lost due to matplotlib's
+ # truncation (https://github.com/matplotlib/matplotlib/issues/15363) # noqa
+ self.fig_save.set_size_inches( # type: ignore
+ (self.width + 1e-2) / self.dpi,
+ (self.height + 1e-2) / self.dpi)
+ # self.canvas = mpl.backends.backend_cairo.FigureCanvasCairo(fig)
+ self.ax_save.cla()
+ self.ax_save.axis(False)
+ self.ax_save.imshow(
+ image,
+ extent=(0, self.width, self.height, 0),
+ interpolation='none')
+
+ @master_only
+ def get_image(self) -> np.ndarray:
+ """Get the drawn image. The format is RGB.
+
+ Returns:
+ np.ndarray: the drawn image which channel is RGB.
+ """
+ assert self._image is not None, 'Please set image using `set_image`'
+ if self.backend == 'matplotlib':
+ return super().get_image()
+ else:
+ return self._image
+
+ @master_only
+ def draw_circles(self,
+ center: Union[np.ndarray, torch.Tensor],
+ radius: Union[np.ndarray, torch.Tensor],
+ face_colors: Union[str, tuple, List[str],
+ List[tuple]] = 'none',
+ alpha: float = 1.0,
+ **kwargs) -> 'Visualizer':
+ """Draw single or multiple circles.
+
+ Args:
+ center (Union[np.ndarray, torch.Tensor]): The x coordinate of
+ each line' start and end points.
+ radius (Union[np.ndarray, torch.Tensor]): The y coordinate of
+ each line' start and end points.
+ edge_colors (Union[str, tuple, List[str], List[tuple]]): The
+ colors of circles. ``colors`` can have the same length with
+ lines or just single value. If ``colors`` is single value,
+ all the lines will have the same colors. Reference to
+ https://matplotlib.org/stable/gallery/color/named_colors.html
+ for more details. Defaults to 'g.
+ line_styles (Union[str, List[str]]): The linestyle
+ of lines. ``line_styles`` can have the same length with
+ texts or just single value. If ``line_styles`` is single
+ value, all the lines will have the same linestyle.
+ Reference to
+ https://matplotlib.org/stable/api/collections_api.html?highlight=collection#matplotlib.collections.AsteriskPolygonCollection.set_linestyle
+ for more details. Defaults to '-'.
+ line_widths (Union[Union[int, float], List[Union[int, float]]]):
+ The linewidth of lines. ``line_widths`` can have
+ the same length with lines or just single value.
+ If ``line_widths`` is single value, all the lines will
+ have the same linewidth. Defaults to 2.
+ face_colors (Union[str, tuple, List[str], List[tuple]]):
+ The face colors. Defaults to None.
+ alpha (Union[int, float]): The transparency of circles.
+ Defaults to 0.8.
+ """
+ if self.backend == 'matplotlib':
+ super().draw_circles(
+ center=center,
+ radius=radius,
+ face_colors=face_colors,
+ alpha=alpha,
+ **kwargs)
+ elif self.backend == 'opencv':
+ if isinstance(face_colors, str):
+ face_colors = mmcv.color_val(face_colors)
+
+ if alpha == 1.0:
+ self._image = cv2.circle(self._image,
+ (int(center[0]), int(center[1])),
+ int(radius), face_colors, -1)
+ else:
+ img = cv2.circle(self._image.copy(),
+ (int(center[0]), int(center[1])), int(radius),
+ face_colors, -1)
+ self._image = cv2.addWeighted(self._image, 1 - alpha, img,
+ alpha, 0)
+ else:
+ raise ValueError(f'got unsupported backend {self.backend}')
+
+ @master_only
+ def draw_texts(
+ self,
+ texts: Union[str, List[str]],
+ positions: Union[np.ndarray, torch.Tensor],
+ font_sizes: Optional[Union[int, List[int]]] = None,
+ colors: Union[str, tuple, List[str], List[tuple]] = 'g',
+ vertical_alignments: Union[str, List[str]] = 'top',
+ horizontal_alignments: Union[str, List[str]] = 'left',
+ bboxes: Optional[Union[dict, List[dict]]] = None,
+ **kwargs,
+ ) -> 'Visualizer':
+ """Draw single or multiple text boxes.
+
+ Args:
+ texts (Union[str, List[str]]): Texts to draw.
+ positions (Union[np.ndarray, torch.Tensor]): The position to draw
+ the texts, which should have the same length with texts and
+ each dim contain x and y.
+ font_sizes (Union[int, List[int]], optional): The font size of
+ texts. ``font_sizes`` can have the same length with texts or
+ just single value. If ``font_sizes`` is single value, all the
+ texts will have the same font size. Defaults to None.
+ colors (Union[str, tuple, List[str], List[tuple]]): The colors
+ of texts. ``colors`` can have the same length with texts or
+ just single value. If ``colors`` is single value, all the
+ texts will have the same colors. Reference to
+ https://matplotlib.org/stable/gallery/color/named_colors.html
+ for more details. Defaults to 'g.
+ vertical_alignments (Union[str, List[str]]): The verticalalignment
+ of texts. verticalalignment controls whether the y positional
+ argument for the text indicates the bottom, center or top side
+ of the text bounding box.
+ ``vertical_alignments`` can have the same length with
+ texts or just single value. If ``vertical_alignments`` is
+ single value, all the texts will have the same
+ verticalalignment. verticalalignment can be 'center' or
+ 'top', 'bottom' or 'baseline'. Defaults to 'top'.
+ horizontal_alignments (Union[str, List[str]]): The
+ horizontalalignment of texts. Horizontalalignment controls
+ whether the x positional argument for the text indicates the
+ left, center or right side of the text bounding box.
+ ``horizontal_alignments`` can have
+ the same length with texts or just single value.
+ If ``horizontal_alignments`` is single value, all the texts
+ will have the same horizontalalignment. Horizontalalignment
+ can be 'center','right' or 'left'. Defaults to 'left'.
+ font_families (Union[str, List[str]]): The font family of
+ texts. ``font_families`` can have the same length with texts or
+ just single value. If ``font_families`` is single value, all
+ the texts will have the same font family.
+ font_familiy can be 'serif', 'sans-serif', 'cursive', 'fantasy'
+ or 'monospace'. Defaults to 'sans-serif'.
+ bboxes (Union[dict, List[dict]], optional): The bounding box of the
+ texts. If bboxes is None, there are no bounding box around
+ texts. ``bboxes`` can have the same length with texts or
+ just single value. If ``bboxes`` is single value, all
+ the texts will have the same bbox. Reference to
+ https://matplotlib.org/stable/api/_as_gen/matplotlib.patches.FancyBboxPatch.html#matplotlib.patches.FancyBboxPatch
+ for more details. Defaults to None.
+ font_properties (Union[FontProperties, List[FontProperties]], optional):
+ The font properties of texts. FontProperties is
+ a ``font_manager.FontProperties()`` object.
+ If you want to draw Chinese texts, you need to prepare
+ a font file that can show Chinese characters properly.
+ For example: `simhei.ttf`, `simsun.ttc`, `simkai.ttf` and so on.
+ Then set ``font_properties=matplotlib.font_manager.FontProperties(fname='path/to/font_file')``
+ ``font_properties`` can have the same length with texts or
+ just single value. If ``font_properties`` is single value,
+ all the texts will have the same font properties.
+ Defaults to None.
+ `New in version 0.6.0.`
+ """ # noqa: E501
+
+ if self.backend == 'matplotlib':
+ super().draw_texts(
+ texts=texts,
+ positions=positions,
+ font_sizes=font_sizes,
+ colors=colors,
+ vertical_alignments=vertical_alignments,
+ horizontal_alignments=horizontal_alignments,
+ bboxes=bboxes,
+ **kwargs)
+
+ elif self.backend == 'opencv':
+ font_scale = max(0.1, font_sizes / 30)
+ thickness = max(1, font_sizes // 15)
+
+ text_size, text_baseline = cv2.getTextSize(texts,
+ cv2.FONT_HERSHEY_DUPLEX,
+ font_scale, thickness)
+
+ x = int(positions[0])
+ if horizontal_alignments == 'right':
+ x = max(0, x - text_size[0])
+ y = int(positions[1])
+ if vertical_alignments == 'top':
+ y = min(self.height, y + text_size[1])
+
+ if bboxes is not None:
+ bbox_color = bboxes[0]['facecolor']
+ if isinstance(bbox_color, str):
+ bbox_color = mmcv.color_val(bbox_color)
+
+ y = y - text_baseline // 2
+ self._image = cv2.rectangle(
+ self._image, (x, y - text_size[1] - text_baseline // 2),
+ (x + text_size[0], y + text_baseline // 2), bbox_color,
+ cv2.FILLED)
+
+ self._image = cv2.putText(self._image, texts, (x, y),
+ cv2.FONT_HERSHEY_SIMPLEX, font_scale,
+ colors, thickness - 1)
+ else:
+ raise ValueError(f'got unsupported backend {self.backend}')
+
+ @master_only
+ def draw_bboxes(self,
+ bboxes: Union[np.ndarray, torch.Tensor],
+ edge_colors: Union[str, tuple, List[str],
+ List[tuple]] = 'g',
+ line_widths: Union[Union[int, float],
+ List[Union[int, float]]] = 2,
+ **kwargs) -> 'Visualizer':
+ """Draw single or multiple bboxes.
+
+ Args:
+ bboxes (Union[np.ndarray, torch.Tensor]): The bboxes to draw with
+ the format of(x1,y1,x2,y2).
+ edge_colors (Union[str, tuple, List[str], List[tuple]]): The
+ colors of bboxes. ``colors`` can have the same length with
+ lines or just single value. If ``colors`` is single value, all
+ the lines will have the same colors. Refer to `matplotlib.
+ colors` for full list of formats that are accepted.
+ Defaults to 'g'.
+ line_styles (Union[str, List[str]]): The linestyle
+ of lines. ``line_styles`` can have the same length with
+ texts or just single value. If ``line_styles`` is single
+ value, all the lines will have the same linestyle.
+ Reference to
+ https://matplotlib.org/stable/api/collections_api.html?highlight=collection#matplotlib.collections.AsteriskPolygonCollection.set_linestyle
+ for more details. Defaults to '-'.
+ line_widths (Union[Union[int, float], List[Union[int, float]]]):
+ The linewidth of lines. ``line_widths`` can have
+ the same length with lines or just single value.
+ If ``line_widths`` is single value, all the lines will
+ have the same linewidth. Defaults to 2.
+ face_colors (Union[str, tuple, List[str], List[tuple]]):
+ The face colors. Defaults to None.
+ alpha (Union[int, float]): The transparency of bboxes.
+ Defaults to 0.8.
+ """
+ if self.backend == 'matplotlib':
+ super().draw_bboxes(
+ bboxes=bboxes,
+ edge_colors=edge_colors,
+ line_widths=line_widths,
+ **kwargs)
+
+ elif self.backend == 'opencv':
+ self._image = mmcv.imshow_bboxes(
+ self._image,
+ bboxes,
+ edge_colors,
+ top_k=-1,
+ thickness=line_widths,
+ show=False)
+ else:
+ raise ValueError(f'got unsupported backend {self.backend}')
+
+ @master_only
+ def draw_lines(self,
+ x_datas: Union[np.ndarray, torch.Tensor],
+ y_datas: Union[np.ndarray, torch.Tensor],
+ colors: Union[str, tuple, List[str], List[tuple]] = 'g',
+ line_widths: Union[Union[int, float],
+ List[Union[int, float]]] = 2,
+ **kwargs) -> 'Visualizer':
+ """Draw single or multiple line segments.
+
+ Args:
+ x_datas (Union[np.ndarray, torch.Tensor]): The x coordinate of
+ each line' start and end points.
+ y_datas (Union[np.ndarray, torch.Tensor]): The y coordinate of
+ each line' start and end points.
+ colors (Union[str, tuple, List[str], List[tuple]]): The colors of
+ lines. ``colors`` can have the same length with lines or just
+ single value. If ``colors`` is single value, all the lines
+ will have the same colors. Reference to
+ https://matplotlib.org/stable/gallery/color/named_colors.html
+ for more details. Defaults to 'g'.
+ line_styles (Union[str, List[str]]): The linestyle
+ of lines. ``line_styles`` can have the same length with
+ texts or just single value. If ``line_styles`` is single
+ value, all the lines will have the same linestyle.
+ Reference to
+ https://matplotlib.org/stable/api/collections_api.html?highlight=collection#matplotlib.collections.AsteriskPolygonCollection.set_linestyle
+ for more details. Defaults to '-'.
+ line_widths (Union[Union[int, float], List[Union[int, float]]]):
+ The linewidth of lines. ``line_widths`` can have
+ the same length with lines or just single value.
+ If ``line_widths`` is single value, all the lines will
+ have the same linewidth. Defaults to 2.
+ """
+ if self.backend == 'matplotlib':
+ super().draw_lines(
+ x_datas=x_datas,
+ y_datas=y_datas,
+ colors=colors,
+ line_widths=line_widths,
+ **kwargs)
+
+ elif self.backend == 'opencv':
+
+ self._image = cv2.line(
+ self._image, (x_datas[0], y_datas[0]),
+ (x_datas[1], y_datas[1]),
+ colors,
+ thickness=line_widths)
+ else:
+ raise ValueError(f'got unsupported backend {self.backend}')
+
+ @master_only
+ def draw_polygons(self,
+ polygons: Union[Union[np.ndarray, torch.Tensor],
+ List[Union[np.ndarray, torch.Tensor]]],
+ edge_colors: Union[str, tuple, List[str],
+ List[tuple]] = 'g',
+ alpha: float = 1.0,
+ **kwargs) -> 'Visualizer':
+ """Draw single or multiple bboxes.
+
+ Args:
+ polygons (Union[Union[np.ndarray, torch.Tensor],\
+ List[Union[np.ndarray, torch.Tensor]]]): The polygons to draw
+ with the format of (x1,y1,x2,y2,...,xn,yn).
+ edge_colors (Union[str, tuple, List[str], List[tuple]]): The
+ colors of polygons. ``colors`` can have the same length with
+ lines or just single value. If ``colors`` is single value,
+ all the lines will have the same colors. Refer to
+ `matplotlib.colors` for full list of formats that are accepted.
+ Defaults to 'g.
+ line_styles (Union[str, List[str]]): The linestyle
+ of lines. ``line_styles`` can have the same length with
+ texts or just single value. If ``line_styles`` is single
+ value, all the lines will have the same linestyle.
+ Reference to
+ https://matplotlib.org/stable/api/collections_api.html?highlight=collection#matplotlib.collections.AsteriskPolygonCollection.set_linestyle
+ for more details. Defaults to '-'.
+ line_widths (Union[Union[int, float], List[Union[int, float]]]):
+ The linewidth of lines. ``line_widths`` can have
+ the same length with lines or just single value.
+ If ``line_widths`` is single value, all the lines will
+ have the same linewidth. Defaults to 2.
+ face_colors (Union[str, tuple, List[str], List[tuple]]):
+ The face colors. Defaults to None.
+ alpha (Union[int, float]): The transparency of polygons.
+ Defaults to 0.8.
+ """
+ if self.backend == 'matplotlib':
+ super().draw_polygons(
+ polygons=polygons,
+ edge_colors=edge_colors,
+ alpha=alpha,
+ **kwargs)
+
+ elif self.backend == 'opencv':
+ if alpha == 1.0:
+ self._image = cv2.fillConvexPoly(self._image, polygons,
+ edge_colors)
+ else:
+ img = cv2.fillConvexPoly(self._image.copy(), polygons,
+ edge_colors)
+ self._image = cv2.addWeighted(self._image, 1 - alpha, img,
+ alpha, 0)
+ else:
+ raise ValueError(f'got unsupported backend {self.backend}')
+
+ @master_only
+ def show(self,
+ drawn_img: Optional[np.ndarray] = None,
+ win_name: str = 'image',
+ wait_time: float = 0.,
+ continue_key=' ') -> None:
+ """Show the drawn image.
+
+ Args:
+ drawn_img (np.ndarray, optional): The image to show. If drawn_img
+ is None, it will show the image got by Visualizer. Defaults
+ to None.
+ win_name (str): The image title. Defaults to 'image'.
+ wait_time (float): Delay in seconds. 0 is the special
+ value that means "forever". Defaults to 0.
+ continue_key (str): The key for users to continue. Defaults to
+ the space key.
+ """
+ if self.backend == 'matplotlib':
+ super().show(
+ drawn_img=drawn_img,
+ win_name=win_name,
+ wait_time=wait_time,
+ continue_key=continue_key)
+
+ elif self.backend == 'opencv':
+ # Keep images are shown in the same window, and the title of window
+ # will be updated with `win_name`.
+ if not hasattr(self, win_name):
+ self._cv_win_name = win_name
+ cv2.namedWindow(winname=f'{id(self)}')
+ cv2.setWindowTitle(f'{id(self)}', win_name)
+ else:
+ cv2.setWindowTitle(f'{id(self)}', win_name)
+ shown_img = self.get_image() if drawn_img is None else drawn_img
+ cv2.imshow(str(id(self)), mmcv.bgr2rgb(shown_img))
+ cv2.waitKey(int(np.ceil(wait_time * 1000)))
+ else:
+ raise ValueError(f'got unsupported backend {self.backend}')
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/simcc_vis.py b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/simcc_vis.py
new file mode 100644
index 0000000000000000000000000000000000000000..ea89b0e11cca55ddab494c98bd3a40ae382eca6d
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/mmpose/visualization/simcc_vis.py
@@ -0,0 +1,141 @@
+# Copyright (c) Meta Platforms, Inc. and 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.
+
+from typing import Optional, Union
+
+import cv2 as cv
+import numpy as np
+import torch
+from torchvision.transforms import ToPILImage
+
+
+class SimCCVisualizer:
+
+ def draw_instance_xy_heatmap(self,
+ heatmap: torch.Tensor,
+ overlaid_image: Optional[np.ndarray],
+ n: int = 20,
+ mix: bool = True,
+ weight: float = 0.5):
+ """Draw heatmaps of GT or prediction.
+
+ Args:
+ heatmap (torch.Tensor): Tensor of heatmap.
+ overlaid_image (np.ndarray): The image to draw.
+ n (int): Number of keypoint, up to 20.
+ mix (bool):Whether to merge heatmap and original image.
+ weight (float): Weight of original image during fusion.
+
+ Returns:
+ np.ndarray: the drawn image which channel is RGB.
+ """
+ heatmap2d = heatmap.data.max(0, keepdim=True)[0]
+ xy_heatmap, K = self.split_simcc_xy(heatmap)
+ K = K if K <= n else n
+ blank_size = tuple(heatmap.size()[1:])
+ maps = {'x': [], 'y': []}
+ for i in xy_heatmap:
+ x, y = self.draw_1d_heatmaps(i['x']), self.draw_1d_heatmaps(i['y'])
+ maps['x'].append(x)
+ maps['y'].append(y)
+ white = self.creat_blank(blank_size, K)
+ map2d = self.draw_2d_heatmaps(heatmap2d)
+ if mix:
+ map2d = cv.addWeighted(overlaid_image, 1 - weight, map2d, weight,
+ 0)
+ self.image_cover(white, map2d, int(blank_size[1] * 0.1),
+ int(blank_size[0] * 0.1))
+ white = self.add_1d_heatmaps(maps, white, blank_size, K)
+ return white
+
+ def split_simcc_xy(self, heatmap: Union[np.ndarray, torch.Tensor]):
+ """Extract one-dimensional heatmap from two-dimensional heatmap and
+ calculate the number of keypoint."""
+ size = heatmap.size()
+ k = size[0] if size[0] <= 20 else 20
+ maps = []
+ for _ in range(k):
+ xy_dict = {}
+ single_heatmap = heatmap[_]
+ xy_dict['x'], xy_dict['y'] = self.merge_maps(single_heatmap)
+ maps.append(xy_dict)
+ return maps, k
+
+ def merge_maps(self, map_2d):
+ """Synthesis of one-dimensional heatmap."""
+ x = map_2d.data.max(0, keepdim=True)[0]
+ y = map_2d.data.max(1, keepdim=True)[0]
+ return x, y
+
+ def draw_1d_heatmaps(self, heatmap_1d):
+ """Draw one-dimensional heatmap."""
+ size = heatmap_1d.size()
+ length = max(size)
+ np_heatmap = ToPILImage()(heatmap_1d).convert('RGB')
+ cv_img = cv.cvtColor(np.asarray(np_heatmap), cv.COLOR_RGB2BGR)
+ if size[0] < size[1]:
+ cv_img = cv.resize(cv_img, (length, 15))
+ else:
+ cv_img = cv.resize(cv_img, (15, length))
+ single_map = cv.applyColorMap(cv_img, cv.COLORMAP_JET)
+ return single_map
+
+ def creat_blank(self,
+ size: Union[list, tuple],
+ K: int = 20,
+ interval: int = 10):
+ """Create the background."""
+ blank_height = int(
+ max(size[0] * 2, size[0] * 1.1 + (K + 1) * (15 + interval)))
+ blank_width = int(
+ max(size[1] * 2, size[1] * 1.1 + (K + 1) * (15 + interval)))
+ blank = np.zeros((blank_height, blank_width, 3), np.uint8)
+ blank.fill(255)
+ return blank
+
+ def draw_2d_heatmaps(self, heatmap_2d):
+ """Draw a two-dimensional heatmap fused with the original image."""
+ np_heatmap = ToPILImage()(heatmap_2d).convert('RGB')
+ cv_img = cv.cvtColor(np.asarray(np_heatmap), cv.COLOR_RGB2BGR)
+ map_2d = cv.applyColorMap(cv_img, cv.COLORMAP_JET)
+ return map_2d
+
+ def image_cover(self, background: np.ndarray, foreground: np.ndarray,
+ x: int, y: int):
+ """Paste the foreground on the background."""
+ fore_size = foreground.shape
+ background[y:y + fore_size[0], x:x + fore_size[1]] = foreground
+ return background
+
+ def add_1d_heatmaps(self,
+ maps: dict,
+ background: np.ndarray,
+ map2d_size: Union[tuple, list],
+ K: int,
+ interval: int = 10):
+ """Paste one-dimensional heatmaps onto the background in turn."""
+ y_startpoint, x_startpoint = [int(1.1*map2d_size[1]),
+ int(0.1*map2d_size[0])],\
+ [int(0.1*map2d_size[1]),
+ int(1.1*map2d_size[0])]
+ x_startpoint[1] += interval * 2
+ y_startpoint[0] += interval * 2
+ add = interval + 10
+ for i in range(K):
+ self.image_cover(background, maps['x'][i], x_startpoint[0],
+ x_startpoint[1])
+ cv.putText(background, str(i),
+ (x_startpoint[0] - 30, x_startpoint[1] + 10),
+ cv.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)
+ self.image_cover(background, maps['y'][i], y_startpoint[0],
+ y_startpoint[1])
+ cv.putText(background, str(i),
+ (y_startpoint[0], y_startpoint[1] - 5),
+ cv.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)
+ x_startpoint[1] += add
+ y_startpoint[0] += add
+ return background[:x_startpoint[1] + y_startpoint[1] +
+ 1, :y_startpoint[0] + x_startpoint[0] + 1]
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/models/HeatmapHead.py b/ SDPose-Wholebody/SDPose-OOD-main/models/HeatmapHead.py
new file mode 100644
index 0000000000000000000000000000000000000000..b5268b74248c5117106c1a7e6684e3825b62a1b5
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/models/HeatmapHead.py
@@ -0,0 +1,64 @@
+# Author: T. S. Liang @ Rama Alpaca
+# Emails: tsliang2001@gmail.com | shuangliang@ramaalpaca.com | sliang57@connect.hku.hk
+# Date: Jun. 2025
+# Description: SDPose heatmap head factory using mmpose `HeatmapHead` + `UDPHeatmap` codec.
+# - mode="body" → 17 keypoints, in_channels=320
+# - mode="wholebody"→ 133 keypoints, in_channels=640
+# Defaults: image_size=(768,1024), scale=4 (→ heatmap size = (w/4, h/4)), sigma=6.
+# License: MIT License (see LICENSE for details)
+
+from mmpose.registry import MODELS
+
+def get_heatmap_head(mode = "body"):
+
+ if mode == "body":
+
+ image_size = [768, 1024] ## width x height
+ sigma = 6 ## sigma is 2 for 256
+ scale = 4
+
+ embed_dim = 320
+ num_keypoints = 17
+
+ codec = dict(
+ type='UDPHeatmap', input_size=(image_size[0], image_size[1]), heatmap_size=(int(image_size[0]/scale), int(image_size[1]/scale)), sigma=sigma) ## sigma is 2 for 256
+
+ head_cfg = dict(
+ type='HeatmapHead',
+ in_channels=embed_dim,
+ out_channels=num_keypoints,
+ deconv_out_channels=(320,),
+ deconv_kernel_sizes=(4,),
+ conv_out_channels=(320,),
+ conv_kernel_sizes=(1,),
+ loss=dict(type='KeypointMSELoss', use_target_weight=True),
+ decoder=codec
+ )
+
+ elif mode == "wholebody":
+
+ image_size = [768, 1024] ## width x height
+ sigma = 6 ## sigma is 2 for 256
+ scale = 4
+
+ embed_dim = 640
+ num_keypoints = 133
+
+ codec = dict(
+ type='UDPHeatmap', input_size=(image_size[0], image_size[1]), heatmap_size=(int(image_size[0]/scale), int(image_size[1]/scale)), sigma=sigma) ## sigma is 2 for 256
+
+ head_cfg = dict(
+ type='HeatmapHead',
+ in_channels=embed_dim,
+ out_channels=num_keypoints,
+ deconv_out_channels=(640,),
+ deconv_kernel_sizes=(4,),
+ conv_out_channels=(640,),
+ conv_kernel_sizes=(1,),
+ loss=dict(type='KeypointMSELoss', use_target_weight=True),
+ decoder=codec
+ )
+
+ head = MODELS.build(head_cfg)
+
+ return head
\ No newline at end of file
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/models/ModifiedUNet.py b/ SDPose-Wholebody/SDPose-OOD-main/models/ModifiedUNet.py
new file mode 100644
index 0000000000000000000000000000000000000000..f785a63080470511caa464389d317c7d6468037a
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/models/ModifiedUNet.py
@@ -0,0 +1,69 @@
+# Author: T. S. Liang @ Rama Alpaca
+# Emails: tsliang2001@gmail.com | shuangliang@ramaalpaca.com
+# Date: Feb. 2025
+
+"""
+
+Description:
+
+ SDPose UNet Forward Modifier
+
+ Temporarily overrides `UNet.forward` to expose decoder features via forward hooks.
+ - keypoint_scheme: "body" (COCO-17) or "wholebody" (COCO-WholeBody-133)
+ - return_decoder_feats: if True, returns a selected decoder feature (Tensor);
+ otherwise returns the original UNet output.
+"""
+
+def new_forward_kpt17(self, *args, return_decoder_feats=False, **kwargs):
+ self._decoder_feats = []
+
+ def hook_fn(module, input, output):
+ self._decoder_feats.append(output)
+
+ handles = [blk.register_forward_hook(hook_fn) for blk in self.up_blocks]
+
+ out = self._old_forward(*args, **kwargs)
+
+ for h in handles:
+ h.remove()
+
+ if return_decoder_feats:
+
+ feats = self._decoder_feats[::-1]
+ return feats[0]
+ else:
+ return out
+
+def new_forward_kpt133(self, *args, return_decoder_feats=False, **kwargs):
+ self._decoder_feats = []
+
+ def hook_fn(module, input, output):
+ self._decoder_feats.append(output)
+
+ handles = [blk.register_forward_hook(hook_fn) for blk in self.up_blocks]
+
+ out = self._old_forward(*args, **kwargs)
+
+ for h in handles:
+ h.remove()
+
+ if return_decoder_feats:
+
+ feats = self._decoder_feats[::-1]
+ return feats[1]
+ else:
+ return out
+
+def Modified_forward(unet, keypoint_scheme = "body"):
+
+ if keypoint_scheme == "body":
+
+ unet._old_forward = unet.forward
+ unet.forward = new_forward_kpt17.__get__(unet, unet.__class__)
+
+ elif keypoint_scheme == "wholebody":
+
+ unet._old_forward = unet.forward
+ unet.forward = new_forward_kpt133.__get__(unet, unet.__class__)
+
+ return unet
\ No newline at end of file
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/models/__pycache__/HeatmapHead.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/models/__pycache__/HeatmapHead.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a1f264e9557b5ee717646f8977dc9d876f4ae81d
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/models/__pycache__/HeatmapHead.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/models/__pycache__/ModifiedUNet.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/models/__pycache__/ModifiedUNet.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..dca41cbe867015ab49607d2f9f1f868017c0a086
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/models/__pycache__/ModifiedUNet.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/pipelines/SDPose_D_Pipeline.py b/ SDPose-Wholebody/SDPose-OOD-main/pipelines/SDPose_D_Pipeline.py
new file mode 100644
index 0000000000000000000000000000000000000000..f1d05bc474daa78f7944c8b01935572a0caa39df
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/pipelines/SDPose_D_Pipeline.py
@@ -0,0 +1,404 @@
+# Author T. S. Liang @ Rama Alpaca, July. 2024.
+# Email: tsliang2001@gmail.com & shuangliang@ramaalpaca.com
+# Adapted from Marigold: https://github.com/prs-eth/marigold and MMPose: https://github.com/open-mmlab/mmpose
+# License: MIT License (see LICENSE for details)
+
+"""
+ Description:
+
+ This script is the pipeline utilizing Stable Diffusion Model for the pose perception.
+ Adaptations have been made to ensure full compatibility with MMPose-style
+ decoder heads, enabling seamless integration with existing heatmap-based
+ keypoint decoders and evaluation protocols.
+"""
+
+from typing import Union, Optional
+
+import torch
+import torch.nn as nn
+
+from diffusers import (
+ AutoencoderKL,
+ DiffusionPipeline,
+ UNet2DConditionModel,
+ DDIMScheduler,
+ DDPMScheduler,
+)
+
+from PIL import Image
+
+from tqdm.auto import tqdm
+from transformers import CLIPTextModel, CLIPTokenizer
+
+from itertools import zip_longest
+from mmpose.utils.typing import (ConfigType, InstanceList, OptConfigType,
+ OptMultiConfig, PixelDataList, SampleList)
+
+from mmpose.models.heads.heatmap_heads.heatmap_head import HeatmapHead
+
+class SDPose_D_Pipeline(DiffusionPipeline):
+
+ """
+ A diffusion-based human pose estimation pipeline that reconstructs pose heatmaps
+ from RGB images using a Stable-Diffusion-style latent denoising process.
+
+ NOTE:
+ This pipeline assumes the scheduler/unet are configured for x0 prediction,
+ i.e., `scheduler.config.prediction_type == "sample"`. In this setting the UNet
+ directly predicts the clean latent x0 at a fixed diffusion step.
+
+ Args:
+ unet (`UNet2DConditionModel`):
+ Conditional UNet used to predict the clean latent `x0`.
+ Inputs: noisy pose/image latents and conditioning (image latent, text embeds).
+ vae (`AutoencoderKL`):
+ Variational Autoencoder for encoding RGB images to latents and for decoding
+ latents (image/heatmap) back to pixel space as needed.
+ text_encoder (`CLIPTextModel`):
+ Text encoder to obtain conditioning embeddings. For text-free pose tasks,
+ empty prompts are typically used.
+ tokenizer (`CLIPTokenizer`):
+ Tokenizer paired with the text encoder (tokenizes empty/neutral prompts).
+ decoder (`HeatmapHead`):
+ A lightweight head mapping denoised latent features to pose heatmaps,
+ typically with shape `[B, num_keypoints, H, W]`.
+ scheduler (`Union[DDIMScheduler, DDPMScheduler]`):
+ Diffusion scheduler defining the diffusion process configuration
+ (only used to set the fixed timestep).
+ Its `prediction_type` **must be `'sample'`** to ensure x₀ prediction.
+
+ Returns:
+ `SDPose_D_Pipeline`:
+ Initialized pipeline ready for inference/training.
+ """
+
+ def __init__(
+ self,
+ unet: UNet2DConditionModel,
+ vae: AutoencoderKL,
+ text_encoder: CLIPTextModel,
+ tokenizer: CLIPTokenizer,
+ decoder: HeatmapHead,
+ scheduler: Union[DDIMScheduler, DDPMScheduler]
+ ):
+
+ super().__init__()
+
+ self.register_modules(
+ unet = unet,
+ vae = vae,
+ text_encoder=text_encoder,
+ tokenizer=tokenizer,
+ decoder = decoder,
+ scheduler = scheduler
+ )
+
+ self.rgb_latent_scale_factor = 0.18215
+
+ self.test_cfg = {
+ 'output_keypoint_indices': None,
+ 'flip_test': True,
+ 'flip_mode': 'heatmap',
+ 'shift_heatmap': False
+ }
+
+ @torch.no_grad()
+ def __call__(
+ self,
+ rgb_in: Union[Image.Image, torch.Tensor],
+ show_progress_bar: bool = True,
+ timesteps = None,
+ mode = None,
+ data_samples = None,
+ test_cfg = None
+ ):
+
+ """
+ Run a forward inference through the SDPose-D pipeline.
+
+ This function performs **x₀ prediction** using a Stable-Diffusion-style UNet
+ conditioned on the RGB image latent, and optionally returns decoded pose heatmaps
+ or full structured pose predictions (MMPose-compatible).
+
+ Args:
+ rgb_in (`PIL.Image.Image` or `torch.Tensor`):
+ Input RGB image or batch tensor of shape `[B, 3, H, W]`.
+ If a PIL image is provided, it should be preprocessed to a normalized tensor
+ compatible with the VAE encoder input range.
+ show_progress_bar (`bool`, optional, defaults to `True`):
+ Whether to display a progress bar during diffusion inference.
+ timesteps (`int` or `list[int]`, optional):
+ Diffusion timestep(s) to use.
+ mode (`str`, optional):
+ - `"predict"`: Use the decoder's `predict()` method to generate keypoint
+ predictions and attach them to `data_samples` (for evaluation).
+ - `None`: Decode the denoised latent directly to a heatmap tensor `[B, K, H, W]`
+ without MMPose post-processing.
+ data_samples (`SampleList`, optional):
+ A list of MMPose `PoseDataSample` objects required when `mode="predict"`.
+ test_cfg (`dict`, optional):
+ Configuration overrides for test-time behavior.
+ Examples: `{'flip_test': True, 'shift_heatmap': False}`.
+
+ Returns:
+ - If `mode == "predict"`:
+ `SampleList`:
+ The input `data_samples` with updated `pred_instances` and optional `pred_fields`
+ containing the decoded keypoints and heatmaps.
+ - Else:
+ `torch.Tensor`:
+ The predicted pose heatmap tensor of shape `[B, num_keypoints, H, W]`.
+
+ Notes:
+ - This pipeline operates in **x₀ prediction mode**, where the UNet directly predicts
+ the clean latent representation instead of ε or v.
+ - The pose diffusion process uses a **single, fixed timestep** (default t=999),
+ meaning there is no iterative denoising loop.
+ - `test_cfg` supports `flip_test` inference (horizontal ensemble of original and flipped images).
+ - `scheduler.config.prediction_type` must be set to `"sample"` for correct operation.
+ """
+
+ # ------------- Predicting pose ---------------
+
+ # Predict pose images
+
+ self.encode_empty_text()
+
+ # Update test_cfg if provided
+ if test_cfg is not None:
+ self.test_cfg.update(test_cfg)
+
+ heatmap_pred = self.single_infer(
+ rgb_in = rgb_in,
+ show_pbar = show_progress_bar,
+ timesteps = timesteps,
+ mode = mode,
+ data_samples = data_samples
+ )
+
+ return heatmap_pred
+
+ @torch.no_grad()
+ def single_infer(
+ self,
+ rgb_in: torch.Tensor,
+ timesteps,
+ show_pbar: bool,
+ mode = None,
+ data_samples = None
+ )-> torch.Tensor:
+
+ device = self.unet.device
+ rgb_in = rgb_in.to(device)
+ bsz = rgb_in.shape[0]
+
+ self.scheduler.set_timesteps(timesteps = timesteps, device=device)
+
+ timesteps = torch.tensor(timesteps, device=device).long()
+
+ # STEP 1: Encode image
+ if self.test_cfg.get('flip_test', False):
+ # Flip test: process both original and flipped images
+ rgb_in_flipped = torch.flip(rgb_in, dims=[3]) # Flip horizontally (W dimension)
+
+ # Encode both original and flipped images
+ rgb_latent = self.encode_rgb(rgb_in)
+ rgb_latent_flipped = self.encode_rgb(rgb_in_flipped)
+
+ # Process both latents
+ feats = []
+ for rgb_latent_curr in [rgb_latent, rgb_latent_flipped]:
+ # Denoising loop for current latent
+ if show_pbar:
+ iterable = tqdm(
+ enumerate(timesteps),
+ total=len(timesteps),
+ leave=False,
+ desc=" " * 4 + "Diffusion denoising",
+ )
+ else:
+ iterable = enumerate(timesteps)
+
+ self.encode_empty_text()
+ text_embed = self.empty_text_embed.repeat((bsz, 1, 1))
+
+ for i, t in iterable:
+ task_emb_anno = torch.tensor([1, 0]).float().unsqueeze(0).to(device)
+ task_emb_anno = torch.cat([torch.sin(task_emb_anno), torch.cos(task_emb_anno)], dim=-1).repeat(bsz, 1)
+
+ if self.scheduler.config.prediction_type == "sample":
+ feat = self.unet(
+ rgb_latent_curr, t, text_embed, class_labels=task_emb_anno, return_dict=False, return_decoder_feats=True
+ )
+ else:
+ raise
+
+ feats.append((feat,)) # Wrap each feat in a tuple to match expected format
+
+ else:
+ # Original single image processing
+ rgb_latent = self.encode_rgb(rgb_in)
+
+ # Denoising loop
+ if show_pbar:
+ iterable = tqdm(
+ enumerate(timesteps),
+ total=len(timesteps),
+ leave=False,
+ desc=" " * 4 + "Diffusion denoising",
+ )
+ else:
+ iterable = enumerate(timesteps)
+
+ self.encode_empty_text()
+ text_embed = self.empty_text_embed.repeat((bsz, 1, 1))
+
+ for i, t in iterable:
+ task_emb_anno = torch.tensor([1, 0]).float().unsqueeze(0).to(device)
+ task_emb_anno = torch.cat([torch.sin(task_emb_anno), torch.cos(task_emb_anno)], dim=-1).repeat(bsz, 1)
+
+ if self.scheduler.config.prediction_type == "sample":
+ feat = self.unet(
+ rgb_latent, t, text_embed, class_labels=task_emb_anno, return_dict=False, return_decoder_feats=True
+ )
+ else:
+ raise
+
+ feats = (feat,) # Wrap single tensor in tuple to match expected format for prediction mode
+ feat_for_training = feat # Keep original for training mode
+
+ if mode == "predict":
+
+ if isinstance(self.decoder, (nn.parallel.DistributedDataParallel, )):
+
+ preds = self.decoder.module.predict(feats, data_samples, test_cfg=self.test_cfg)
+
+ else:
+
+ preds = self.decoder.predict(feats, data_samples, test_cfg=self.test_cfg)
+
+ if isinstance(preds, tuple):
+ batch_pred_instances, batch_pred_fields = preds
+ else:
+ batch_pred_instances = preds
+ batch_pred_fields = None
+
+ return self.add_pred_to_datasample(batch_pred_instances=batch_pred_instances, batch_data_samples=data_samples, batch_pred_fields=batch_pred_fields)
+
+ elif mode == "inference":
+
+ preds = self.decoder.predict(feats, data_samples, test_cfg=self.test_cfg)
+
+ return preds
+
+ else:
+ if self.test_cfg.get('flip_test', False):
+
+ if isinstance(feats, list):
+ # feats is [(feat_orig,), (feat_flipped,)], extract the first one for training
+ heatmap_pred = self.decoder(feats[0][0]) # Use feat_orig for training
+ else:
+ # feats is a single tuple (feat,), extract the tensor
+ heatmap_pred = self.decoder(feats[0])
+ else:
+ # In training mode, decoder expects raw features, not wrapped in tuples
+ heatmap_pred = self.decoder(feat_for_training) # Use the original feat tensor
+
+ return heatmap_pred
+
+ def encode_empty_text(self):
+
+ """
+ Encode text embedding for empty prompt
+ """
+
+ prompt = ""
+ text_inputs = self.tokenizer(
+ prompt,
+ padding="do_not_pad",
+ max_length=self.tokenizer.model_max_length,
+ truncation=True,
+ return_tensors="pt",
+ )
+ text_input_ids = text_inputs.input_ids.to(self.text_encoder.device)
+ self.empty_text_embed = self.text_encoder(text_input_ids)[0]
+
+ def encode_rgb(self, rgb_in: torch.Tensor) -> torch.Tensor:
+ """
+ encode RGB image into latent.
+
+ Args:
+
+ rgb_in (`torch.Tensor`):
+ Input RGB image to be encoded.
+
+ Returns:
+ `torch.Tensor`: Image latent.
+ """
+
+ rgb_latent = self.vae.encode(rgb_in).latent_dist.sample()
+ rgb_latent = rgb_latent * self.rgb_latent_scale_factor
+
+ return rgb_latent
+
+ def add_pred_to_datasample(self, batch_pred_instances: InstanceList,
+ batch_pred_fields: Optional[PixelDataList],
+ batch_data_samples: SampleList) -> SampleList:
+
+ # from https://github.com/open-mmlab/mmpose/blob/759b39c13fea6ba094afc1fa932f51dc1b11cbf9/mmpose/models/pose_estimators/topdown.py#L122
+
+ """Add predictions into data samples.
+
+ Args:
+ batch_pred_instances (List[InstanceData]): The predicted instances
+ of the input data batch
+ batch_pred_fields (List[PixelData], optional): The predicted
+ fields (e.g. heatmaps) of the input batch
+ batch_data_samples (List[PoseDataSample]): The input data batch
+
+ Returns:
+ List[PoseDataSample]: A list of data samples where the predictions
+ are stored in the ``pred_instances`` field of each data sample.
+ """
+ assert len(batch_pred_instances) == len(batch_data_samples)
+ if batch_pred_fields is None:
+ batch_pred_fields = []
+ output_keypoint_indices = self.test_cfg.get('output_keypoint_indices',
+ None)
+
+ for pred_instances, pred_fields, data_sample in zip_longest(
+ batch_pred_instances, batch_pred_fields, batch_data_samples):
+
+ gt_instances = data_sample.gt_instances
+
+ bbox_centers = gt_instances.bbox_centers
+ bbox_scales = gt_instances.bbox_scales
+ input_size = data_sample.metainfo['input_size']
+
+ pred_instances.keypoints = pred_instances.keypoints / input_size \
+ * bbox_scales + bbox_centers - 0.5 * bbox_scales
+
+ if output_keypoint_indices is not None:
+
+ num_keypoints = pred_instances.keypoints.shape[1]
+ for key, value in pred_instances.all_items():
+ if key.startswith('keypoint'):
+ pred_instances.set_field(
+ value[:, output_keypoint_indices], key)
+
+ pred_instances.bboxes = gt_instances.bboxes
+ pred_instances.bbox_scores = gt_instances.bbox_scores
+
+ data_sample.pred_instances = pred_instances
+
+ if pred_fields is not None:
+ if output_keypoint_indices is not None:
+
+ for key, value in pred_fields.all_items():
+ if value.shape[0] != num_keypoints:
+ continue
+ pred_fields.set_field(value[output_keypoint_indices],
+ key)
+ data_sample.pred_fields = pred_fields
+
+ return batch_data_samples
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/pipelines/__pycache__/SDPose_D_Pipeline.cpython-312.pyc b/ SDPose-Wholebody/SDPose-OOD-main/pipelines/__pycache__/SDPose_D_Pipeline.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2beebb9bbfb884b9ff448dbd8ee16d5c74aec4c1
Binary files /dev/null and b/ SDPose-Wholebody/SDPose-OOD-main/pipelines/__pycache__/SDPose_D_Pipeline.cpython-312.pyc differ
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/requirements.txt b/ SDPose-Wholebody/SDPose-OOD-main/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b63ec372a64ad93c6570c4c8102b551a25c211bd
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/requirements.txt
@@ -0,0 +1,94 @@
+absl-py==2.3.1
+accelerate==1.10.1
+addict==2.4.0
+albucore==0.0.10
+albumentations==1.3.0
+annotated-types==0.7.0
+certifi==2025.10.5
+charset-normalizer==3.4.3
+contourpy==1.3.2
+cycler==0.12.1
+Cython==3.1.4
+diffusers==0.35.1
+filelock==3.20.0
+fonttools==4.60.1
+fsspec==2025.9.0
+grpcio==1.75.1
+hf-xet==1.1.10
+huggingface-hub==0.35.3
+idna==3.10
+importlib_metadata==8.7.0
+Jinja2==3.1.6
+kiwisolver==1.4.9
+Markdown==3.9
+markdown-it-py==4.0.0
+MarkupSafe==3.0.3
+matplotlib==3.10.7
+mdurl==0.1.2
+mmcv==2.2.0
+mmengine==0.10.7
+mpmath==1.3.0
+munkres==1.1.4
+networkx==3.4.2
+numpy==1.24.4
+nvidia-cublas-cu12==12.8.4.1
+nvidia-cuda-cupti-cu12==12.8.90
+nvidia-cuda-nvrtc-cu12==12.8.93
+nvidia-cuda-runtime-cu12==12.8.90
+nvidia-cudnn-cu12==9.10.2.21
+nvidia-cufft-cu12==11.3.3.83
+nvidia-cufile-cu12==1.13.1.3
+nvidia-curand-cu12==10.3.9.90
+nvidia-cusolver-cu12==11.7.3.90
+nvidia-cusparse-cu12==12.5.8.93
+nvidia-cusparselt-cu12==0.7.1
+nvidia-nccl-cu12==2.27.3
+nvidia-nvjitlink-cu12==12.8.93
+nvidia-nvtx-cu12==12.8.90
+opencv-python==4.9.0.80
+opencv-python-headless==4.9.0.80
+packaging==25.0
+pandas==2.3.3
+peft==0.17.1
+pillow==11.3.0
+platformdirs==4.5.0
+protobuf==6.32.1
+psutil==7.1.0
+pydantic==2.12.0
+pydantic_core==2.41.1
+Pygments==2.19.2
+pyparsing==3.2.5
+python-dateutil==2.9.0.post0
+pytz==2025.2
+PyYAML==6.0.3
+regex==2025.9.18
+requests==2.32.5
+rich==14.2.0
+safetensors==0.6.2
+scipy==1.15.3
+seaborn==0.13.2
+simsimd==6.5.3
+six==1.17.0
+stringzilla==4.2.0
+sympy==1.14.0
+tensorboard==2.20.0
+tensorboard-data-server==0.7.2
+termcolor==3.1.0
+tokenizers==0.22.1
+tomli==2.3.0
+torch==2.8.0
+torchvision==0.23.0
+tqdm==4.67.1
+transformers==4.57.0
+triton==3.4.0
+typing-inspection==0.4.2
+typing_extensions==4.15.0
+tzdata==2025.2
+urllib3==2.5.0
+Werkzeug==3.1.3
+xformers==0.0.32.post2
+yapf==0.43.0
+zipp==3.23.0
+xtcocotools>=1.13
+ultralytics==8.3.211
+ultralytics-thop==2.0.17
\ No newline at end of file
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/scripts/eval.sh b/ SDPose-Wholebody/SDPose-OOD-main/scripts/eval.sh
new file mode 100644
index 0000000000000000000000000000000000000000..d73d2dd01e83cf34444e1885887f29d0137878db
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/scripts/eval.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+# ============================================
+# Author: T. S. Liang @ Rama Alpaca
+# Emails: tsliang2001@gmail.com | shuangliang@ramaalpaca.com | sliang57@connect.hku.hk
+# Date: Aug. 2025
+# Description: Launch script for evaluating SDPose on pose estimation benchmarks.
+# License: MIT License (see LICENSE for details)
+# ============================================
+
+LAUNCH_EVAL() {
+
+ cd ..
+
+ # ------------------ Configurable Parameters ------------------
+ dataset_name='COCO'
+ keypoint_scheme='body' # or 'wholebody'
+ dataset_root='/data/coding/datasets'
+ ann_file='/data/coding/datasets/HumanArt/annotations/validation_humanart.json'
+ checkpoint_path='/data/coding/outputs/COCO_813'
+ eval_batch_size=16
+ dataloader_num_workers=16
+ timestep=999
+
+ # ------------------ Runtime Environment ------------------
+ CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 accelerate launch --mixed_precision="bf16"\
+ --multi_gpu \
+ eval/launch_evaluator.py \
+ --dataset_name $dataset_name \
+ --keypoint_scheme $keypoint_scheme \
+ --dataset_root $dataset_root \
+ --checkpoint_path $checkpoint_path \
+ --ann_file $ann_file \
+ --eval_batch_size $eval_batch_size \
+ --dataloader_num_workers $dataloader_num_workers \
+ --enable_xformers_memory_efficient_attention \
+ --timestep $timestep
+}
+
+# ------------- Entry -------------
+LAUNCH_EVAL
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/utils/EvalMetric.py b/ SDPose-Wholebody/SDPose-OOD-main/utils/EvalMetric.py
new file mode 100644
index 0000000000000000000000000000000000000000..fb780fcee228978cf1eb5fbae8d1b0af3593082f
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/utils/EvalMetric.py
@@ -0,0 +1,24 @@
+# Author: T. S. Liang @ Rama Alpaca
+# Emails: tsliang2001@gmail.com | shuangliang@ramaalpaca.com
+# Date: Feb. 2025
+# Description: Build COCO-style keypoint metrics for SDPose evaluation.
+# License: MIT License (see LICENSE for details)
+
+
+from mmpose.evaluation.metrics import CocoMetric, CocoWholeBodyMetric
+
+def get_metric(ann_file, mode = "body"):
+
+ if mode == "body":
+
+ metric = CocoMetric(iou_type='keypoints', ann_file = ann_file)
+
+ elif mode == "wholebody":
+
+ metric = CocoWholeBodyMetric(iou_type='keypoints', ann_file = ann_file)
+
+ else:
+
+ print("Error, please specify the correct type of keypoint scheme.")
+
+ return metric
\ No newline at end of file
diff --git a/ SDPose-Wholebody/SDPose-OOD-main/utils/dataset_loader.py b/ SDPose-Wholebody/SDPose-OOD-main/utils/dataset_loader.py
new file mode 100644
index 0000000000000000000000000000000000000000..f60b3aa33d44849295cb2bcd27dbfd46856a4ae6
--- /dev/null
+++ b/ SDPose-Wholebody/SDPose-OOD-main/utils/dataset_loader.py
@@ -0,0 +1,179 @@
+# Author: T. S. Liang @ Rama Alpaca
+# Emails: tsliang2001@gmail.com | shuangliang@ramaalpaca.com
+# Date: Feb. 2025
+# Description: The dataloader for the training and evaluation protocol.
+# License: MIT License (see LICENSE for details)
+
+from torch.utils.data import DataLoader
+from mmengine.dataset import default_collate
+from mmengine.registry import init_default_scope
+from mmpose.registry import DATASETS
+
+init_default_scope('mmpose')
+
+def prepare_dataset(batch_size, dataset_name, dataset_root, mode = "val", num_workers = 4):
+
+ image_size = [768, 1024] ## width x height
+ sigma = 6 ## sigma is 2 for 256
+ scale = 4
+
+ codec = dict(
+ type='UDPHeatmap', input_size=(image_size[0], image_size[1]), heatmap_size=(int(image_size[0]/scale), int(image_size[1]/scale)), sigma=sigma)
+
+ train_pipeline = [
+ dict(type='LoadImage'),
+ dict(type='GetBBoxCenterScale'),
+ dict(type='RandomFlip', direction='horizontal'),
+ dict(type='RandomHalfBody'),
+ dict(type='RandomBBoxTransform'),
+ dict(type='TopdownAffine', input_size=codec['input_size'], use_udp=True),
+ dict(type='PhotometricDistortion'),
+ dict(type='CacheRGBTarget'),
+ dict(
+ type='Albumentation',
+ transforms=[
+ dict(type='Blur', p=0.1),
+ dict(type='MedianBlur', p=0.1),
+ dict(
+ type='CoarseDropout',
+ max_holes=1,
+ max_height=0.4,
+ max_width=0.4,
+ min_holes=1,
+ min_height=0.2,
+ min_width=0.2,
+ p=1.0),
+ ]),
+ dict(type='GenerateTarget', encoder=codec),
+ dict(type='PackPoseInputs'),
+ ]
+
+ val_pipeline = [
+ dict(type='LoadImage'),
+ dict(type='GetBBoxCenterScale'),
+ dict(type='TopdownAffine', input_size=codec['input_size'], use_udp=True),
+ dict(type='CacheRGBTarget'),
+ dict(type='PackPoseInputs'),
+ ]
+
+ train_cfg = dict(
+ type='CocoDataset',
+ data_root=dataset_root,
+ data_mode='topdown',
+ ann_file='COCO/annotations/person_keypoints_train2017.json',
+ data_prefix=dict(img='COCO/train2017/'),
+ pipeline=train_pipeline,
+ )
+
+ if dataset_name == "COCO_OOD":
+
+ print("Running Validation on COCO_OOD.")
+
+ val_cfg = dict(
+ type='CocoDataset',
+ data_root=dataset_root,
+ data_mode='topdown',
+ ann_file='COCO/annotations/person_keypoints_val2017.json',
+ data_prefix=dict(img='COCO/val2017oil/'),
+ test_mode=True,
+ pipeline=val_pipeline,
+ bbox_file='COCO/person_detection_results/COCO_val2017_detections_AP_H_70_person.json',
+ )
+
+ elif dataset_name == "Humanart":
+
+ print("Running Validation on Humanart.")
+
+ val_cfg = dict(
+ type='HumanArtDataset',
+ data_root=dataset_root,
+ data_mode='topdown',
+ ann_file='HumanArt/annotations/validation_humanart.json',
+ test_mode=True,
+ pipeline=val_pipeline,
+ )
+
+ elif dataset_name == "COCO":
+
+ print("Running Validation on COCO.")
+
+ val_cfg = dict(
+ type='CocoDataset',
+ data_root=dataset_root,
+ data_mode='topdown',
+ ann_file='COCO/annotations/person_keypoints_val2017.json',
+ data_prefix=dict(img='COCO/val2017/'),
+ test_mode=True,
+ pipeline=val_pipeline,
+ bbox_file='COCO/person_detection_results/COCO_val2017_detections_AP_H_70_person.json',
+ )
+
+ elif dataset_name == "COCOWholebody":
+
+ print("Running Validation on COCO Wholebody.")
+
+ val_cfg = dict(
+ type='CocoWholeBodyDataset',
+ data_root=dataset_root,
+ data_mode='topdown',
+ ann_file='COCO/annotations/coco_wholebody_val_v1.0.json',
+ data_prefix=dict(img='COCO/val2017/'),
+ test_mode=True,
+ pipeline=val_pipeline,
+ bbox_file='COCO/person_detection_results/COCO_val2017_detections_AP_H_70_person.json',
+ )
+
+ elif dataset_name == "COCO-OOD_Wholebody":
+
+ print("Running Validation on COCO-OOD Wholebody.")
+
+ val_cfg = dict(
+ type='CocoWholeBodyDataset',
+ data_root=dataset_root,
+ data_mode='topdown',
+ ann_file='COCO/annotations/coco_wholebody_val_v1.0.json',
+ data_prefix=dict(img='COCO/val2017oil/'),
+ test_mode=True,
+ pipeline=val_pipeline,
+ bbox_file='COCO/person_detection_results/COCO_val2017_detections_AP_H_70_person.json',
+ )
+
+ if mode == "train":
+
+ train_ds = DATASETS.build(train_cfg)
+ val_ds = DATASETS.build(val_cfg)
+
+ train_loader = DataLoader(
+ train_ds,
+ batch_size=batch_size,
+ shuffle=True,
+ num_workers=num_workers,
+ collate_fn=default_collate,
+ pin_memory=True,
+ )
+
+ val_loader = DataLoader(
+ val_ds,
+ batch_size=batch_size,
+ shuffle=False,
+ num_workers=num_workers,
+ collate_fn=default_collate,
+ pin_memory=True,
+ )
+
+ return train_loader, val_loader
+
+ elif mode == "val":
+
+ val_ds = DATASETS.build(val_cfg)
+
+ val_loader = DataLoader(
+ val_ds,
+ batch_size=batch_size,
+ shuffle=False,
+ num_workers=num_workers,
+ collate_fn=default_collate,
+ pin_memory=True,
+ )
+
+ return val_loader
diff --git a/ SDPose-Wholebody/assets/wholebody_anno.png b/ SDPose-Wholebody/assets/wholebody_anno.png
new file mode 100644
index 0000000000000000000000000000000000000000..893ccdf2b29308f2f50a189e11e5361f93e356bd
--- /dev/null
+++ b/ SDPose-Wholebody/assets/wholebody_anno.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5ab1654bde9ccd55d2eb32e5728e6c909a8fc7041f548eb76e1594f3b455d891
+size 7070260
diff --git a/ SDPose-Wholebody/decoder/decoder.safetensors b/ SDPose-Wholebody/decoder/decoder.safetensors
new file mode 100644
index 0000000000000000000000000000000000000000..e2aeb472a11ea732b7e03e3f5cfbd17e8d430d6a
--- /dev/null
+++ b/ SDPose-Wholebody/decoder/decoder.safetensors
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3ee297f62ade11c405ad56ae490aa1bef7be881df794f145ceb8e12e38a853fc
+size 28196828
diff --git a/ SDPose-Wholebody/gitattributes b/ SDPose-Wholebody/gitattributes
new file mode 100644
index 0000000000000000000000000000000000000000..6ecc7d0c41955e6c984d4ca14753fe548c961e68
--- /dev/null
+++ b/ SDPose-Wholebody/gitattributes
@@ -0,0 +1,36 @@
+*.7z filter=lfs diff=lfs merge=lfs -text
+*.arrow filter=lfs diff=lfs merge=lfs -text
+*.bin filter=lfs diff=lfs merge=lfs -text
+*.bz2 filter=lfs diff=lfs merge=lfs -text
+*.ckpt filter=lfs diff=lfs merge=lfs -text
+*.ftz filter=lfs diff=lfs merge=lfs -text
+*.gz filter=lfs diff=lfs merge=lfs -text
+*.h5 filter=lfs diff=lfs merge=lfs -text
+*.joblib filter=lfs diff=lfs merge=lfs -text
+*.lfs.* filter=lfs diff=lfs merge=lfs -text
+*.mlmodel filter=lfs diff=lfs merge=lfs -text
+*.model filter=lfs diff=lfs merge=lfs -text
+*.msgpack filter=lfs diff=lfs merge=lfs -text
+*.npy filter=lfs diff=lfs merge=lfs -text
+*.npz filter=lfs diff=lfs merge=lfs -text
+*.onnx filter=lfs diff=lfs merge=lfs -text
+*.ot filter=lfs diff=lfs merge=lfs -text
+*.parquet filter=lfs diff=lfs merge=lfs -text
+*.pb filter=lfs diff=lfs merge=lfs -text
+*.pickle filter=lfs diff=lfs merge=lfs -text
+*.pkl filter=lfs diff=lfs merge=lfs -text
+*.pt filter=lfs diff=lfs merge=lfs -text
+*.pth filter=lfs diff=lfs merge=lfs -text
+*.rar filter=lfs diff=lfs merge=lfs -text
+*.safetensors filter=lfs diff=lfs merge=lfs -text
+saved_model/**/* filter=lfs diff=lfs merge=lfs -text
+*.tar.* filter=lfs diff=lfs merge=lfs -text
+*.tar filter=lfs diff=lfs merge=lfs -text
+*.tflite filter=lfs diff=lfs merge=lfs -text
+*.tgz filter=lfs diff=lfs merge=lfs -text
+*.wasm filter=lfs diff=lfs merge=lfs -text
+*.xz filter=lfs diff=lfs merge=lfs -text
+*.zip filter=lfs diff=lfs merge=lfs -text
+*.zst filter=lfs diff=lfs merge=lfs -text
+*tfevents* filter=lfs diff=lfs merge=lfs -text
+assets/wholebody_anno.png filter=lfs diff=lfs merge=lfs -text
diff --git a/ SDPose-Wholebody/scheduler/scheduler_config.json b/ SDPose-Wholebody/scheduler/scheduler_config.json
new file mode 100644
index 0000000000000000000000000000000000000000..ab4573d2098886789be83ac32d48b9737edb2830
--- /dev/null
+++ b/ SDPose-Wholebody/scheduler/scheduler_config.json
@@ -0,0 +1,14 @@
+{
+ "_class_name": "DDPMScheduler",
+ "_diffusers_version": "0.28.0.dev0",
+ "beta_end": 0.012,
+ "beta_schedule": "scaled_linear",
+ "beta_start": 0.00085,
+ "clip_sample": false,
+ "num_train_timesteps": 1000,
+ "prediction_type": "sample",
+ "set_alpha_to_one": false,
+ "skip_prk_steps": true,
+ "steps_offset": 1,
+ "trained_betas": null
+}
\ No newline at end of file
diff --git a/ SDPose-Wholebody/text_encoder/config.json b/ SDPose-Wholebody/text_encoder/config.json
new file mode 100644
index 0000000000000000000000000000000000000000..9c60528fdcb99a7caf834426a94ea13c56cf422b
--- /dev/null
+++ b/ SDPose-Wholebody/text_encoder/config.json
@@ -0,0 +1,25 @@
+{
+ "_name_or_path": "hf-models/stable-diffusion-v2-768x768/text_encoder",
+ "architectures": [
+ "CLIPTextModel"
+ ],
+ "attention_dropout": 0.0,
+ "bos_token_id": 0,
+ "dropout": 0.0,
+ "eos_token_id": 2,
+ "hidden_act": "gelu",
+ "hidden_size": 1024,
+ "initializer_factor": 1.0,
+ "initializer_range": 0.02,
+ "intermediate_size": 4096,
+ "layer_norm_eps": 1e-05,
+ "max_position_embeddings": 77,
+ "model_type": "clip_text_model",
+ "num_attention_heads": 16,
+ "num_hidden_layers": 23,
+ "pad_token_id": 1,
+ "projection_dim": 512,
+ "torch_dtype": "float32",
+ "transformers_version": "4.25.0.dev0",
+ "vocab_size": 49408
+}
diff --git a/ SDPose-Wholebody/text_encoder/model.safetensors b/ SDPose-Wholebody/text_encoder/model.safetensors
new file mode 100644
index 0000000000000000000000000000000000000000..1e634cee00e6fe0f32292f62eac4ff7cdffc381d
--- /dev/null
+++ b/ SDPose-Wholebody/text_encoder/model.safetensors
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cce6febb0b6d876ee5eb24af35e27e764eb4f9b1d0b7c026c8c3333d4cfc916c
+size 1361597018
diff --git a/ SDPose-Wholebody/tokenizer/merges.txt b/ SDPose-Wholebody/tokenizer/merges.txt
new file mode 100644
index 0000000000000000000000000000000000000000..76e821f1b6f0a9709293c3b6b51ed90980b3166b
--- /dev/null
+++ b/ SDPose-Wholebody/tokenizer/merges.txt
@@ -0,0 +1,48895 @@
+#version: 0.2
+i n
+t h
+a n
+r e
+a r
+e r
+th e
+in g
+o u
+o n
+s t
+o r
+e n
+o n
+a l
+a t
+e r
+i t
+i n
+t o
+r o
+i s
+l e
+i c
+a t
+an d
+e d
+o f
+c h
+o r
+e s
+i l
+e l
+s t
+a c
+o m
+a m
+l o
+a n
+a y
+s h
+r i
+l i
+t i
+f or
+n e
+ð Ł
+r a
+h a
+d e
+o l
+v e
+s i
+u r
+a l
+s e
+' s
+u n
+d i
+b e
+l a
+w h
+o o
+d ay
+e n
+m a
+n o
+l e
+t o
+ou r
+i r
+g h
+w it
+i t
+y o
+a s
+s p
+th is
+t s
+at i
+yo u
+wit h
+a d
+i s
+a b
+l y
+w e
+th e
+t e
+a s
+a g
+v i
+p p
+s u
+h o
+m y
+. .
+b u
+c om
+s e
+er s
+m e
+m e
+al l
+c on
+m o
+k e
+g e
+ou t
+en t
+c o
+f e
+v er
+a r
+f ro
+a u
+p o
+c e
+gh t
+ar e
+s s
+fro m
+c h
+t r
+ou n
+on e
+b y
+d o
+t h
+w or
+er e
+k e
+p ro
+f or
+d s
+b o
+t a
+w e
+g o
+h e
+t er
+in g
+d e
+b e
+ati on
+m or
+a y
+e x
+il l
+p e
+k s
+s c
+l u
+f u
+q u
+v er
+ðŁ ĺ
+j u
+m u
+at e
+an d
+v e
+k ing
+m ar
+o p
+h i
+.. .
+p re
+a d
+r u
+th at
+j o
+o f
+c e
+ne w
+a m
+a p
+g re
+s s
+d u
+no w
+y e
+t ing
+y our
+it y
+n i
+c i
+p ar
+g u
+f i
+a f
+p er
+t er
+u p
+s o
+g i
+on s
+g r
+g e
+b r
+p l
+' t
+m i
+in e
+we e
+b i
+u s
+sh o
+ha ve
+to day
+a v
+m an
+en t
+ac k
+ur e
+ou r
+â Ģ
+c u
+l d
+lo o
+i m
+ic e
+s om
+f in
+re d
+re n
+oo d
+w as
+ti on
+p i
+i r
+th er
+t y
+p h
+ar d
+e c
+! !
+m on
+mor e
+w ill
+t ra
+c an
+c ol
+p u
+t e
+w n
+m b
+s o
+it i
+ju st
+n ing
+h ere
+t u
+p a
+p r
+bu t
+wh at
+al ly
+f ir
+m in
+c a
+an t
+s a
+t ed
+e v
+m ent
+f a
+ge t
+am e
+ab out
+g ra
+no t
+ha pp
+ay s
+m an
+h is
+ti me
+li ke
+g h
+ha s
+th an
+lo ve
+ar t
+st e
+d ing
+h e
+c re
+w s
+w at
+d er
+it e
+s er
+ac e
+ag e
+en d
+st r
+a w
+st or
+r e
+c ar
+el l
+al l
+p s
+f ri
+p ho
+p or
+d o
+a k
+w i
+f re
+wh o
+sh i
+b oo
+s on
+el l
+wh en
+il l
+ho w
+gre at
+w in
+e l
+b l
+s si
+al i
+som e
+ðŁ Ĵ
+t on
+d er
+le s
+p la
+ï ¸
+e d
+s ch
+h u
+on g
+d on
+k i
+s h
+an n
+c or
+. .
+oun d
+a z
+in e
+ar y
+fu l
+st u
+ou ld
+st i
+g o
+se e
+ab le
+ar s
+l l
+m is
+b er
+c k
+w a
+en ts
+n o
+si g
+f e
+fir st
+e t
+sp e
+ac k
+i f
+ou s
+' m
+st er
+a pp
+an g
+an ce
+an s
+g ood
+b re
+e ver
+the y
+t ic
+com e
+of f
+b ack
+as e
+ing s
+ol d
+i ght
+f o
+h er
+happ y
+p ic
+it s
+v ing
+u s
+m at
+h om
+d y
+e m
+s k
+y ing
+the ir
+le d
+r y
+u l
+h ar
+c k
+t on
+on al
+h el
+r ic
+b ir
+vi e
+w ay
+t ri
+d a
+p le
+b ro
+st o
+oo l
+ni ght
+tr u
+b a
+re ad
+re s
+ye ar
+f r
+t or
+al s
+c oun
+c la
+t ure
+v el
+at ed
+le c
+en d
+th ing
+v o
+ic i
+be st
+c an
+wor k
+la st
+af ter
+en ce
+p ri
+p e
+e s
+i l
+âĢ ¦
+d re
+y s
+o ver
+i es
+ðŁ ij
+com m
+t w
+in k
+s un
+c l
+li fe
+t t
+a ch
+l and
+s y
+t re
+t al
+p ol
+s m
+du c
+s al
+f t
+' re
+ch e
+w ar
+t ur
+ati ons
+ac h
+m s
+il e
+p m
+ou gh
+at e
+st ar
+wee k
+! !!
+c lu
+th ere
+n er
+t om
+s el
+ï¸ ı
+wor ld
+v es
+c am
+go t
+in ter
+of f
+u m
+ton ight
+o ther
+h ou
+loo k
+j e
+i d
+si on
+be au
+at t
+el i
+or t
+re c
+f f
+st er
+su pp
+g en
+be en
+il y
+te am
+m m
+i c
+pe op
+it t
+at s
+on ly
+mb er
+en g
+b ri
+m p
+k now
+b ur
+b ar
+in s
+lo w
+sh e
+ro w
+â Ŀ
+t ro
+peop le
+vi a
+lo w
+ag a
+be t
+x t
+f ac
+ch ar
+e ar
+w al
+s en
+f am
+b le
+n ati
+is h
+n or
+g ame
+li ve
+s co
+le y
+d on
+ic k
+b all
+ver y
+the se
+p an
+i a
+at ing
+c r
+a re
+g ir
+ma ke
+st re
+sho w
+. "
+f l
+u p
+d r
+than ks
+il li
+w om
+st s
+i g
+s ur
+ever y
+c ur
+vie w
+le t
+in to
+mo st
+n a
+in di
+g ar
+ha d
+s ou
+v ed
+an t
+iti on
+ma de
+f ol
+un i
+it ed
+ðŁ ı
+ic al
+th r
+read y
+ch ec
+d ra
+k es
+boo k
+e p
+si c
+mor ning
+ne ws
+c au
+c t
+w ell
+an c
+pho to
+th an
+or s
+bir th
+g g
+ou t
+ne xt
+som e
+en ing
+stor y
+ch ri
+do wn
+hom e
+f fe
+fre e
+d a
+b or
+f il
+ci al
+than k
+si de
+le ar
+qu e
+l ine
+t en
+at es
+ye ars
+m y
+pho to
+beau ti
+ri ght
+n u
+for m
+shi p
+b an
+th er
+d ays
+g am
+as on
+g y
+ðŁ İ
+birth day
+se t
+ic k
+e t
+st ill
+com ing
+ta ke
+ðŁ ĩ
+b b
+s ol
+s on
+d en
+e p
+mu sic
+the m
+de n
+wh y
+f oo
+c ra
+am az
+w n
+h ol
+t ting
+w r
+u e
+ma g
+c ro
+l an
+c lo
+b ra
+a k
+s ing
+c al
+re ad
+' ve
+jo h
+b ab
+d ri
+b lo
+bi g
+er ic
+in t
+t or
+tr y
+l a
+le g
+hou se
+m ic
+v al
+beauti ful
+l itt
+chec k
+ne w
+ver s
+s w
+ar i
+pla y
+h er
+âĢ ĵ
+w in
+m a
+con gr
+sch ool
+f un
+. @
+he al
+ic h
+d el
+wh ere
+l on
+ke t
+tw o
+mu ch
+wat ch
+v en
+d ed
+a st
+k ed
+b as
+go ing
+m p
+e ver
+w ays
+ro o
+de sig
+l y
+s ed
+to p
+l in
+ch an
+to o
+it ing
+d ent
+gh ts
+t y
+sp o
+ne ed
+b lu
+in st
+be ing
+âĿ ¤
+w el
+l s
+hi m
+m ay
+st ing
+n a
+el y
+litt le
+g a
+n at
+tom or
+m c
+h on
+w ant
+a ir
+pi c
+am eric
+p er
+le ss
+wee k
+ve l
+a h
+c ap
+ch am
+g er
+ti m
+tomor row
+ne ss
+st ate
+h al
+ser v
+z e
+o s
+p at
+v is
+ex c
+s in
+f f
+c ity
+c en
+an y
+b el
+su mm
+t in
+w ould
+loo king
+k o
+ce le
+fam ily
+m er
+po w
+hel p
+bu s
+c o
+c le
+sel f
+en s
+ic s
+th o
+an i
+ch o
+le ad
+b s
+t wee
+th ink
+for e
+ch il
+vi de
+di d
+al e
+ch i
+v il
+en ds
+w ing
+p as
+' ll
+v ol
+s a
+g s
+man y
+j ec
+be fore
+gra ph
+n y
+ur ing
+w il
+d d
+bu il
+f av
+st ed
+tr an
+l ing
+ou d
+d ge
+fi el
+nati onal
+st a
+c er
+w ere
+in a
+se ason
+c ou
+n ed
+amaz ing
+ti ons
+cele br
+n s
+a th
+he ad
+s day
+d ar
+lo c
+v in
+an other
+g oo
+s at
+n y
+jo in
+pre s
+s es
+s ing
+an a
+in ing
+.. ..
+c our
+ï¸ ı
+ac t
+cau se
+li ght
+am s
+t a
+b al
+f c
+hi gh
+off ici
+t t
+chri st
+d ic
+d ay
+ra l
+h or
+: )
+vi si
+n am
+o b
+ma s
+gh t
+re ally
+t un
+fin d
+thr ough
+por t
+u t
+ti ve
+st y
+n e
+or e
+ðŁĺ Ĥ
+supp ort
+ne ver
+ev en
+ðŁ Ķ
+h a
+y a
+l d
+u k
+r an
+j am
+wi th
+me di
+d es
+ne y
+ch ing
+al e
+h y
+k in
+! !
+d y
+pl ace
+al so
+b le
+wh ich
+bl ack
+b li
+s ay
+par k
+pl ay
+ir e
+vide o
+week end
+a il
+ke y
+p t
+w ard
+fri day
+d in
+ine ss
+g ro
+b en
+al ways
+t ball
+ag o
+m il
+c y
+pro duc
+di sc
+un der
+ple ase
+sp or
+fu ll
+e y
+ðŁ Ļ
+is e
+iti es
+c at
+k no
+u se
+fo re
+k er
+ar t
+hi gh
+op en
+s an
+e f
+our s
+sh ed
+st ri
+d ro
+aga in
+i m
+ðŁ ĵ
+en jo
+fu n
+ge tting
+p en
+g er
+c li
+an y
+ever y
+e u
+wom en
+â ľ
+e st
+c ould
+r y
+" @
+th ou
+sh a
+comm un
+b er
+d ents
+di s
+wh ile
+aw ay
+di o
+h am
+g la
+d ate
+k a
+mis s
+un ch
+w on
+in f
+roo m
+g a
+re al
+ex per
+di rec
+sh ould
+sp r
+g ol
+l ong
+bet ter
+or i
+e y
+i ence
+il s
+z z
+h an
+f ound
+v s
+â Ļ
+po st
+ti c
+par t
+m en
+ren ce
+ce ss
+v ic
+s il
+sho p
+ðŁĺ Ĥ
+f ood
+v al
+sti c
+y ou
+s ays
+e lec
+st ar
+o c
+l and
+i d
+c tion
+fiel d
+s of
+st art
+wat er
+fri ends
+on es
+ðŁ Į
+f la
+f ar
+wh ite
+par ty
+in st
+gr ou
+t v
+every one
+m ent
+j a
+ch a
+pr in
+an ts
+d uring
+l at
+l ar
+we st
+th en
+k a
+y oun
+in sp
+in te
+we en
+visi t
+aga inst
+re le
+he ad
+c es
+to wn
+loo ks
+th re
+re gi
+ren t
+pro jec
+gir l
+se ar
+w o
+m om
+c ar
+h un
+pu bli
+d i
+p le
+c all
+c ri
+u m
+for d
+per fe
+fri end
+h ard
+ssi on
+te st
+pla ying
+ar ound
+be cause
+ke ts
+me et
+sat ur
+ar ti
+wor k
+j un
+v en
+r un
+me mber
+por t
+su per
+t wit
+s am
+el s
+t ly
+ad v
+ati ve
+at h
+s ure
+av ail
+la r
+s qu
+ar ds
+ev ent
+m en
+l l
+o ver
+lo gy
+it al
+tim es
+m al
+b ack
+c oo
+ma king
+st ru
+â ģ
+it u
+sh ar
+g an
+c as
+s n
+summ er
+pic ture
+f an
+h in
+christ mas
+c y
+pr oud
+cham pi
+desig n
+pp ing
+ho pe
+c a
+avail able
+ma y
+we d
+photo graph
+spe cial
+sal e
+sto p
+er y
+a we
+al ity
+hi story
+am a
+pre si
+b ru
+wor king
+d one
+d r
+k en
+fe at
+w ood
+ate st
+sun day
+mo vi
+vel y
+s le
+f ace
+sp ec
+stu dents
+b y
+ha m
+sp on
+bus iness
+d at
+i e
+i p
+so ci
+g lo
+h and
+re cor
+r s
+me e
+ke ep
+p ur
+heal th
+sh e
+com ple
+go d
+da vi
+col lec
+li st
+r a
+clu b
+t ers
+in clu
+th ings
+pl an
+â ĺ
+joh n
+sh ing
+at ul
+so on
+blu e
+g or
+satur day
+w on
+congr atul
+se e
+âĿ¤ ï¸ı
+tho se
+ðŁĺ į
+fin al
+d ou
+it h
+o wn
+ro ad
+t our
+a st
+indi a
+ti l
+n d
+f er
+fav or
+su l
+lear n
+fir e
+ju st
+grou p
+a h
+r ac
+bo dy
+u r
+c are
+à ¸
+p lo
+o h
+po s
+gi ve
+te ch
+su b
+c ent
+er ing
+y m
+il ity
+f ic
+lon don
+v ir
+gu ys
+b a
+ðŁ ¤
+bab y
+sc re
+ðŁĺ į
+tru mp
+un der
+chan ge
+i an
+col le
+ss es
+l er
+ss ed
+n ice
+ann oun
+pow er
+s ar
+a king
+min i
+s li
+s wee
+k ar
+fu l
+c ru
+ac tion
+a ther
+) .
+st and
+de vel
+a a
+g an
+le ft
+lo l
+re l
+tran s
+m ents
+in t
+e f
+man ag
+di g
+gen er
+do wn
+p au
+ti v
+k u
+th ur
+k en
+st on
+f ans
+tal k
+twee t
+t oo
+sty le
+pro te
+se con
+fr on
+awe some
+g l
+p al
+ne t
+s or
+la u
+g on
+sin ce
+t ty
+ser ies
+me mor
+b eli
+fil m
+di d
+di es
+o t
+congratul ations
+p ra
+e ve
+w oo
+offici al
+su c
+in cre
+b on
+par t
+pp ed
+cla ss
+si ve
+bo y
+cu l
+perfe ct
+t ou
+d am
+wel come
+foo tball
+h i
+p ap
+wa it
+ad a
+congr ats
+youn g
+exc ited
+re ce
+j an
+v a
+re d
+st ra
+medi a
+' d
+do es
+le t
+mu l
+ill s
+gre en
+m el
+to ge
+fu ture
+ye ster
+vers ity
+for m
+ta in
+i de
+ch es
+ki ds
+qu i
+ha ha
+de ta
+bi g
+favor ite
+gir ls
+con tin
+do m
+sear ch
+u al
+a ir
+d ers
+mon th
+c er
+yester day
+commun ity
+ad e
+do g
+vil le
+ic es
+d eli
+sy ste
+ru n
+is m
+he art
+c up
+en ti
+fe w
+presi dent
+e ds
+un til
+fe sti
+o k
+f lo
+sa id
+ol e
+me d
+tra vel
+Â £
+ph one
+toge ther
+fa st
+lo t
+gam es
+sh ir
+bet ween
+y es
+th ers
+do ing
+m ac
+at or
+b and
+fol low
+projec t
+devel op
+di ffe
+con fe
+spe ci
+ca st
+y s
+bo ard
+r d
+i al
+sh oo
+r am
+ha ving
+sh are
+fol low
+on e
+n ame
+m r
+pu t
+disc u
+or y
+c ame
+ou s
+s ite
+twit ter
+t b
+t it
+fin ally
+z ed
+su per
+com pan
+us ing
+all s
+li st
+r is
+sho t
+g al
+t ar
+de l
+joh n
+âĢ Ķ
+some thing
+ra m
+inte re
+wh e
+b it
+ðŁ į
+stre et
+oun d
+a i
+tic kets
+movi e
+re al
+k y
+ta king
+o pp
+c c
+l am
+m oun
+in ve
+bl ack
+us ed
+on line
+y or
+loc al
+gu e
+c ks
+o w
+ge st
+bo ys
+illi on
+con t
+re ci
+in ed
+eu ro
+no w
+se en
+p h
+te ach
+de f
+sou th
+su ch
+aw ard
+mu st
+is su
+ca re
+fe el
+p lu
+l atest
+spor ts
+we b
+te x
+e ment
+s k
+fi c
+w an
+te ch
+o t
+bo x
+n er
+fre e
+t al
+a sh
+c ase
+ho t
+won der
+mee ting
+er a
+ch all
+ðŁ IJ
+jo b
+il i
+c ool
+j our
+th s
+m o
+f el
+di e
+mic ha
+e le
+te am
+serv ice
+st and
+ma kes
+p ing
+ear ly
+com es
+e k
+ho li
+v ers
+ag ue
+s au
+thre e
+mon day
+fa shi
+some one
+th ro
+se a
+b ad
+supp or
+tur n
+ur y
+m ing
+photograph y
+n ic
+mar k
+pre tty
+ss ing
+wat ching
+me mb
+ar ri
+coun ty
+be ach
+fr an
+cen ter
+pol ice
+b at
+publi c
+t an
+pre ss
+s af
+s y
+ge ts
+ro y
+n ers
+y our
+bu y
+st ers
+sho w
+as ed
+chil dre
+af ric
+in es
+sp ace
+sc ri
+h all
+pa in
+ar ing
+hom e
+m ur
+heal th
+ch ed
+s and
+rece i
+gu y
+e a
+americ an
+re si
+childre n
+- -
+i ri
+ing ton
+coun try
+ro ss
+le n
+ann a
+boo ks
+b c
+e ce
+d om
+lo vely
+k h
+pe t
+g y
+g ri
+st age
+off ice
+ro ck
+m on
+b ay
+t able
+su n
+m ed
+th in
+l or
+f low
+( @
+uni versity
+stor e
+fron t
+goo d
+z a
+vo te
+nor th
+he y
+an im
+or der
+mi d
+with out
+a de
+re member
+mar ket
+? ?
+mu s
+tra ining
+e duc
+bu t
+co ver
+st an
+sc en
+b la
+bre ak
+l ou
+s ame
+g old
+a in
+o s
+bo th
+l it
+ver n
+a i
+al bu
+p a
+enjo y
+be g
+ell ing
+thur sday
+inf o
+s an
+americ a
+ha ir
+te l
+mar ch
+con cer
+colle ge
+confe rence
+ap p
+h our
+ch ang
+â ļ
+s our
+ol s
+we ather
+w ar
+p hi
+festi val
+secon d
+cu te
+pr ac
+en er
+str y
+le a
+pol it
+s av
+se n
+o w
+m i
+ne ar
+ou ght
+z e
+co ffe
+w illi
+d an
+se y
+davi d
+e se
+f an
+de ci
+the at
+no v
+ati on
+tr ac
+sc i
+re view
+c el
+e m
+u n
+ju ly
+or ig
+ti on
+d ru
+form er
+st ay
+af ter
+in v
+too k
+dat a
+b al
+tu es
+d an
+ev ening
+ðŁĺĤ ðŁĺĤ
+d ol
+u res
+pro vi
+t s
+e st
+sig n
+j ac
+u k
+s ong
+ye t
+bo w
+in du
+j ap
+h oo
+po int
+any one
+z y
+i st
+h ur
+it al
+buil ding
+wom an
+ch ur
+j er
+per for
+co ach
+le ague
+ce ss
+ne t
+i mag
+nati on
+br it
+qu e
+aw ards
+ag es
+wor ks
+c ed
+man ce
+l ate
+ig n
+mon ey
+tru e
+i i
+t ell
+pl ac
+p ac
+as y
+wor ld
+be hin
+im port
+read ing
+gra m
+gi ving
+me t
+h it
+for ward
+st om
+pres ent
+jun e
+so cial
+no on
+mar t
+hal f
+s we
+go vern
+k er
+deta ils
+li sh
+_ _
+ac y
+si a
+ber t
+f all
+! !!!
+) ,
+th i
+d iti
+sp ort
+k ing
+f it
+st af
+c at
+mu se
+cen tr
+y er
+con tro
+b loo
+wal k
+ac tu
+did n
+li m
+lear ning
+re search
+wed ne
+au th
+h ours
+k y
+f ar
+h en
+.. ..
+it ch
+ri l
+str ong
+sk y
+que sti
+jam es
+r on
+d g
+f ur
+c in
+do es
+app ro
+mar ke
+tu res
+ful ly
+ch at
+behin d
+te m
+fin i
+mis sion
+b att
+fe el
+he av
+every thing
+b ar
+w ish
+pre mi
+i ma
+exper ience
+e ach
+re port
+swee t
+tic s
+spr ing
+re spon
+syste m
+vic tor
+l in
+sa w
+al ready
+gh ter
+f le
+ã ĥ
+br ing
+albu m
+- -
+ell s
+st an
+to m
+inter national
+w ent
+an ni
+mat ch
+pp er
+st one
+sm all
+ra in
+fashi on
+are a
+v an
+ag ram
+k o
+thou ght
+wor th
+v an
+m er
+coffe e
+it es
+g n
+arti st
+c on
+ar ch
+c ir
+se cre
+gr ound
+is o
+h and
+co m
+bri dge
+h s
+x i
+l ink
+pu l
+sp l
+r ace
+f li
+ri ver
+g as
+di sco
+d al
+play er
+f it
+photo s
+it y
+o k
+j or
+tr a
+ap ril
+ad s
+a di
+sol u
+beau ty
+do or
+me ss
+up date
+ali a
+sch o
+en ed
+mom ent
+sco t
+sc ience
+i or
+ti es
+ac ross
+ous ly
+sh es
+does n
+p age
+wat er
+m illion
+cla ssi
+l ic
+ca st
+form ation
+micha el
+ell o
+s mo
+in ts
+vi sion
+op ening
+ld n
+au str
+tues day
+win ner
+po ssi
+r ound
+shir t
+di t
+b o
+u es
+il led
+al ong
+tri p
+star ting
+im pro
+k an
+per son
+no t
+re co
+ne eds
+c le
+li e
+re st
+r ing
+win ter
+si mp
+mo m
+be er
+fac e
+tor s
+us a
+collec tion
+ge or
+se ssion
+tr ying
+la s
+la ke
+j en
+orig in
+stu dent
+se cur
+v in
+pic s
+ex pe
+com p
+gon na
+e qu
+b ad
+le y
+a u
+memb ers
+bre ak
+w all
+gi c
+din ner
+bu l
+insp ir
+r i
+min d
+ic a
+win ning
+tal king
+t ren
+s is
+t en
+wonder ful
+s now
+he ar
+th om
+no thing
+gu i
+st in
+blo g
+fe st
+b un
+le e
+war ds
+ch ance
+dre ss
+re n
+pau l
+p es
+tech no
+ru ssi
+c ard
+e ast
+mar i
+w ine
+t i
+la w
+str ic
+k i
+ap e
+au gu
+pro fe
+as h
+cour se
+ma il
+ren tly
+d un
+m un
+lo ve
+is land
+dri ve
+s l
+end ed
+ma in
+lo st
+nat ure
+âĿ¤ ï¸ı
+ch ic
+re por
+p in
+pr o
+st ation
+ce p
+ta kes
+compan y
+go es
+on d
+ma ch
+ra dio
+d ad
+ro ck
+j a
+p ay
+champi on
+e e
+in de
+tt a
+ati c
+t ab
+beli eve
+ener gy
+z i
+t at
+wor d
+on ce
+re sul
+y l
+and re
+an o
+inst agram
+clo se
+t am
+cu stom
+w a
+con om
+sho ws
+li fe
+k in
+ro b
+t age
+n ation
+al most
+list en
+sa ve
+re li
+ac e
+mar y
+tre e
+for get
+j ack
+wa iting
+direc tor
+h ill
+bor n
+te mp
+f l
+st e
+on a
+sing le
+wedne sday
+un ited
+in o
+@ _
+ne l
+celebr ate
+en ding
+de al
+j i
+can ada
+hu ge
+tr ack
+âĢ ¢
+f y
+fan ta
+an g
+yor k
+rele ase
+p un
+ep iso
+wor ds
+t our
+p ack
+i gh
+classi c
+perfor mance
+ke t
+after noon
+recor d
+win s
+pro ble
+âĿ ¤
+f our
+b ed
+ban k
+d ance
+s la
+cal led
+mi ght
+a p
+pa st
+ðŁ ļ
+diffe rent
+it e
+gi ft
+ssi ve
+chur ch
+c us
+pro gram
+ho tel
+ic e
+ma d
+secur ity
+en ge
+d c
+en ough
+st a
+e ty
+de ad
+g un
+he ar
+m ir
+hu man
+gre ss
+oun ds
+pi ece
+bre aking
+gar den
+fi ght
+vie ws
+f ish
+star ted
+run ning
+gre en
+ser i
+s m
+as k
+d or
+de ath
+e conom
+er i
+ir d
+s er
+l unch
+âģ ¦
+bo x
+nat u
+ba se
+b an
+f al
+glo bal
+wil d
+wo w
+out side
+mo ve
+le ad
+an al
+muse um
+on g
+ha w
+pow er
+than k
+b ac
+char ac
+cam pa
+dig ital
+r o
+op er
+de v
+w ol
+p ati
+f a
+m ale
+pap er
+ill ing
+c s
+â ĥ
+educ ation
+ta ken
+e ffe
+m ou
+s ad
+" .
+bas ed
+staf f
+inclu ding
+li ving
+a c
+ch ina
+mo b
+stor m
+lu ck
+ph il
+o o
+y n
+tra vel
+k el
+ti al
+pr ice
+boo k
+import ant
+bi o
+p ool
+ny c
+f ab
+lo ad
+? !
+chall enge
+cr y
+ser ve
+we ar
+bu s
+ta in
+nu mber
+ro r
+k at
+i z
+th ough
+ho sp
+m m
+fa ir
+ut es
+ho t
+po p
+fi ed
+cam p
+develop ment
+li br
+c ali
+em s
+âģ¦ @
+b ol
+is ed
+stand ing
+mo del
+it a
+g le
+bro wn
+ima ge
+ve red
+for ce
+o il
+par tic
+sh u
+da ily
+la w
+se c
+cla ss
+cam p
+holi day
+cl in
+k ers
+pres ent
+gam e
+incre di
+er ship
+inter view
+b ill
+du e
+and y
+ab o
+in nov
+ke y
+ac ade
+p il
+mo der
+st ars
+br and
+f er
+wee ks
+con si
+pr e
+sa fe
+wr it
+di um
+la unch
+marke ting
+ann ual
+as si
+cour t
+la dy
+c ted
+and a
+in side
+chil d
+opp or
+sm ith
+centr e
+gu e
+âģ ©
+f ren
+st y
+for t
+ent ly
+is n
+ke ep
+to ber
+on y
+bo y
+al d
+col la
+de mo
+le vel
+com pet
+ad o
+b our
+fanta stic
+m ate
+s u
+sou th
+oppor tun
+vers ary
+lat er
+bu d
+face book
+la un
+ster n
+p it
+! "
+ma j
+gr am
+tb t
+fi re
+happ y
+a ks
+wh ole
+actu ally
+ill er
+ell a
+lo ts
+al ex
+an ge
+lan ds
+ðŁĺ Ń
+en ter
+r ou
+episo de
+p ed
+in ten
+sh ire
+wh o
+pl an
+h o
+ca ke
+we st
+mag az
+fre sh
+c c
+n ar
+ch ris
+wr iting
+w er
+n om
+l o
+mi dd
+dre am
+o l
+ti onal
+de b
+> >
+be come
+s i
+gr and
+all ing
+hi stor
+ri de
+i red
+saf e
+que en
+ci l
+in tro
+vi l
+d ani
+.. .
+ar tic
+st at
+sh ort
+or ing
+sel fi
+mis si
+do c
+b it
+g all
+b om
+i re
+se lec
+d ition
+ðŁĶ ¥
+fri end
+be at
+gh ting
+ðŁĺ Ĭ
+pe ace
+ex hi
+ant a
+ab ility
+il lu
+j on
+qu ality
+tri bu
+m es
+play ers
+fa ir
+cu t
+c ab
+suc cess
+b i
+su s
+pro mo
+sch e
+an ge
+ic o
+comm it
+cat ch
+ill a
+kin d
+feel ing
+qu o
+s ay
+anni versary
+spo t
+mo ther
+an e
+p end
+your self
+op s
+app le
+min utes
+p o
+gr and
+ri es
+ha ha
+care er
+ed ition
+de c
+ric k
+am i
+concer t
+iti ve
+ge ous
+d ly
+t te
+adv ent
+i g
+li ghts
+ak er
+sk y
+âĥ £
+r ay
+fini shed
+w ay
+s d
+ac coun
+ðŁĴ ķ
+ck y
+ch el
+lit er
+pain ting
+lo s
+st un
+techno logy
+n as
+ma r
+b il
+afric a
+ki e
+ey es
+gol f
+plu s
+ni a
+it ec
+serv ices
+wed ding
+kno wn
+te le
+.. ...
+star ts
+pa ren
+w ants
+ati onal
+mon ths
+win do
+fav our
+er t
+magaz ine
+ex clu
+re ve
+b c
+origin al
+e ss
+n al
+an ti
+st ro
+t ice
+stu dy
+à ¤
+v ac
+nation al
+fi ve
+ra in
+ve ment
+u te
+ver se
+em er
+ar my
+possi ble
+gue ss
+val ley
+ther n
+cro w
+m r
+col or
+on to
+pic k
+cle ar
+dar k
+t ac
+wan ted
+it ting
+can cer
+govern ment
+di e
+ri se
+z ing
+col d
+f oun
+stu dio
+str ation
+bro ther
+a head
+sh el
+mic ro
+ic ally
+d au
+sig ned
+vi ol
+a x
+as se
+i o
+w re
+spl ay
+ch ick
+augu st
+pl at
+ti ps
+sp i
+hu man
+e asy
+lo gi
+mi ke
+gro w
+ag re
+w w
+sh ad
+mo tiv
+wi de
+tur ns
+om g
+v ar
+de fin
+su g
+j im
+ðŁĶ ¥
+t d
+campa ign
+nam ed
+re tweet
+co p
+t v
+le av
+k is
+dou ble
+s mar
+issu e
+vil la
+in formation
+li es
+sto ck
+n t
+di stric
+sh or
+mi x
+er o
+se p
+me x
+see ing
+li ve
+re min
+co de
+g ur
+s c
+wil d
+l un
+h ood
+spo t
+fa ther
+fore ver
+up d
+tra f
+f ly
+ne ed
+gra du
+tra in
+ma ke
+s ab
+be y
+si ze
+lead er
+tal ks
+e u
+lo g
+fo x
+gor geous
+le ss
+le ts
+sur pri
+my self
+no te
+li ves
+f ru
+lo ved
+se ver
+de m
+j i
+so c
+h old
+do gs
+n i
+â ŀ
+lea ve
+air port
+ben ef
+ex pl
+shi ps
+comple te
+ach i
+gre at
+vin tage
+j ack
+ro c
+woo d
+pri v
+off er
+ey e
+ver sion
+te a
+co ach
+off ic
+w ell
+g en
+s at
+h h
+you th
+o x
+? "
+m t
+mi x
+g g
+d le
+natu ral
+buil d
+break fast
+thin king
+theat re
+mo on
+ber g
+go als
+geor ge
+en e
+exc ell
+il ing
+tun e
+y ed
+g ate
+m it
+net work
+jo e
+h ello
+f b
+tu be
+we aring
+ath le
+stru c
+har d
+gla ss
+g ers
+thro w
+g es
+b t
+indu stry
+manag ement
+ali st
+go al
+stre am
+y el
+a vi
+ici ous
+o thers
+s ki
+chri sti
+bir d
+e sc
+m in
+tr o
+l t
+j an
+im p
+ri ghts
+sh a
+or gan
+cent ral
+ar a
+ro ll
+favour ite
+che ster
+el se
+p ay
+car s
+m ine
+ste p
+prac tice
+maj or
+h ang
+ðŁĺ ĺ
+n on
+v ari
+eng ine
+vol un
+di a
+i led
+arch itec
+p ink
+d s
+th y
+wa sh
+web site
+ba g
+contro l
+el li
+f ra
+an sw
+d ence
+y u
+r on
+ol a
+g in
+dr in
+li c
+cou ple
+sp ar
+g on
+cre ate
+c t
+celebr ating
+de ep
+e at
+te e
+vo ice
+dro p
+vis it
+at ors
+sta dium
+f t
+w is
+ro l
+gra de
+fam il
+po ints
+re pre
+w as
+traf fic
+jap an
+or g
+hon or
+tex as
+man u
+âĻ ¥
+safe ty
+re r
+b ag
+em plo
+rele ased
+re gu
+ak a
+n av
+ro le
+sen ior
+spec t
+cro ss
+lin es
+be st
+p ack
+s in
+ti e
+mis sing
+sun set
+li ber
+is ing
+j ay
+sk i
+champion ship
+ac tiv
+la dies
+play ed
+y y
+pu bl
+al o
+pri de
+s r
+pa ki
+lu x
+sur vi
+ck ed
+e ts
+cho col
+austr alia
+par is
+mi les
+h at
+ment al
+al a
+me an
+mob ile
+en a
+in si
+f ound
+chi ef
+t ag
+incredi ble
+re turn
+Ã ©
+goo gle
+fren ch
+cre w
+hal lo
+ali an
+j az
+ch er
+sil ver
+nor th
+eng lish
+base ball
+c af
+lim ited
+follow ing
+app reci
+ear th
+k ir
+ve mber
+w ed
+p tion
+g ed
+oc tober
+fl ori
+c r
+en cy
+ga ve
+lor d
+stu ff
+ber ry
+po st
+sm ile
+bro ad
+st ate
+gg er
+me ans
+ic y
+gu n
+y o
+ma ster
+bur g
+han ds
+ni e
+/ /
+uni on
+brit ish
+big gest
+distric t
+am ing
+h il
+o ce
+per son
+pas s
+en vir
+scho ols
+arri ved
+anc es
+insp ired
+ex pla
+be n
+libr ary
+bo tt
+am p
+ste ph
+cont act
+b ang
+m s
+cali for
+t old
+batt le
+b b
+chic ago
+âľ ¨
+str ate
+sh i
+de ce
+- )
+ad d
+la b
+j ones
+leg end
+cast le
+ing er
+st ance
+be l
+ur a
+re fu
+lead ers
+po t
+se x
+h ic
+artic le
+ki d
+fr ance
+x x
+ex e
+gui de
+volun te
+pr int
+al i
+ce o
+twee ts
+w x
+scen e
+vol u
+ant i
+h an
+as soci
+shar ing
+ro se
+mini ster
+sh er
+in ste
+cle an
+demo cr
+po ster
+sk in
+p sy
+pro per
+cra zy
+i am
+o re
+in i
+any thing
+po d
+mo ving
+cl ick
+ex plo
+com b
+cra ft
+f i
+bloo d
+is ra
+publ ic
+d ent
+ol ym
+eng land
+a si
+ch er
+fac t
+envir on
+har ry
+g one
+me dic
+enjo ying
+just ice
+j r
+indi an
+wi fe
+s ound
+t es
+dra wing
+p al
+ide a
+cr it
+ju li
+il er
+war m
+cl ar
+thou ghts
+def en
+coun cil
+intro duc
+di ed
+jan u
+an i
+s end
+li er
+m l
+intere sting
+tra de
+win d
+b ay
+s ac
+anc y
+sour ce
+b es
+org ani
+ar ly
+lar ge
+ff ici
+ta g
+u t
+de sp
+o es
+tit le
+sy m
+pic tures
+op en
+wom en
+sho wing
+ri a
+le ast
+lead ership
+cur rent
+elec tr
+val ent
+list ening
+c key
+gener al
+de ser
+du ce
+; )
+c ent
+ðŁĺį ðŁĺį
+sco tt
+po or
+selfi e
+ev ents
+i on
+wr ong
+de v
+h ill
+sep te
+cul ture
+l ine
+sor ry
+s ent
+si ster
+ce pt
+k ri
+no vember
+ar i
+announ ce
+z ation
+br an
+g ent
+d u
+l en
+per s
+f m
+mart in
+o p
+e mb
+om e
+midd le
+suc cess
+pe ter
+janu ary
+f lu
+rac ing
+d av
+bi ke
+ðŁı »
+pe t
+shoo t
+profe ssi
+feat uring
+septe mber
+now playing
+sta ur
+z a
+on ic
+qu ick
+bas ke
+spe aking
+mil it
+z er
+chick en
+b ell
+s ad
+co ast
+lo ving
+y ers
+d j
+pan el
+ver age
+s wit
+ic ks
+b ou
+califor nia
+s am
+paren ts
+er o
+k illed
+ph ys
+jo bs
+mi gr
+an th
+e mo
+hallo ween
+and er
+c m
+compet ition
+e ag
+s ket
+sp ir
+may be
+exclu sive
+app e
+jour ney
+scre en
+for d
+i o
+h ate
+u g
+sou l
+her o
+soci ety
+sy n
+gu it
+n h
+d j
+as es
+im pre
+ti me
+sal es
+d d
+f ts
+summ it
+stun ning
+om s
+tur ned
+cle an
+sof t
+be at
+re staur
+de red
+en ces
+ma gic
+di o
+sh ine
+gu est
+health y
+exhi b
+stor ies
+po pu
+n is
+el a
+bel ow
+fun ny
+resul ts
+s ne
+cur rently
+ar d
+down load
+f light
+m al
+f ine
+p ad
+ch u
+ent ed
+h at
+ðŁij ı
+ste ve
+j o
+mar k
+r at
+b all
+p c
+p on
+b by
+o li
+ar ts
+as ure
+bow l
+att ack
+mi c
+de ar
+ran ge
+en ter
+chocol ate
+br illi
+ac cess
+, "
+? ??
+ch ap
+con st
+t n
+mat ter
+blu e
+gall ery
+em p
+work shop
+lead ing
+y ours
+baske tball
+w anna
+th u
+_ _
+mar ri
+sle ep
+bi a
+ch e
+ma d
+imp act
+o wn
+si r
+chan nel
+euro pe
+e sp
+k itch
+hosp ital
+w ra
+roy al
+f s
+ne u
+qu ar
+ne y
+ac ks
+ch ase
+pp y
+st al
+at ely
+ti m
+dece mber
+r are
+per form
+cre am
+we ight
+ch oo
+ni ght
+ha ven
+fr anc
+kh an
+buil t
+hel ping
+tru st
+ty pe
+gol den
+ta x
+s now
+s wi
+di sa
+questi ons
+ve y
+li ght
+c n
+cl oud
+thom as
+ag ed
+sh ou
+te ams
+gr an
+re ason
+a a
+you tube
+v p
+pi zz
+manag er
+bur y
+cre dit
+tre at
+ma x
+i k
+ma in
+g ing
+de ad
+pro bab
+ye ah
+ã Ĥ
+br and
+so li
+pl ant
+ta yl
+gir l
+ðŁĺ Ń
+nam ent
+au to
+mess age
+ko re
+n ur
+ter r
+ag u
+ma p
+sen ting
+lo ves
+gi ves
+g ab
+z en
+ro bert
+con fir
+w ars
+o m
+sta in
+cam era
+and er
+won der
+a b
+ca p
+s old
+su it
+wal king
+contin ue
+effe c
+dau ghter
+d anc
+cha in
+mul ti
+ki d
+y an
+champi on
+v o
+ta ins
+ho st
+min i
+mis sed
+re sc
+ly n
+fin ish
+del icious
+s as
+tayl or
+i b
+pro mis
+produc ts
+moun tain
+flori da
+regi ster
+tre at
+rec ent
+fe male
+boo th
+mat t
+ve hic
+s op
+mo tor
+suppor ting
+phi c
+ex tre
+dr ink
+lan e
+th ird
+p s
+con stru
+ce re
+far m
+ðŁİ ī
+tu red
+ðŁij ī
+c ats
+a j
+gi e
+shoo ting
+as ked
+paki stan
+am e
+m b
+g il
+leg al
+squ are
+in vol
+dra w
+oo oo
+!! !!
+opportun ity
+p y
+e i
+b ts
+teach er
+charac ter
+john son
+br on
+ly wood
+ch ine
+c ing
+c ine
+d ge
+gam ing
+russi a
+ci a
+quo te
+ric h
+go v
+flow ers
+sp iri
+st in
+grow th
+ðŁı ¼
+comm er
+j uni
+mu m
+r an
+s na
+a ren
+c b
+ac tor
+col or
+si t
+pa ir
+ch i
+bo w
+acade my
+hel d
+r ang
+me tal
+y l
+ac tive
+probab ly
+t ch
+need ed
+spe e
+cho ice
+ital y
+ry an
+ðŁĩ º
+flow er
+v it
+m n
+found ation
+b ak
+si ons
+ne igh
+f loo
+he ard
+re mo
+fre sh
+ing ing
+re f
+to wn
+cl ou
+je sus
+spiri t
+cou ldn
+z es
+ðŁĴ Ļ
+willi ams
+pro ce
+moder n
+pro cess
+sho es
+cre ated
+tri c
+issu es
+ann e
+att en
+de but
+h r
+n it
+sti g
+a po
+e ps
+z u
+ã Ģ
+si x
+car ds
+lan gu
+fam ous
+tour nament
+se l
+e bay
+y n
+st on
+k ick
+announ ced
+k am
+vo c
+brilli ant
+hou se
+che ese
+war ri
+mus ic
+ho ckey
+ðŁĺĤ ðŁĺĤ
+sk ills
+au tom
+smar t
+med ical
+mon y
+e x
+gu ar
+gi ve
+pers onal
+ven tion
+al li
+pre ss
+flo or
+m c
+victor y
+hi m
+simp le
+th or
+ðŁĩº ðŁĩ
+ta il
+lu cky
+ale x
+qu ite
+bo t
+ssi ons
+chall eng
+c ann
+amaz on
+h ell
+b ought
+) :
+ed y
+secre t
+produc tion
+inde pend
+de fe
+ad ded
+p r
+p ag
+be d
+gre atest
+with in
+j ay
+ðŁ ¥
+ire land
+re ly
+s d
+te xt
+dri ving
+pro gram
+spe ed
+col um
+str on
+Ã ©
+fore st
+â ĸ
+mach ine
+co in
+sc ar
+oun t
+bi e
+¡ ï¸ı
+por tra
+comm on
+wre st
+recei ved
+kno w
+inve st
+pl ans
+ac cor
+ad op
+ter y
+re ali
+p p
+k al
+art work
+me an
+go d
+inste ad
+an ci
+motiv ation
+as ing
+inspir ation
+up coming
+polit ical
+euro pe
+m ers
+heav y
+ðŁij į
+fe bru
+scot land
+ou gh
+b t
+bo ss
+sche du
+spe ak
+n ick
+u red
+in o
+e k
+ri sk
+tor y
+pres ents
+b on
+ru g
+st ates
+exhib ition
+il o
+m ill
+br ought
+: -)
+tou ri
+com e
+offici ally
+champi ons
+do ors
+re p
+po se
+ex tra
+k ings
+soc cer
+squ ad
+app lic
+at a
+some times
+t ari
+excell ent
+ðŁĺ ĺ
+stra ight
+car ol
+ri p
+âĢ į
+gra phic
+m ol
+elec tion
+febru ary
+as ons
+l i
+di r
+m t
+n ick
+u su
+m rs
+com ics
+inst itu
+cor por
+v i
+ðŁĻ ı
+tu ral
+di se
+ac ci
+we are
+am ong
+sho pping
+t ill
+wh at
+cha ir
+sp an
+chine se
+innov ation
+jo y
+k it
+cent ury
+ob ama
+ph ili
+f c
+re ach
+c iti
+ul ous
+n on
+d ang
+happ ening
+bur n
+p el
+or ange
+d v
+k ick
+cla im
+ing ham
+ph y
+no v
+pod cast
+wh i
+ni ghts
+ear lier
+be ar
+la h
+exc iting
+or a
+gi ven
+s lo
+memor ies
+contin ues
+produc t
+gh o
+c d
+kno ws
+ðŁİ ī
+publi shed
+discu ss
+y ard
+i phone
+tri es
+w all
+fe b
+are n
+tru th
+win ners
+tu re
+diti onal
+milit ary
+proble m
+m and
+do g
+lo ss
+c ric
+can adi
+ve ter
+villa ge
+" ,
+y r
+un g
+don ald
+ag ing
+bir ds
+sci enti
+le s
+th is
+regi on
+tic al
+itt en
+il a
+ðŁĺ İ
+d ad
+di am
+abo ve
+st ren
+li t
+p ir
+la b
+fo cus
+bus y
+d ur
+app ly
+s ma
+auth or
+ac i
+exe cu
+dom in
+re la
+jack son
+at o
+wash ington
+ðŁĻ Į
+k ill
+popu lar
+ce ment
+ro ad
+e ating
+loc ation
+v ent
+ar re
+n an
+cu sto
+advent ure
+or din
+spor t
+ul t
+lo ck
+questi on
+dri ver
+land sc
+on i
+k ins
+p d
+jor dan
+te red
+k k
+a f
+chil d
+s p
+just in
+en i
+s elling
+z o
+wh it
+bo ston
+partic ip
+sig ning
+happ ened
+he at
+m am
+dre ams
+lo ws
+gra ph
+the day
+head ing
+br o
+ble ssed
+vi c
+ve gas
+h d
+in ning
+ro man
+and ro
+den ti
+u se
+c it
+pro gress
+writ er
+bo b
+ff s
+gro wing
+b ly
+aw are
+ex am
+sp ent
+be t
+sc ore
+bey ond
+do cu
+ad el
+s f
+cou ra
+colla bor
+in c
+priv ate
+bo at
+* *
+z one
+p ha
+b ill
+to tal
+plan ning
+to wards
+plac es
+pre view
+cre ative
+dam n
+ide as
+se ems
+po ten
+say ing
+di splay
+s w
+a qu
+lou is
+by e
+li l
+e mail
+we stern
+ger many
+ell er
+re s
+f ant
+ment ary
+de als
+ric hard
+jer sey
+stren g
+ra d
+pizz a
+mon d
+w are
+l ac
+g i
+ar chi
+c d
+yel low
+rec ently
+re ach
+à ¹
+kitch en
+desig ned
+tr y
+g al
+restaur ant
+at ure
+w w
+j as
+l ma
+ðŁij Į
+pa in
+av o
+min ute
+sch ol
+ther ap
+tic ket
+d ry
+jap an
+diti ons
+ter ri
+sel ves
+happ en
+t up
+ma g
+cop y
+sh er
+free dom
+f ile
+speci ally
+tor onto
+lo ad
+g ary
+re y
+answ er
+lo y
+cau ght
+pri ze
+u ne
+fic ation
+ni ger
+sy d
+tou ch
+feat ure
+jaz z
+recor ds
+him self
+di sh
+ro ber
+spot ted
+ma ster
+wa ve
+fin als
+bu ll
+for um
+al d
+re comm
+ch a
+a e
+d oo
+inst ru
+tru ly
+l g
+in k
+bro thers
+de st
+j im
+m it
+clo sed
+is on
+tri ed
+s anta
+af fe
+w an
+hor se
+g row
+camp us
+rel ation
+nati ve
+jour n
+go v
+o ct
+k it
+b ound
+part ner
+re ma
+crow d
+! )
+c alls
+ra il
+qu ali
+solu tion
+con test
+con vers
+sn ap
+b ase
+in iti
+ta x
+y e
+ent repre
+it or
+constru ction
+foo d
+present ed
+n ings
+cli mate
+k m
+mo del
+b j
+blo ck
+present ation
+dre am
+fi x
+c alling
+bus ine
+con gress
+under stand
+we b
+val ue
+ï¸ı âĥ£
+mex ico
+it ely
+ki m
+char ity
+ref lec
+bl an
+fl ying
+anal y
+famil ies
+b and
+reci pe
+celebr ation
+ac cep
+ar y
+to t
+g b
+intere sted
+cap tain
+âĻ ¥
+ti p
+ab sol
+bra z
+inve stig
+o logy
+de c
+tru ck
+ver ing
+c lear
+don t
+go tta
+ad vis
+beg ins
+ma ss
+de scri
+blo ck
+k im
+davi d
+son gs
+memor ial
+feat ures
+su stain
+' .
+gra b
+jo se
+v a
+con serv
+se ts
+man chester
+fi ghting
+de gre
+ag a
+in d
+sle ep
+pos ition
+ha ir
+sig ns
+pol icy
+it o
+al ert
+st am
+sp end
+w y
+absol ut
+d m
+anim al
+my ster
+success ful
+proble ms
+ro bo
+k ay
+gar den
+p d
+may or
+d ale
+t ol
+off ers
+vis iting
+friend ly
+tre es
+offic er
+accoun t
+ke vin
+ðŁij į
+gi ant
+contin u
+con su
+tr act
+n fl
+ðŁĺ Ĭ
+h q
+b ility
+a ar
+dis ney
+te en
+on ed
+wh ite
+tra iler
+de dic
+al one
+absolut ely
+dig ital
+willi am
+in ation
+s wa
+e e
+enti re
+ger man
+ro ll
+h its
+co st
+st ay
+th a
+ali ve
+accor ding
+co t
+liter ally
+her it
+re ti
+haha ha
+exper i
+li kes
+g t
+ste el
+__ __
+ch air
+christi an
+to wer
+diffe rence
+m d
+tre ss
+mi d
+prin ce
+afric an
+fe der
+foo t
+car ri
+ser ved
+r ice
+sh all
+feat ured
+ck er
+rec ru
+po e
+sen se
+ni fic
+com edy
+cont ent
+f at
+po sted
+con tribu
+tim ate
+li ver
+mb le
+inter net
+ag e
+europe an
+cl ing
+gla d
+ff ic
+sc o
+ak es
+el le
+ter min
+ton y
+p ale
+col our
+seri ous
+pat ri
+movi es
+b m
+professi onal
+ad o
+al u
+br inging
+f alls
+isra el
+ter m
+langu age
+bro ok
+man n
+commun ic
+can not
+ac ti
+p he
+y an
+entrepre ne
+tur key
+log ical
+lon g
+ar m
+ur s
+work ers
+ing ly
+gg s
+ri c
+tu al
+recei ve
+op ens
+ge ar
+soci al
+fe et
+c king
+ad ver
+fin an
+fe els
+sp la
+h r
+ea ster
+bra in
+ã ģ
+fi g
+le dge
+ne arly
+prote ct
+ma ssive
+e th
+aw a
+ðŁĺ ģ
+y rs
+aware ness
+defin itely
+k n
+imag ine
+k u
+syste ms
+ðŁij ı
+f as
+li k
+provi de
+am o
+disco ver
+inf lu
+ma ker
+g az
+fit ness
+stre et
+er s
+te d
+w c
+ys is
+pos itive
+hel ped
+que st
+andre w
+bra d
+b in
+hang ing
+l ing
+bri ght
+se ction
+ma ss
+ðŁĻ Į
+follow ers
+ho sting
+tem por
+fla g
+a ve
+let ter
+k ur
+re qui
+of ten
+cry p
+su ff
+âļ ½
+russi an
+treat ment
+al le
+ha y
+l an
+keep ing
+hol y
+power ful
+pre dic
+fun d
+e specially
+windo w
+je wel
+il y
+ðŁĴ ľ
+gener ation
+app a
+seri ously
+o d
+ðŁĺĤðŁĺĤ ðŁĺĤ
+cer ti
+iri sh
+ðŁij Į
+mi ami
+be th
+v ity
+se cu
+che f
+cri me
+graph y
+ma x
+arti sts
+re volu
+gu ard
+spee ch
+u c
+upd ates
+fac es
+st ant
+chang ed
+repor ts
+low er
+pe ar
+n c
+k il
+loo ked
+spe aker
+s f
+re spect
+ok ay
+oce an
+s itting
+architec ture
+tra il
+se at
+i ra
+le g
+japan ese
+d am
+u lar
+sw im
+polit ics
+finan cial
+ol d
+mou th
+at temp
+de stin
+fi shing
+atten tion
+me m
+chang es
+deci ded
+reli gi
+g in
+c av
+z z
+ad am
+ma c
+wr ite
+beg in
+sc ul
+al ter
+is s
+ath on
+imag es
+m oo
+jo ined
+ðŁĺ ī
+âŀ ¡ï¸ı
+pas sed
+mu sli
+h ir
+lar gest
+cam er
+com ic
+gh ted
+rug by
+bur gh
+gg ing
+te sting
+pre par
+lau gh
+al ed
+impro ve
+beli ev
+adv ice
+sha res
+he art
+tur ning
+s b
+t el
+caf e
+n es
+dani el
+pat ter
+t z
+se tt
+par k
+c and
+st ick
+happ ens
+bri an
+ne west
+e pic
+ad or
+ki es
+war ning
+anim als
+custo m
+ar c
+di an
+gol d
+cor e
+t f
+c ity
+pan ts
+re ality
+con fi
+in ju
+fo x
+gu il
+k new
+âĺ º
+cor rec
+itu de
+d den
+. #
+re duc
+pas s
+f on
+y a
+ow ner
+re turns
+n c
+e ast
+ap ol
+in sur
+th o
+si m
+juni or
+be e
+ang el
+att le
+elec tric
+hor ror
+cra sh
+e ye
+pat h
+sou thern
+emplo ye
+ge o
+t an
+ha z
+r ally
+ðŁı »
+proper ty
+was n
+enjo yed
+gre y
+g as
+bre w
+nor thern
+hol ding
+g p
+ta ke
+ch art
+ly n
+dr ama
+z o
+pa id
+throw back
+cu p
+discu ssion
+down town
+w ill
+le w
+b is
+t ary
+bre ad
+up on
+r ate
+teach ers
+it ation
+anc ed
+cy cle
+choo se
+d c
+ir an
+co w
+da ve
+ra ise
+prin cess
+fa ith
+- >
+indu stri
+sp ain
+guit ar
+fac ts
+m n
+sp en
+cour te
+go tt
+projec ts
+au di
+o sc
+pe ter
+s and
+intere st
+happ iness
+ven ue
+sol di
+surpri se
+poten tial
+per io
+custom er
+i i
+g ni
+manu fac
+e co
+bro ken
+sing er
+vel s
+wal es
+hu s
+in j
+f our
+tal ent
+d ying
+mat the
+fil m
+jo ining
+s ell
+j ar
+lma o
+sur ger
+bb c
+sour ces
+au stin
+ni k
+char les
+f am
+prin ci
+ange l
+cas h
+lo t
+o red
+pla ys
+pl ate
+don e
+memor y
+br ings
+n ba
+solu tions
+teach ing
+gr ace
+cir cu
+hel ps
+foun der
+mar y
+expl ore
+de cor
+par ts
+ch o
+inte gr
+ha u
+is es
+pu tting
+in er
+r it
+v y
+mic hel
+blu es
+every day
+for ms
+bi o
+ye ar
+p in
+t ter
+spr ing
+) )
+po t
+al ing
+perform ing
+sh an
+plan et
+mus ical
+head s
+it alian
+stru gg
+âĢį âĻ
+w ings
+pu mp
+h h
+tr ou
+a id
+pri me
+ear th
+pa int
+mon t
+am y
+bb c
+fab ulous
+fru it
+andro id
+bour ne
+cere mony
+enti al
+? ?
+deb ate
+on ing
+dra ft
+sol ar
+t x
+j am
+cor n
+!! !!!
+bro o
+mil k
+po sed
+o hi
+mo vement
+b ren
+part ner
+p g
+et te
+ar ies
+sh out
+n g
+leav ing
+t ells
+sen s
+ta ste
+kel ly
+wor l
+gy m
+ric h
+e gy
+pi d
+ma s
+â Ĥ
+courte sy
+fran k
+incre ase
+wr itten
+pp ers
+re l
+ha i
+s as
+s ound
+tt i
+w ich
+ri ver
+.. ."
+a g
+fel low
+ro me
+sm all
+gen cy
+ic an
+lux ury
+pro of
+me t
+wild life
+mom ents
+ra ther
+cor ner
+com pe
+canadi an
+lik ely
+therap y
+li am
+econom ic
+indi e
+rou te
+fi ght
+ho pe
+se tting
+ant ly
+cro ss
+fant asy
+de e
+sket ch
+comp li
+ym i
+ru les
+engine ering
+fig ure
+ro w
+. ,
+f w
+syd ney
+w ou
+t ation
+dre w
+us es
+the re
+sp read
+struc ture
+pat rick
+appa rently
+ro s
+h ills
+w we
+ann y
+com mission
+di v
+f ying
+con sul
+anal ysis
+ex i
+ten nis
+vehic le
+ðŁĺŃ ðŁĺŃ
+as s
+high ly
+op ened
+b ann
+ðŁĴ Ļ
+mp h
+wi shing
+v or
+fi f
+give away
+r r
+ra y
+je ss
+g at
+ic ymi
+x it
+high est
+yor k
+pi e
+invol ved
+high er
+ri e
+mal ay
+int elli
+desp ite
+che e
+sar ah
+be an
+reco gni
+ar sen
+tal ented
+pas sion
+ic h
+ab c
+lead s
+dise ase
+v is
+se c
+pre senting
+m illi
+hol e
+sho ts
+de part
+surger y
+gov t
+b in
+du al
+e vi
+lon ger
+ev ol
+scre en
+portra it
+et c
+lo se
+ch at
+p en
+p i
+om a
+s ick
+er c
+compan ies
+en try
+plan e
+gr y
+ven e
+liver pool
+premi ere
+sha red
+a red
+fil ms
+ir a
+holi days
+cric ket
+ici an
+v ing
+. )
+ul timate
+di vision
+con duc
+se pt
+for ces
+mon t
+s mart
+disa pp
+sun shine
+in d
+b less
+ma de
+col ors
+fran k
+ir on
+bott le
+s go
+m ood
+j ason
+er ic
+bir th
+te en
+respon se
+tar get
+state ment
+fe ar
+th el
+al um
+ar ab
+bl in
+direc tion
+ste ps
+er ial
+wor ked
+at l
+ðŁĴ ķ
+fel t
+pol i
+scen es
+hom es
+b ell
+e at
+ate ful
+t in
+l ace
+fol ks
+p se
+an n
+wis dom
+fa v
+but ter
+s r
+are as
+sm oo
+bi z
+dg es
+app o
+mo re
+the m
+effe ct
+windo ws
+sun ny
+cap ital
+tot ally
+c ities
+gr ant
+mb ers
+s low
+au tu
+il ities
+w ro
+ri sing
+st ics
+viol ence
+i gh
+qu ot
+h it
+t c
+herit age
+bu ff
+ne s
+z ar
+den tial
+ex ac
+ed ge
+de ep
+aren a
+be came
+benef its
+mar ks
+mb er
+a z
+am es
+pre ci
+dra gon
+re g
+d ings
+do s
+ðŁĴ ª
+n el
+s ity
+me al
+di st
+leg end
+pur chase
+pic al
+st ick
+f at
+du ba
+profe ss
+car to
+pro f
+coun tries
+respon si
+se qu
+fa b
+tribu te
+hon ored
+prac tic
+pur ple
+an ton
+pa red
+t ough
+summ er
+environ ment
+s ons
+ðŁĻ ı
+m ps
+gi es
+her oes
+t elling
+hen ry
+f en
+know ledge
+Ģ ï¸ı
+f r
+ne g
+u re
+ac king
+hear ts
+s oo
+hol lywood
+ju mp
+sau ce
+schedu le
+tur n
+yo ga
+cre ating
+c ket
+cre ek
+â Ń
+custom ers
+ma dri
+gu l
+asse mb
+moun t
+c ell
+to p
+st al
+dav is
+t wi
+sig n
+premi er
+iti ons
+he aring
+un k
+pati ents
+app ear
+heav en
+al ty
+doc tor
+a e
+plat form
+je ff
+ðŁĵ ·
+regi onal
+bi d
+box ing
+ex ten
+or ity
+a w
+w ise
+il le
+sever al
+bi e
+s itu
+sy ria
+âľ ħ
+remin der
+enter tain
+li on
+part ners
+in n
+ph ar
+f au
+pl s
+expe cted
+sug ar
+deci sion
+s b
+ch ron
+associ ation
+leav es
+vis ited
+sh ap
+ðŁĴ ĸ
+fur ther
+h ann
+w i
+run s
+l er
+fun ding
+fil led
+.. ....
+tin y
+han g
+or g
+co ol
+se min
+ðŁı Ĩ
+spon s
+nav y
+sa int
+dru g
+d al
+r oun
+co vered
+tra ditional
+invest ment
+de te
+al ism
+f low
+n is
+sun rise
+fe at
+f ted
+we ird
+je re
+ve gan
+medic ine
+an o
+ac cu
+deli very
+temp le
+chang ing
+wil son
+phili pp
+re fe
+n d
+is er
+g ay
+r and
+ati ves
+t ely
+p and
+intelli g
+g are
+am bas
+de mon
+commit tee
+strate gy
+refu ge
+bud get
+prote c
+pi er
+ex press
+nom in
+econom y
+al low
+ic on
+gal ax
+o h
+indi vi
+dem and
+vir gin
+lu ke
+ali sts
+man i
+s mi
+ju dge
+ent y
+mic hi
+resul t
+am ed
+spe aks
+' ,
+hou ston
+sh in
+b ing
+fl y
+ch em
+au to
+v as
+ge t
+ar m
+thank s
+d in
+gan g
+x x
+si on
+loc ated
+p l
+jo sh
+in fo
+jo ins
+adver ti
+ot d
+el d
+si e
+re asons
+v ent
+ðŁĩºðŁĩ ¸
+â ł
+convers ation
+stu di
+ðŁĶ¥ ðŁĶ¥
+go s
+s ounds
+un it
+mu sc
+ge l
+ack ed
+pac i
+co s
+de re
+u u
+a o
+la m
+inspir ing
+ar ms
+tw are
+mat ters
+ad dic
+du de
+ex t
+cri sis
+b ath
+me et
+sing h
+expe ct
+del hi
+resc ue
+wor st
+au g
+shi pping
+ser ving
+st o
+dar k
+ac es
+histor ic
+landsc ape
+desig ner
+b illion
+gr ateful
+wa ke
+e ve
+m iller
+hou sing
+dy nam
+is co
+be ha
+sh op
+pr ou
+e as
+a sia
+e ding
+k on
+depart ment
+aw ar
+mar ine
+in ci
+photograph er
+ta pe
+lo go
+r ings
+d it
+-- --
+vin yl
+w c
+vo ting
+se ven
+ambas sad
+dal las
+t u
+com ment
+k ra
+b les
+w ag
+u d
+au dio
+stri ke
+offici al
+o ts
+me tho
+to ols
+ra di
+al an
+hun t
+wat ched
+a ke
+fa ke
+drin king
+mer ry
+m l
+b day
+ri o
+ni ke
+c ant
+re pe
+co stu
+mur der
+ak ers
+ch ers
+ou ts
+beg inning
+so s
+ad es
+n in
+not es
+wro te
+sol o
+c i
+li ghting
+ur ban
+bre xit
+att end
+shir ts
+pla yo
+ac tress
+pl ic
+stand ard
+quot es
+par ade
+anci ent
+Â ©
+tur ing
+re e
+pri mary
+fla sh
+citi z
+mat es
+ste in
+z i
+clin ton
+sk in
+gen e
+hu m
+g ar
+t le
+y i
+fo cu
+de an
+pl ants
+cy ber
+b u
+om e
+ho p
+ad dress
+ti x
+gi fts
+relation ship
+sub scri
+fe ed
+exac tly
+haw ks
+ex o
+stre ss
+s n
+arre sted
+an e
+sof tware
+z ero
+the me
+mu mb
+im migr
+mi a
+make up
+ple asure
+uni vers
+har b
+eng ine
+ap er
+r in
+br a
+institu te
+le ather
+al th
+sing ing
+co s
+gh ty
+me as
+st ic
+si de
+insur ance
+co t
+pit ch
+moun tains
+cri min
+su pre
+valent ine
+at er
+wou ldn
+sc ale
+rel ated
+re gar
+star tup
+pack ed
+mi ke
+week ly
+p ts
+coun t
+ha r
+gott en
+min d
+ber lin
+con ditions
+swit ch
+cor n
+sa ve
+g li
+emer gency
+tun ed
+sto ck
+discu ssing
+every body
+s day
+whe ther
+wrest ling
+ec es
+gen der
+ch en
+ðŁij Ģ
+madri d
+mar athon
+e gg
+i er
+th x
+as king
+kore a
+wol f
+ay a
+g m
+g au
+at ory
+v r
+gra ss
+k illing
+b ble
+ur o
+un i
+e th
+sh ore
+th en
+re ale
+bot tom
+ex erc
+k ar
+or ies
+ad ri
+san ds
+se x
+. '
+volunte ers
+per form
+par liam
+inclu de
+deli ghted
+execu tive
+fu el
+kis s
+ã ħ
+char ge
+h u
+ca kes
+ve t
+g lu
+agre e
+pr ices
+n au
+h l
+g ru
+ra j
+streng th
+b ic
+sp ending
+al es
+av en
+b last
+: (
+yo f
+nor mal
+si x
+qu ick
+se a
+d aw
+mee ts
+lo vers
+upd ated
+po tat
+comple ted
+coo k
+opportun ities
+p ure
+organ ic
+tem per
+c am
+avo id
+par king
+duba i
+and o
+di stri
+to y
+comple tely
+don ald
+tri al
+bas s
+b oun
+back ground
+v as
+mar vel
+lu m
+ru s
+t ool
+com missi
+throw back
+fin ding
+is lam
+! ?
+st op
+e vil
+or al
+resi dents
+i denti
+o ak
+ðŁİ ¶
+l il
+span ish
+chap ter
+sto pped
+direc t
+ho sted
+pic ked
+lab our
+lew is
+defen se
+à ®
+health care
+wh is
+mat h
+pe ak
+ra ised
+fi x
+bu ll
+th ir
+chel sea
+fol k
+tr e
+can di
+pau l
+ei ther
+ad am
+poe try
+jewel ry
+ðŁ ¦
+pr ay
+Ø §
+g c
+o z
+wi shes
+fore ign
+sun g
+lear ned
+en e
+n ing
+micha el
+illu stration
+legend ary
+w av
+b au
+ðŁļ ¨
+cal end
+stre ets
+â Ĩ
+mon ster
+bu ck
+g r
+scho ol
+ba th
+wa ste
+ne ck
+ha wa
+be ach
+re plac
+jec t
+on er
+fac tory
+coun t
+ðŁĵ ¸
+mor gan
+der ing
+se an
+steph en
+de p
+no vel
+vide os
+ic al
+press ure
+arsen al
+ex pre
+ir s
+tren ding
+ss a
+fla sh
+re sear
+thr ough
+profess or
+scul p
+to s
+gg ed
+mm a
+be e
+a pe
+hun ter
+am i
+he i
+pla stic
+bu cks
+uni verse
+le gen
+niger ia
+ple ased
+ri s
+thin ks
+autu mn
+i ds
+d is
+anth ony
+ðŁı ½
+ak ed
+gla sses
+fin ance
+z er
+k as
+con tract
+nu mbers
+sh aw
+partner ship
+t il
+laun ched
+s al
+victor ia
+theat er
+usu al
+nam es
+perio d
+eli za
+i th
+bar cel
+ro cks
+bag s
+mat e
+distri bu
+j on
+di ffic
+ali zed
+cur ren
+sco red
+b ha
+du blin
+ro se
+in ted
+soli d
+beha vi
+wal ker
+simp ly
+garden s
+head ed
+in i
+ohi o
+we ap
+f o
+gl en
+e state
+ran dom
+th under
+thr u
+k ill
+jac ket
+it i
+entertain ment
+thanks giving
+ent al
+en coura
+el o
+a ther
+tan k
+high lights
+f ting
+ru le
+model s
+bor der
+bj p
+hus band
+in done
+ken ya
+be ars
+al o
+n inten
+pi x
+str o
+or ders
+sal ad
+ro ads
+n or
+l ation
+sop hi
+ðŁı ¼
+pi eces
+b one
+min s
+inclu des
+nu tr
+phi l
+s ent
+fun dra
+ga in
+bor ough
+n ad
+mon day
+activ ity
+it ems
+be coming
+ken ne
+de tro
+car di
+gue sts
+u x
+world wide
+sever e
+new s
+thank ful
+fic tion
+ve ge
+m all
+si an
+er al
+inj ury
+le e
+men u
+danc ing
+scot ti
+exam ple
+( #
+na i
+studi os
+ba i
+ðŁĴ Ľ
+j av
+diam ond
+vin ce
+ric k
+prote ction
+lin col
+cham ps
+appro ach
+d ar
+m ile
+clou ds
+je ff
+in fin
+l ers
+p les
+pe ace
+go p
+âĻ ¡
+tech n
+str a
+a verage
+ef fort
+introduc ing
+di versity
+austr alian
+am p
+boo st
+s ke
+pati ent
+appreci ate
+ici ans
+pu r
+f ell
+woo ds
+illu str
+ðŁ ĸ
+ag ency
+ac tions
+brit ain
+under way
+se attle
+el and
+ag o
+f ill
+stre aming
+pro test
+challeng es
+ky o
+et sy
+coo king
+exper t
+ru ss
+rain bow
+commer cial
+sp in
+be ats
+c ry
+val u
+el i
+th row
+gr ams
+le vels
+michi gan
+c ad
+ador able
+const itu
+w s
+pu b
+mid night
+th at
+net fli
+braz il
+die go
+regu lar
+jo y
+âĤ ¬
+li qu
+ea stern
+k ni
+fl at
+n p
+bro wn
+w er
+se y
+tt ers
+ac ting
+v anc
+cy cling
+program me
+ra w
+comple x
+tat too
+throwback thursday
+se ssions
+ro oms
+si ght
+speci es
+bom b
+lau gh
+ke eps
+mo on
+offic ers
+con ver
+t r
+ha sh
+t ack
+ri ous
+ad ap
+a j
+reco gn
+ex po
+sug ge
+confir med
+rol ling
+dre ssing
+ic t
+fri day
+ph ones
+ri dge
+con cept
+ro y
+ke ys
+ef for
+c ate
+k ne
+ev en
+l ay
+commun ities
+mo d
+n az
+every where
+al ab
+bit coin
+ban ks
+out door
+feder al
+sto res
+h p
+c al
+m ely
+sig nific
+be ar
+re public
+clo ser
+al lah
+pic k
+x d
+pal ace
+ch ill
+b am
+er ous
+un a
+al len
+out standing
+olym pic
+supp ly
+fi gu
+v au
+l p
+char lie
+un es
+> >>
+legen ds
+ici al
+co ast
+benef it
+mul ti
+f its
+far mers
+am ount
+si sters
+har ve
+hon ey
+que en
+b ers
+pl ann
+âŃ IJ
+m u
+barcel ona
+al ber
+stat us
+re main
+ex tra
+c andy
+vi ous
+âľ Į
+o v
+warri ors
+-- >
+ju mp
+am ar
+x mas
+stu dies
+i ors
+k or
+don ate
+pre p
+fi sh
+im a
+pain ted
+ad mini
+co splay
+spor ts
+dro ps
+fi ghter
+evi dence
+ðŁĴ ª
+la ke
+ro b
+cine ma
+pro file
+Ã ±
+stan ds
+leg acy
+sh ape
+ro of
+ci vil
+i ans
+sy l
+sh am
+vo ted
+re tail
+ph illi
+li sted
+du ty
+n b
+th es
+f are
+au ction
+ffici al
+stor ms
+d p
+l oun
+sh ops
+al y
+ani me
+multi ple
+ðŁĺį ðŁĺį
+psy cho
+je an
+ap art
+candi date
+gg y
+con f
+jose ph
+w ick
+me at
+fr ame
+c l
+for got
+ph y
+f ing
+li ed
+re p
+se ed
+f all
+u fc
+nu t
+lin d
+mo de
+fiel ds
+en ce
+s ley
+ðŁ¤ Ķ
+ch ill
+follow ed
+announ ces
+cor ru
+tro phy
+them selves
+ac le
+al du
+k ong
+l on
+s v
+bro ke
+ander son
+ta i
+stor y
+tempor ary
+activ ities
+k ati
+ari z
+cry stal
+spo ke
+extre mely
+tra ding
+ðŁĴ ļ
+Ã ¼
+in ch
+ed in
+out fit
+equ ip
+ma di
+form ed
+be ef
+po p
+ti ger
+this day
+ti red
+neigh b
+re tro
+is a
+un t
+t as
+kan sas
+de st
+secon ds
+ta y
+hur ric
+o u
+galax y
+dad dy
+bro w
+bur ger
+en ced
+de sk
+ac cur
+secre tary
+el ite
+k ab
+ch in
+touri sm
+bud dy
+ici de
+dre ssed
+u d
+vac ation
+che ers
+com for
+charac ters
+j et
+bu ying
+l ins
+n ap
+reale state
+li e
+af c
+i ii
+f ame
+n r
+b at
+ag ent
+ma kers
+âĢ ¼
+sec tor
+op ti
+le on
+di et
+pra yer
+hi p
+mi r
+le x
+br y
+an a
+pas sing
+w en
+reco very
+ak i
+po pul
+res ort
+mar ia
+stu ck
+read s
+ti er
+perfe c
+netfli x
+p oo
+cham p
+o c
+re duce
+we red
+comm ents
+cla im
+acci dent
+s ag
+h ack
+sal t
+kin da
+k iller
+i os
+z y
+ex change
+lec ture
+eng er
+ic king
+t au
+reve als
+pri son
+z om
+gh an
+u l
+jour nal
+i ot
+tr in
+jon a
+govern or
+cap e
+quar ter
+spec tive
+impre ssive
+bab ies
+t x
+m ill
+o y
+har ri
+jo int
+su e
+collabor ation
+tren d
+revolu tion
+re new
+alum ni
+ge tt
+sh ell
+sun day
+ent u
+ni c
+donald trump
+block chain
+paci fic
+expla ins
+sp y
+ad voc
+par adi
+to f
+star ring
+p av
+fe ed
+br ac
+smo ke
+ham p
+y am
+to kyo
+si mon
+d h
+e ffici
+phys ical
+n j
+ell i
+s low
+gradu ate
+americ ans
+ti fy
+f red
+ap ore
+fin ds
+rob in
+we t
+not ice
+se mi
+un ve
+k om
+pil ot
+scre ening
+da ily
+ðŁĴ Ĺ
+roy al
+sp a
+vo tes
+n ag
+wh ate
+att ending
+exper im
+ad dition
+k ate
+sto l
+m ali
+foo t
+chri st
+ch an
+de e
+lic en
+glo bal
+mo ore
+ti a
+bri gh
+myster y
+y ay
+âĿ¤ï¸ı âĿ¤ï¸ı
+cre ati
+me chan
+clo ck
+di c
+âĢ Ķ
+pp er
+al ph
+through out
+al low
+re sources
+selec tion
+ham il
+bb q
+aa aa
+virgin ia
+dis ney
+en g
+so red
+drin ks
+f ancy
+consi der
+end a
+jan e
+hand made
+du l
+on tari
+i us
+s ville
+color ado
+whate ver
+whe el
+promis e
+ne ver
+desig ns
+ab ly
+sex ual
+vanc ou
+at i
+con vention
+cul tural
+sing apore
+pro mo
+load ed
+gla sgo
+pp l
+n oo
+ke e
+ste m
+men tion
+i do
+cru ise
+ri ding
+be comes
+be y
+âļ½ ï¸ı
+tw in
+dedic ated
+na sh
+de si
+work out
+jen ni
+i v
+grou ps
+rela x
+pho eni
+li ft
+mix ed
+m ck
+p c
+mu st
+me tro
+ci es
+y ar
+a im
+ang er
+i e
+rec y
+marri ed
+dro pped
+eng ag
+le st
+ambassad or
+op h
+de s
+w ick
+assi stant
+nat ur
+fa il
+l td
+shor t
+k ap
+sha w
+bi gger
+rema ins
+crit ical
+sur vey
+co verage
+er son
+win d
+n b
+bil ly
+let es
+ac ts
+jim my
+at lan
+al and
+t c
+import ance
+dam age
+f g
+stor age
+tw t
+bon d
+bal ance
+cr ying
+pu ppy
+vo te
+pu sh
+ðŁĴ ľ
+pol y
+me l
+lon don
+terr ori
+effec tive
+corpor ate
+atl anta
+jac o
+nas a
+gre ek
+sen ate
+i sh
+ev a
+intellig ence
+effor ts
+al co
+k un
+h all
+di ag
+claim s
+fir st
+h b
+ba e
+v ul
+pu ll
+Â °
+se par
+spe ed
+vic ti
+on thisday
+audi ence
+r ates
+te ach
+fil ming
+bu sh
+son g
+y um
+br un
+ra ine
+aw a
+par ks
+ð Ŀ
+ra bb
+ra ch
+ra id
+reach ed
+ra il
+mo ves
+selec ted
+fr i
+ra ising
+om y
+st ones
+su k
+franc isco
+cas es
+cap it
+con fu
+w tf
+po ke
+equip ment
+gre g
+ess ential
+off ering
+ne x
+pi es
+be c
+cre ation
+chair man
+cro wn
+w al
+john ny
+shi ft
+ne ck
+ban g
+bir d
+ðŁĺ ı
+du ck
+re serve
+de pu
+ma sters
+over all
+no tic
+ju ice
+sne ak
+che er
+cla sses
+eag les
+n ca
+car pet
+ci vil
+coach es
+har ris
+u ps
+b alls
+dec or
+mar tin
+ro s
+v ice
+announ cement
+who se
+ti gers
+ste red
+c ts
+dr am
+ste el
+youn g
+inst all
+supp o
+recor ding
+de ck
+se ats
+l der
+ang le
+bo t
+sty les
+elec tions
+for tun
+n ab
+but ter
+ari an
+ka sh
+in ner
+ou red
+be ast
+we i
+ic onic
+exper ts
+ne cess
+b eng
+jam es
+li a
+gre ece
+ðŁĵ ·
+ðŁĺ ģ
+good bye
+m itch
+tw ice
+mumb ai
+ste am
+ru sh
+med al
+ne tt
+fashi on
+t ar
+r s
+sav ing
+ric ul
+l m
+sleep ing
+brook lyn
+mis s
+sen ding
+disco vered
+sp here
+of theday
+k icks
+missi ons
+w right
+er n
+ght ly
+i ous
+mel bourne
+star tu
+mo ved
+car ry
+d ak
+ag ues
+bel gi
+e ma
+way ne
+do t
+er ie
+pe l
+it unes
+matthe w
+no body
+est ab
+cal m
+win ds
+lu c
+prep are
+tren ds
+exerc ise
+adv ant
+ðŁĴ ¯
+athle tics
+app s
+c tions
+adv ance
+laun ches
+litt le
+real donaldtrump
+eliza beth
+carol ina
+hu b
+hi dden
+n w
+us er
+pol l
+great er
+mo st
+f ed
+p at
+life style
+s ati
+sco res
+marri age
+l r
+aven ue
+de serve
+ri f
+ðŁ Ĺ
+wat ch
+champion ships
+gr ay
+en ni
+cot ton
+g om
+whe re
+pack age
+su m
+ab solu
+new ly
+foo ds
+ty ler
+assemb ly
+musli m
+ban k
+re memb
+op tions
+produc er
+land o
+fun ds
+u pper
+shad ow
+pro gre
+co p
+ing e
+leg s
+detro it
+hill ary
+jo se
+gi ants
+sou p
+sustain able
+t us
+clo thes
+roc king
+n z
+min ne
+mat eri
+bru ce
+ear t
+ca sting
+independ ent
+thou sands
+ta h
+de cl
+veter ans
+li ons
+wra p
+âĢ ¦
+de ss
+bl ing
+st ine
+e ggs
+o on
+clo sing
+z ay
+at t
+bac on
+fa il
+ariz ona
+de pre
+gho st
+new sp
+w ers
+vi p
+li ked
+id ent
+volunte er
+ad ult
+pu pp
+cir cle
+mat erial
+degre e
+gro wn
+boo m
+calend ar
+su r
+vie wing
+ath letes
+ch and
+re ll
+asi an
+en tr
+vol ley
+victi ms
+bo dy
+m ama
+trans fer
+ge ek
+in dic
+sav ed
+ma i
+g ent
+it s
+loun ge
+k ol
+the ory
+situ ation
+is lands
+ar th
+z oo
+floo d
+vi ously
+show ed
+parliam ent
+ch ev
+el ine
+at trac
+ab ad
+ta il
+h rs
+lu s
+por tu
+gor y
+provi des
+to ys
+de ath
+in fe
+an ce
+g le
+li am
+lo ver
+hu d
+dv d
+reve aled
+g w
+re ment
+ca the
+l ying
+ra dio
+der by
+stor s
+che mi
+hosp it
+âľ ¨
+' :
+ilo ve
+le mon
+re public
+s ni
+ne ss
+do or
+re action
+pre gn
+fla v
+schol ar
+spo tify
+is ation
+vis ual
+aw are
+spon sored
+jo ke
+less ons
+leg is
+lo ck
+si mil
+ðŁĺ ĭ
+kin d
+la y
+ma h
+ho ping
+vancou ver
+as er
+clean ing
+gal a
+thre at
+la p
+ach e
+ro mance
+ex pen
+re post
+z am
+e pi
+mir ror
+o ak
+ad ul
+bat man
+s lu
+l c
+vie wed
+re views
+d ates
+indone sia
+acti vi
+off en
+lea f
+i si
+ag ricul
+costu me
+s ites
+spir itu
+appear ance
+ir y
+st air
+applic ation
+spec tac
+ic ity
+ski es
+hand le
+pun k
+paradi se
+t n
+de al
+provi ding
+do c
+recei ving
+bre w
+micro soft
+Ã ¶
+fer r
+me tro
+th ail
+y um
+car ter
+Ã ¡
+gent le
+bre aks
+coo per
+show case
+cu tting
+egy pt
+bab y
+semin ar
+gl ori
+ss on
+fa ve
+re hear
+lo tte
+la dy
+al as
+pre p
+deli vered
+nu clear
+ir o
+engag ement
+at ta
+con ven
+z an
+gl ory
+hol ds
+busine sses
+str ange
+sch e
+it self
+gra d
+mar kets
+f alling
+st ats
+ge on
+bu dd
+li s
+she et
+thi si
+co lo
+deser t
+regi stration
+ig n
+expla in
+inter ior
+la ws
+writ ers
+spr ings
+k r
+fri ed
+blo om
+inf ra
+a o
+cre d
+pa st
+line up
+bo o
+bre a
+boo ts
+celebr ity
+att acks
+bro ok
+ev es
+ex cu
+cher ry
+oo p
+fas cin
+boy friend
+se as
+n ine
+effec ts
+po wered
+k ha
+ðŁĺ Ģ
+sh out
+con dition
+i j
+her o
+enter pri
+win ter
+applic ations
+sho e
+g el
+batt le
+pro grams
+w art
+ðŁĴ ¥
+ra p
+ho l
+dang erous
+di a
+coun ter
+ric s
+i or
+k night
+co at
+emo tional
+at ures
+d as
+whe el
+fore cast
+tran sport
+glasgo w
+king dom
+prepar ing
+im medi
+ff in
+awar ded
+prin ting
+ro man
+fight ers
+any more
+bel t
+p ine
+win e
+x i
+employe es
+logi es
+al led
+de mo
+birth day
+ange les
+lo g
+dri vers
+neck lace
+k ath
+s it
+athle te
+ef s
+s burg
+pur pose
+resi stance
+rele ases
+t is
+vari ous
+deli ver
+ch al
+s anc
+opp o
+cra w
+neu ro
+dr a
+suppor ters
+sna p
+diffic ult
+swe ar
+logi st
+pa th
+attemp t
+à ¥
+swim ming
+ste ve
+hur t
+inclu ded
+b ap
+wa re
+ðŁĴ ĭ
+end ers
+ja ke
+le eds
+cli mb
+l b
+im ple
+li sa
+clo thing
+ðŁĺ İ
+d t
+com pla
+sw ing
+stra w
+v als
+k le
+us ers
+stor m
+cu ts
+ontari o
+p an
+hand some
+i ow
+ar gu
+chec king
+scotti sh
+Ķ ï¸ı
+si er
+em ma
+po d
+patter n
+de sh
+en h
+ed ward
+t ing
+k h
+hal f
+lincol n
+mo ther
+al leg
+r c
+volley ball
+d n
+g ay
+all y
+le ton
+gro ve
+l oud
+adv anced
+re spec
+cli ent
+supre me
+thail and
+ho w
+gi g
+to i
+do t
+dol lar
+ðŁij ĩ
+p it
+r b
+h n
+produc ed
+gg ers
+âĨ Ĵ
+ml b
+can vas
+fin eart
+us d
+in the
+p son
+actu al
+s l
+t b
+ip ad
+en sure
+u mb
+w d
+sk a
+mar s
+k end
+f eli
+th ing
+count down
+absolu te
+r out
+dra l
+p y
+inju red
+min t
+hun ting
+mm er
+s age
+li gh
+ac ity
+ex pan
+mur ray
+ar o
+sec ure
+four th
+eag le
+reli ef
+st akes
+industri al
+clar k
+under standing
+see m
+pl enty
+sil ver
+cla u
+thre at
+sa il
+pro duce
+ab str
+is is
+b r
+eng ers
+wor ry
+bie ber
+s j
+just in
+reali ze
+ky le
+esp n
+fil ter
+s ch
+ty pes
+game dev
+d ing
+twit ter
+soldi ers
+p om
+car bon
+y ards
+child hood
+ri ed
+ke l
+ele ph
+t ons
+key note
+qui et
+wi re
+po sting
+is sa
+repre senting
+bac ks
+alex ander
+celebr ates
+ta ining
+| |
+ch or
+esc ape
+pe ek
+ti ves
+fiel d
+ssi e
+im pac
+spons or
+r c
+we dd
+cann ab
+si des
+trac ks
+com par
+con trac
+techn ical
+bi ble
+expl oring
+sh are
+tra v
+n ate
+ill o
+sc ru
+m ingham
+gun s
+of the
+sh ame
+se es
+ca tho
+ac cess
+ce l
+repor ted
+Â »
+mari o
+p ad
+hope fully
+ou se
+y on
+disapp o
+ol o
+p itt
+pa c
+ga p
+cru sh
+s g
+k le
+ge m
+emp ire
+dir ty
+a is
+avi ation
+ze aland
+fac ing
+high way
+d anny
+spi der
+ot ta
+ðŁĺ Ħ
+w y
+col ours
+in fl
+co sts
+olym pics
+au s
+h m
+ho ward
+pas ses
+lau ren
+mu sh
+op in
+r ho
+disc ount
+oper ation
+em ily
+mm m
+cham ber
+d il
+to yo
+shi p
+sam u
+pic tured
+un ic
+po l
+keep er
+carto on
+st en
+ig nor
+n ations
+n l
+ta sting
+deta il
+offici als
+mo tor
+franc is
+ed itor
+ðŁij ĩ
+pe ts
+rang ers
+t g
+r n
+w ri
+nic hol
+i se
+spo ts
+ani e
+chec k
+tri ple
+ku mar
+spe akers
+ic ing
+pre pared
+ab use
+friend ship
+mon th
+swi m
+air e
+sc ent
+hamil ton
+indi an
+j es
+yum my
+te ars
+da wn
+i zed
+worl ds
+ðŁ ķ
+b illi
+st one
+n hs
+ba sic
+p or
+st le
+ir on
+ol der
+cle vel
+e ing
+ðŁĺįðŁĺį ðŁĺį
+prin ts
+fir m
+air craft
+fin est
+devel op
+aar on
+t z
+gra ham
+own ers
+fo li
+less on
+qu es
+bab e
+cra ft
+ph en
+ju n
+bir mingham
+v ine
+ll er
+i an
+fineart america
+evol u
+st ab
+im per
+war d
+com ic
+wi z
+inv ited
+du ke
+mat ch
+por ts
+ro ger
+diag no
+ke pt
+te st
+vis u
+r hy
+so c
+to x
+b aker
+sur face
+co vers
+man s
+b its
+x box
+ff le
+n an
+gar d
+h art
+wat ers
+v illa
+re tro
+light ning
+catho lic
+democr acy
+neigh bor
+pen n
+cr an
+jona than
+la ura
+vi bes
+su b
+coach ing
+clear ly
+uk raine
+bra ve
+commit ment
+t all
+mar t
+ra p
+mo di
+sco tt
+bro s
+show er
+ðŁı ¾
+âĺº ï¸ı
+cou sin
+appro ach
+br e
+com pos
+hil ari
+phil ly
+g ad
+quick ly
+ri an
+t m
+vir tual
+hou ses
+k t
+phoeni x
+w ire
+ff y
+b unch
+anc ing
+tal e
+snap chat
+star ter
+h t
+k icking
+ap art
+th y
+) !
+blo gger
+it z
+com fort
+ang els
+w ash
+" :
+ar gent
+re quest
+hon est
+mi ghty
+bo bby
+k g
+ro l
+thou se
+ex po
+h c
+tab les
+mag ical
+po sts
+de m
+n w
+or lando
+ab er
+* **
+ðŁĺ ľ
+environ mental
+trans formation
+mi le
+w ic
+hir ing
+ma ine
+bo ar
+r ying
+ti s
+nit ure
+twee ted
+anton io
+opin ion
+fin ale
+di y
+f is
+th in
+trou ble
+le go
+fi les
+qu art
+sp a
+curren cy
+cli mate
+fan art
+rail way
+sp ace
+ban ds
+dani el
+mo tion
+l eng
+hol der
+oc cu
+mar ie
+cathe dral
+bu zz
+bi es
+nas car
+bm w
+bat tery
+char lotte
+doc tor
+zz le
+se ven
+in san
+d dy
+st en
+lab or
+thr illed
+se ren
+docu mentary
+wav es
+cer tain
+can did
+allow ed
+ninten do
+star wars
+ta p
+home made
+d les
+ther ing
+bre e
+emp ty
+pi ano
+pos iti
+coun try
+por k
+pu ts
+per ry
+m atic
+spot light
+ti st
+or ities
+we alth
+c p
+bar bar
+commit ted
+as sau
+pro fit
+e ight
+hu l
+fini shing
+run ner
+ss o
+insp ec
+char ged
+christ op
+lo sing
+co al
+ho o
+ele v
+de le
+mo ham
+don ation
+c able
+clin ic
+j in
+manag ed
+ter ing
+â ¬
+ur ban
+depu ty
+bb er
+bur n
+acade mic
+o tt
+sta ke
+it er
+sto wn
+ack er
+advent ures
+ad ams
+gre g
+pro m
+vo l
+ac qu
+con gre
+pa int
+citiz ens
+c all
+af ford
+v c
+as ks
+the tic
+independ ence
+â Ľ
+h itting
+bl on
+fu ture
+â ı
+in no
+gen e
+bo ards
+di stance
+se t
+re mem
+th al
+pre vent
+l ang
+ob jec
+su sp
+mat t
+in duc
+bor o
+pi one
+re di
+vir tu
+prin ted
+sco pe
+shar k
+suc ce
+a stron
+il legal
+j ag
+c ting
+ine e
+at o
+rob in
+nutr ition
+b f
+du tch
+b n
+fur niture
+for gotten
+at ar
+ru p
+hy per
+bran ch
+communic ation
+degre es
+on ia
+un cle
+promo te
+or che
+wi i
+j s
+but ton
+ma jor
+c bs
+bri stol
+premi um
+ordin ary
+e dit
+m g
+we ed
+st even
+: '
+gu s
+te s
+cap tured
+dru gs
+do w
+wr ites
+bi shop
+whe els
+ali zation
+disco very
+w r
+rach el
+ne il
+hy dr
+cu test
+entreprene ur
+kore an
+ore gon
+ul ty
+perfec tly
+suppor ted
+histor ical
+t wins
+ell y
+we l
+de vil
+in come
+scienti sts
+de leg
+h en
+on i
+ic ed
+gi o
+cur ry
+reve al
+e g
+buff alo
+n ol
+op era
+camer on
+haha haha
+j ab
+gradu ation
+cra ig
+r al
+i f
+organi zation
+le ge
+g ang
+su d
+edin burgh
+l ack
+fli es
+g ate
+thr ones
+q b
+the real
+e leg
+pp in
+c les
+jam ie
+tn am
+cryp to
+ou l
+p ages
+a se
+roo ts
+stu pid
+a did
+boo t
+prote in
+s ap
+si um
+su s
+end or
+fun ction
+don t
+en na
+ch y
+squ e
+wor ker
+m tv
+e a
+k an
+ðŁĴ ļ
+mu s
+professi on
+t to
+oper ations
+al lo
+c tor
+inv ite
+sc and
+ou th
+z im
+lin ks
+cli ents
+sam sung
+discu sses
+n ell
+ul tra
+some where
+ste wart
+ine t
+de z
+b out
+fac tor
+ti an
+tr ans
+jere my
+d b
+ðŁĩ ¬
+or n
+develop ing
+spo l
+coo per
+ma u
+rememb ering
+tre k
+famil y
+sen iors
+fo ster
+att ended
+w ing
+trans form
+ele mentary
+hor iz
+li sting
+malay sia
+it ch
+warri or
+philipp ines
+russ ell
+m end
+initi ative
+cre ep
+to ps
+br iti
+a ur
+shar p
+adverti sing
+ug ly
+achi ev
+materi als
+bu g
+dev ice
+bon us
+fac ility
+col e
+nh l
+y as
+plann ed
+pol e
+excell ence
+tr ick
+con fl
+r p
+achi eve
+lo an
+swa g
+jess ica
+ho we
+p our
+sc u
+z oo
+r ated
+dre sses
+re bel
+mex ican
+co ordin
+me ss
+atlan tic
+t l
+osc ar
+wal ks
+phar mac
+investig ation
+... #
+cc i
+eas ily
+monday motivation
+y ment
+au ti
+for ced
+ar med
+colle agues
+pap ers
+pro per
+sha ke
+bu c
+le an
+exhi bit
+e vement
+co tt
+bi z
+sp er
+k ent
+sw an
+/ @
+girl friend
+haw k
+âĺ Ģï¸ı
+mon o
+ðŁĴ Ľ
+stat ue
+ðŁĺ ³
+ra s
+te eth
+preci ous
+t ile
+p am
+swi ft
+v ali
+no se
+dr unk
+experi ences
+come back
+gen ius
+wor se
+sh ef
+ra d
+ed it
+hon our
+au spol
+lar ry
+h ire
+gor don
+achi evement
+.... ....
+su icide
+alter native
+su p
+sur roun
+sha ke
+ke ith
+pe pper
+tur k
+crimin al
+be ck
+su m
+w alls
+cn n
+an tic
+of fe
+col li
+win es
+high light
+hawa ii
+emb ar
+l fc
+ðŁĩ ®
+m v
+> >
+at mo
+wor d
+car l
+shout out
+bre wing
+ì Ŀ
+do f
+s ic
+hot test
+col on
+hh h
+shu t
+low ing
+volu me
+apart ment
+agre ement
+de stro
+we e
+religi ous
+iow a
+ro d
+land ing
+re present
+ðŁĵ· :
+la s
+usu ally
+h l
+c ac
+sal v
+al ong
+laugh ing
+be ans
+remin ds
+pha se
+some body
+ma sk
+ran ked
+dest roy
+sc i
+â̼ ï¸ı
+gab ri
+le o
+ro a
+fa iled
+si l
+refuge es
+re vi
+r ing
+ber ries
+coo kies
+y y
+conserv ation
+sh ab
+human s
+de termin
+a in
+ni all
+as su
+mb a
+fro m
+extre me
+vic es
+commer ce
+ght ful
+or dered
+suppor ts
+re cap
+v or
+dro pping
+correc t
+pay ing
+mean ing
+n j
+qui z
+" #
+busine ss
+ðŁĩ® ðŁĩ
+indi gen
+du st
+box es
+bl ind
+x xx
+zz y
+ðŁĩ¬ ðŁĩ
+ss els
+s ant
+dd le
+hilari ous
+desig n
+wonder ing
+vehic les
+k re
+ju d
+rece ption
+par ker
+Ã Ń
+pri vi
+hy dro
+sof tball
+pol lu
+lo cked
+ba h
+e ar
+scri pt
+di vi
+br ace
+geor ge
+the ast
+bel o
+j al
+tion ary
+dent al
+roc ket
+pur ch
+sh ak
+manufac turing
+e z
+it is
+con cep
+tb all
+ch s
+direc ted
+pra yers
+oo k
+phil os
+vari ety
+che ss
+ser ver
+g and
+bal ti
+ðŁĵ ¸
+sel y
+cru z
+spectac ular
+bur ning
+re present
+i z
+t one
+mer ce
+h ell
+bed room
+estab li
+bo l
+com mon
+ãĥ »
+ab or
+kit ty
+hei ghts
+re pair
+willi am
+qu ake
+alab ama
+popul ation
+re v
+re tt
+i sts
+n ite
+le m
+a ha
+clevel and
+r m
+po ver
+ob se
+mon tre
+man ia
+Â ®
+con ne
+car ni
+sh ah
+f y
+u a
+sc or
+strugg le
+bo b
+' '
+appro pri
+deci de
+ff ed
+ca ster
+s ort
+hun gry
+dra g
+ا Ù
+gr ounds
+d w
+sli ghtly
+car din
+dead line
+bron ze
+web in
+bar ry
+sil ence
+e uro
+op tion
+ear n
+ðŁĴ ĸ
+howe ver
+na ren
+na ils
+bath room
+v ine
+ph d
+min ing
+gar age
+( )
+shou lder
+defe at
+di r
+o v
+liber ty
+ple as
+x on
+com pre
+a v
+j in
+ab les
+sil ent
+fam ili
+vis its
+di pl
+ha bit
+milli ons
+regar ding
+innov ative
+sen ator
+r ts
+v on
+k l
+wh il
+requi red
+âĿ Ħ
+lu v
+presi dential
+po cket
+hun dre
+sho wn
+fro zen
+to ward
+fa st
+confi dence
+r ough
+indivi dual
+qu et
+ðŁı ½
+dom e
+fi fa
+engine er
+z en
+re mix
+ðŁĺ ĥ
+pl ant
+min or
+robin son
+as y
+pul led
+cer tain
+potat o
+( :
+pre s
+oc ca
+w it
+it em
+si e
+d ating
+thom pson
+own ed
+an u
+vi e
+te dly
+good night
+ex cept
+ðŁĮ Ł
+ira q
+ki e
+ren ces
+li p
+simil ar
+sau di
+vi g
+arth ur
+pic ks
+mil an
+hon da
+ma xi
+o g
+ste st
+ar ch
+analy tics
+ba sti
+pear l
+ter ry
+hor se
+ast ro
+ac ce
+laun ching
+inter national
+s no
+ta sty
+den ver
+ir l
+pe te
+tor n
+advant age
+var sity
+" "
+sol e
+g c
+lan g
+demon str
+ol ds
+un ity
+ne ts
+insp ire
+cre te
+nash ville
+nel son
+e ter
+wal k
+hy un
+m ack
+tre as
+see king
+ra ge
+bru sh
+ab and
+whil st
+co con
+h ong
+shel ter
+i p
+possi bly
+so o
+it ed
+â Ħ
+rac es
+war ming
+qu in
+tele vision
+mat ches
+ra pi
+ment al
+pal m
+jenni fer
+rol ls
+indi ana
+b ars
+cat ching
+resc u
+candid ates
+fa re
+âł Ģ
+se o
+vie tnam
+alph a
+michel le
+visi ble
+re gre
+wn ed
+app le
+li p
+f fe
+li z
+york shire
+ha il
+se asons
+be gan
+m d
+k c
+la p
+fascin ating
+hel p
+ur y
+u ms
+nu ts
+se m
+along side
+bri dge
+ori al
+o ve
+world cup
+briti sh
+comfor table
+i ve
+hot els
+fair s
+hor ri
+so x
+d ining
+stre am
+bar ri
+ss y
+w im
+ter ms
+v u
+pe re
+l ens
+wal ked
+r or
+l ars
+shi eld
+dou bt
+pro to
+cro ssing
+me ant
+medi um
+ad ding
+e b
+che ap
+fun c
+pap er
+bran ds
+ry an
+feed back
+col lins
+un known
+tro pical
+sand wich
+fal len
+for mu
+selec t
+lo ads
+answ ers
+or i
+mag a
+d or
+du o
+ali e
+dru m
+ur i
+de er
+sou l
+sh ut
+âĺ º
+sto len
+don ated
+bu zz
+patri ots
+ha l
+na sty
+nomin ated
+mon te
+ki a
+th ri
+ing u
+te sts
+pe tro
+ðŁij ij
+ho sts
+ne st
+to pic
+pat ch
+m my
+hu gh
+ab ilities
+ma the
+s miles
+g b
+ag enda
+insi ghts
+chi p
+ph an
+fail ure
+dg ers
+ha i
+signific ant
+sho ck
+ru ral
+gl am
+figu res
+pot us
+o ta
+mini stry
+appe ars
+fe ar
+r h
+americ an
+h att
+son y
+fi res
+e di
+n ou
+e qui
+wh en
+univers al
+mad ness
+i x
+sculp ture
+b ach
+t to
+swe den
+et a
+en to
+develop ed
+month ly
+ma ps
+ra h
+le d
+del ta
+sa ints
+is lam
+ben ch
+fif th
+v ard
+so cks
+wel coming
+j e
+tur ner
+v b
+ad i
+nor way
+ad y
+hurric ane
+por sche
+tra dition
+ex am
+newsp aper
+lu ci
+a ver
+ide al
+d na
+madi son
+ðŁ §
+wit ness
+ac ou
+insi ght
+si mon
+robo t
+sna ke
+n bc
+ac o
+ro ss
+sh ment
+religi on
+ch ann
+in su
+camp bell
+inst alled
+we ather
+hor ses
+ol i
+rober t
+k az
+ðŁı Ģ
+veter an
+th read
+quar ter
+ea sier
+cap ture
+hi pho
+law rence
+roman tic
+pas sion
+cl ay
+ox ford
+th ai
+stu dying
+fi a
+elec ted
+most ly
+c b
+tu mb
+âĢįâĻ Ĥ
+x l
+sh an
+fa ster
+ev ans
+sli de
+sh ri
+see k
+mi es
+chemi stry
+pump kin
+tu m
+, ,
+ro om
+fi red
+li ps
+pres ence
+af f
+brew ery
+arri ve
+sw ag
+photo graph
+pen gu
+chi ps
+at tor
+val ues
+accur ate
+con temporary
+princi pal
+cannab is
+ari o
+any where
+gi a
+democr ats
+buil dings
+li ved
+ap s
+neg ative
+m are
+bal lo
+li on
+diam on
+loo k
+re form
+tom my
+il la
+tre ats
+hundre ds
+port land
+wor thy
+ex cep
+ar ia
+ido l
+be er
+cd n
+y u
+aw k
+ðŁĩ ¨
+c ells
+Ã ³
+ident ity
+dra wn
+de vil
+f inger
+th am
+ðŁij Ĭ
+ear ned
+fin tech
+dol ph
+twee ting
+evolu tion
+ðŁĵ į
+est im
+m vp
+n one
+ðŁĩºðŁĩ ¸
+toyo ta
+au x
+mar in
+b old
+l bs
+ste ak
+mur phy
+it able
+lou is
+sol ve
+pi a
+sk ir
+ill ino
+webin ar
+ban ana
+lo v
+th on
+vo ters
+afford able
+defe ated
+lm fa
+air lines
+super b
+any way
+deb t
+bo red
+ver si
+me tal
+responsi ble
+m k
+s se
+f ay
+cau sed
+f p
+recomm end
+pla za
+spor ting
+alli ance
+au stri
+n n
+t ours
+surpri sed
+arti f
+th under
+sur ve
+wor e
+bri ef
+necess ary
+z ie
+ash ley
+dra ke
+r t
+kni fe
+im mun
+char ges
+a the
+bri de
+rep ly
+g av
+broad cast
+pu er
+brace let
+cap acity
+harve st
+id k
+perfor man
+d ding
+il ers
+par a
+jam a
+pro vince
+ch in
+id ers
+har i
+te aser
+ch en
+re stor
+r at
+fl at
+col om
+ðŁĴ ŀ
+ðŁĩ¨ ðŁĩ
+smoo th
+r t
+p itch
+stay ing
+isra eli
+t cot
+per spective
+do ck
+open er
+lo vel
+x o
+class room
+l ington
+go al
+kenne dy
+sh am
+sp aces
+mitch ell
+home coming
+uk i
+claim ed
+recru it
+ing o
+mu fc
+mon it
+g roo
+resi dent
+per cent
+per man
+otta wa
+int ment
+an xi
+stand ards
+wor ship
+sche me
+f x
+pot ter
+bi an
+athle tic
+af gh
+s se
+sat ell
+par ties
+âĿ¤ âĿ¤
+infra structure
+rela x
+mo du
+wor n
+smo king
+y ach
+practic es
+wc w
+am b
+dome stic
+tay lor
+k entu
+provi ded
+mo di
+ve g
+" ...
+ob serv
+ðŁĺ ©
+be ard
+m our
+an gry
+ðŁĺ ±
+startu ps
+woo den
+di ve
+na il
+anti que
+ro ses
+torn ado
+m at
+^ ^
+su spect
+far m
+de vices
+me ga
+tu l
+scholar ship
+ge e
+disa ster
+arri val
+po in
+mar c
+kati e
+bb ed
+fal se
+deser ves
+ric hard
+ju ana
+fre y
+tion ed
+hy bri
+r w
+sar ah
+ach i
+c ure
+o le
+mor ris
+ch ic
+broad way
+la bel
+pa k
+pover ty
+gol f
+e red
+f u
+er ies
+be es
+alo gue
+st el
+wire less
+je wish
+ti de
+blo cked
+life time
+b har
+sp lit
+am ster
+th i
+jo shu
+br unch
+ha ps
+s for
+oo ps
+ka poor
+hi king
+suppo sed
+ro of
+re as
+tra in
+ti ght
+tru mp
+bas ically
+r r
+ea red
+see ds
+entr ance
+c p
+wi e
+son ic
+vic tim
+he re
+e h
+ear rings
+sal mon
+arc tic
+an ne
+dou gla
+corru ption
+hann ah
+ha sn
+vo ices
+con ce
+att a
+fle et
+clin ical
+democr atic
+ton y
+st ood
+le f
+twit ch
+a il
+honest ly
+incre ased
+dro me
+don na
+accep ted
+visit ors
+ap ar
+ad or
+p ar
+jer ry
+ra i
+brand on
+ab u
+!! !!!!
+me me
+in gh
+glori ous
+b hu
+pu mp
+j ol
+li ke
+fi sher
+ma z
+ag an
+destin ation
+play list
+le tters
+gen u
+br ace
+celebr ated
+bann er
+r he
+dra gon
+ðŁĺ ħ
+sig nature
+gre y
+âľ Ķï¸ı
+al ice
+be red
+ph er
+ber n
+ca th
+ga thering
+sc oring
+influ ence
+sm iling
+de pt
+lo cal
+a x
+ac u
+reti rement
+hon or
+her self
+chem ical
+asse ss
+y all
+fre qu
+appreci ation
+ac a
+cho ir
+cu z
+so il
+c il
+repor ting
+u h
+enterpri se
+gr at
+jaco b
+ru m
+fe e
+j ak
+sp in
+bi kes
+phi a
+ste re
+p is
+bloo d
+t att
+ra ft
+war ren
+sh eri
+back stage
+mar sh
+hash tag
+ther ine
+re in
+game day
+guar an
+reci pes
+min ds
+stron ger
+issu ed
+bic y
+n ak
+ment ed
+sc ary
+u x
+pre vious
+tt le
+th ats
+ac tors
+u ma
+tin a
+bun ny
+promo tion
+u ss
+oli ver
+montre al
+what s
+appreci ated
+la kes
+excu se
+kno wing
+pri zes
+musc le
+shad es
+sco t
+ing redi
+electr onic
+ju an
+comb at
+s ri
+e h
+turk ish
+l om
+stri kes
+pri son
+re e
+po pe
+vi d
+ol dest
+dol l
+sw iss
+certi fied
+cli p
+re turning
+lat or
+le igh
+tt es
+wat son
+heal ing
+el im
+per haps
+ha ss
+k au
+d der
+mou se
+new castle
+indigen ous
+wel comes
+co le
+tau ght
+no ise
+appe ar
+jo e
+can on
+wedne sday
+u tah
+c tive
+dri ven
+i v
+c ell
+stri p
+ac c
+focu sed
+ar rest
+sto cks
+wo o
+â Ĺ
+notic ed
+shad o
+di spla
+ter ror
+bor ne
+secon d
+que ens
+wo ke
+ja il
+no tt
+cam bridge
+har t
+se af
+fa x
+ac cept
+âĺ ħ
+goo ds
+k at
+t win
+h s
+thou sand
+s ins
+su ite
+amp ton
+ar n
+rele v
+ric har
+hoo ps
+n bc
+class ic
+p ab
+soldi er
+de plo
+le ans
+install ation
+cla sh
+le ban
+ee e
+ti re
+belo ved
+fu sion
+travel ing
+ne i
+coo kie
+glo be
+phys ics
+s q
+co l
+wol ves
+d l
+ex it
+" -
+foo tball
+le af
+ster ling
+hi de
+minne so
+fresh man
+natu re
+indi e
+supp lies
+bri s
+iri sh
+ink tober
+doo dle
+ic op
+mess ages
+adul ts
+recor ded
+fix ed
+ar do
+offe red
+under ground
+dr one
+p ine
+ma inten
+and re
+ham mer
+s x
+r ound
+hi ke
+bra d
+ro me
+fu ll
+on ey
+ro ws
+colum bia
+archi ves
+appro ved
+bat ch
+illino is
+recogn ition
+shou ldn
+fo g
+nca a
+ke vin
+human ity
+al though
+pow ers
+p ou
+s ar
+pe st
+alco hol
+con sci
+phil adel
+en o
+t m
+ok la
+cate gory
+particip ate
+accu sed
+bri ef
+po em
+clu bs
+consul t
+ja b
+big data
+amster dam
+ac ing
+certi fic
+n u
+d at
+impro ved
+and y
+campa ig
+pale stin
+p ace
+mo bi
+feel ings
+wol f
+bra in
+pro pos
+inter active
+prin ce
+inde x
+c is
+cha e
+peace ful
+co vering
+ac o
+cour ses
+mon key
+re place
+b l
+bloo dy
+tal es
+brigh ton
+neighbor hood
+g ates
+spiritu al
+af raid
+bre ast
+b ones
+ðŁij ī
+vide o
+w au
+tou ch
+inju ries
+car l
+ri x
+une x
+âĢ ¢
+fre d
+consi dered
+thu si
+an ch
+on y
+u sa
+graph ics
+ac re
+ðŁĺ ©
+com memor
+com mod
+go ti
+guar dian
+star bucks
+pre vention
+haha haha
+admini stration
+portu gal
+fac ulty
+bet a
+ul a
+al bert
+bre ath
+er i
+le tting
+tr ic
+ment ation
+incredi bly
+ten nes
+v d
+ðŁĻ Ī
+ed die
+br ick
+gr ill
+bt w
+wat ches
+resear chers
+t ney
+ni e
+p as
+a ster
+vi br
+poke mon
+ch rome
+go at
+pitt s
+il ly
+festi ve
+y d
+can al
+ðŁ Ĩ
+fi es
+car los
+re que
+partic i
+tra ins
+sam ple
+temper ature
+sym ph
+pic king
+in door
+z ers
+playo ffs
+____ ____
+ap es
+ly rics
+islam ic
+performan ces
+d ick
+spar k
+se as
+hom a
+gr ound
+disc i
+employe e
+com mu
+alas ka
+al an
+fe ast
+dg ing
+ban king
+manu el
+slow ly
+tru cks
+mc car
+oo o
+sc rat
+orche stra
+indivi du
+m x
+bre ath
+stair s
+equ ality
+bla ke
+loc ations
+cocon ut
+balti more
+aa a
+l c
+ðŁı Ĩ
+har vey
+resi st
+immigr ation
+adid as
+fil i
+re f
+lg bt
+mo s
+pp i
+ken ny
+terr or
+ban e
+apol is
+s g
+social media
+ka i
+hon est
+as sas
+bol lywood
+âĢįâĻ Ģï¸ı
+ferr ari
+hor n
+cryp to
+bo om
+mainten ance
+i di
+s man
+w l
+ext ended
+in sul
+ve s
+go sp
+tr i
+pi g
+tar ge
+cel er
+st ati
+sm h
+ri dic
+appe al
+? )
+con clu
+cos me
+she ep
+christop her
+en thusi
+po lish
+me ts
+oun ded
+sustain ability
+creati vity
+con crete
+ra i
+ali en
+ble ss
+te es
+clu b
+ro t
+bo s
+ex ist
+perfe ction
+lu ck
+rock y
+expen sive
+mean while
+happy birthday
+pre t
+thr iller
+ca ve
+playo ff
+som er
+l u
+le x
+def ence
+am writing
+home less
+pro phe
+ch et
+past or
+ðŁ¤ £
+land er
+ww w
+Ģ ï¸ı
+tic a
+! #
+o tic
+rad ar
+po sters
+pow der
+po li
+ha un
+tra p
+bl in
+assau lt
+shor ts
+re y
+sh y
+squ ir
+rac ist
+gar lic
+fu r
+remo te
+sm ell
+impre ssed
+fing ers
+âł Ģ
+din o
+le ment
+s nu
+promo ting
+str ing
+produc tive
+b age
+ma son
+ra z
+direc tly
+j k
+ev al
+ðŁij Ĭ
+doc tors
+co w
+ri der
+st v
+re move
+w u
+na than
+ro d
+n r
+= >
+affe cted
+inve st
+mp tion
+g inger
+o d
+agricul ture
+s que
+mu g
+coun ting
+ke e
+mag nific
+coo k
+ani stan
+roo t
+plac ed
+sym po
+gh ana
+un d
+che er
+thro wing
+secre ts
+f illing
+opti mi
+butter fly
+bu bb
+ðŁĺ ī
+terri ble
+d g
+sil k
+obse ssed
+lo u
+ai de
+sal ute
+mon u
+philadel phia
+scienti fic
+i st
+u ae
+dess ert
+bott les
+can yon
+ðŁĺ Ī
+car ib
+o ther
+w ich
+re source
+guil ty
+un d
+le on
+e ss
+kan e
+el e
+tra iner
+he im
+an te
+man age
+roo kie
+tre ated
+po ses
+rs vp
+cau ses
+aw ak
+je well
+le tt
+on ics
+tit les
+cardi ff
+g aga
+bu mp
+use ful
+? !
+loo se
+bb ing
+: :
+argent ina
+de bu
+cy cl
+wh el
+dis gu
+j el
+k ills
+bio logy
+ex ter
+tra sh
+bo dies
+tr am
+circu it
+expe ct
+la ds
+w ells
+sho t
+ge e
+naren dr
+fa stest
+b ent
+b ills
+mar shall
+h ats
+intro duce
+citi zen
+im possible
+gi b
+az z
+net working
+r ant
+thin k
+in dy
+st ops
+f theday
+bri an
+* *
+amo di
+dom e
+coura ge
+pac king
+af fairs
+g n
+si zed
+ent ary
+pol and
+swit zer
+afgh anistan
+w u
+ten der
+subscri be
+mo sco
+att end
+republic an
+hon ey
+âĢ ĭ
+si mul
+we ster
+foo die
+or o
+midd le
+ab t
+co pies
+ma je
+narendr amodi
+ty pical
+inspir ational
+vit am
+wis con
+cu bs
+tiv ity
+h ali
+e ars
+k ay
+d are
+mari juana
+cu rious
+an ia
+tom ato
+re mind
+ðŁĩ ·
+sc ared
+cou p
+po et
+land ed
+ri d
+wra pped
+mor ri
+climb ing
+e ws
+fe eding
+con tra
+tho logy
+gri d
+ti vely
+read er
+la ser
+di ving
+di g
+lat in
+ti ed
+shake spe
+o ci
+ad m
+show ers
+chu ck
+mar cus
+oo s
+kne e
+o live
+ow l
+dy lan
+an no
+g ym
+deci sions
+well ness
+arri ves
+sati s
+chri s
+thur s
+ðŁ¤ £
+inter views
+thank you
+switzer land
+over night
+journ alist
+ser ves
+vol can
+.... ...
+plo t
+nic ol
+car rying
+mag ne
+tre asure
+ex p
+be ver
+ðŁĺ ¢
+mar ty
+mo le
+don ations
+recogni zed
+b h
+du s
+sh ann
+al do
+success fully
+ent e
+ðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤ
+cab inet
+cu is
+tit led
+d as
+so l
+strate gies
+deli vering
+ad ds
+ani an
+ne ther
+ðŁĴ ĥ
+con tain
+su its
+pa irs
+to dd
+rel la
+ro pe
+ci o
+cro p
+paint ings
+su z
+re jec
+bu st
+d h
+fra ud
+m h
+contro l
+je al
+destroy ed
+al lows
+wo ol
+minneso ta
+om en
+j u
+sympo sium
+d af
+lim it
+accoun ts
+load ing
+inter n
+re solution
+hol land
+qu al
+meet ings
+gra ve
+cam ping
+v am
+re nov
+liber al
+am ber
+gre e
+hu mb
+fe ver
+el ing
+broo ks
+à ²
+be th
+ad ed
+al t
+ro e
+perform ed
+jo sh
+frank lin
+nic ole
+de ss
+bb s
+m g
+net works
+min im
+al t
+weap ons
+gu y
+jas on
+g ha
+harb our
+at on
+pra ise
+kentu cky
+bel fast
+st icks
+blo ss
+ho pes
+an thro
+famili ar
+wa it
+ch ile
+depre ssion
+la x
+je ts
+le ice
+recei ves
+si er
+an k
+de x
+inde ed
+fle xi
+fab ric
+lam b
+hel icop
+am anda
+âĢĶ âĢĶ
+compe te
+sn ack
+techno logies
+sy rian
+mom s
+mu ham
+cho sen
+an at
+dev on
+shar ks
+re t
+fundra iser
+selfi es
+st ations
+communic ations
+tennes see
+tu tor
+ro t
+valu able
+dynam ic
+nur se
+i ed
+earth quake
+deser ved
+a ve
+sar a
+stre tch
+dougla s
+ne pal
+Ã §
+ob viously
+d ame
+ra pe
+any body
+k w
+pat rol
+hol ders
+h anna
+info graphic
+ec o
+be ating
+stan ley
+bo ats
+ri bb
+e z
+wit ch
+inv a
+ac id
+boar ding
+- @
+gi l
+da ve
+care ers
+opp os
+l loy
+in ter
+do pe
+re su
+j agu
+sh ade
+in dy
+on ist
+rel ations
+ag en
+ab le
+inci dent
+me ter
+shar ma
+id r
+pro ve
+immedi ately
+tro ops
+am an
+g low
+gaz a
+blo cks
+person al
+chron ic
+all er
+si d
+sh r
+whats app
+lu cy
+ar chae
+ho u
+journ alism
+our selves
+go t
+the med
+shap ed
+we ak
+cas ual
+leng th
+sla m
+ab bey
+e v
+coun ter
+est a
+reci pi
+cha pel
+expan sion
+sel f
+suff ering
+sp ice
+n z
+sp art
+desp er
+boo king
+quart ers
+y on
+ðŁĴ Ĺ
+p k
+continu ed
+- #
+man hatt
+tal ked
+sh en
+com bo
+hybri d
+je ans
+liqu id
+se al
+re tweets
+ac celer
+collec tive
+t as
+: ))
+profession als
+ra w
+o tt
+su san
+ir ing
+okla homa
+re ven
+survi val
+cre ator
+tran sit
+st ac
+sur f
+i k
+ed iting
+ch illing
+bai ley
+ste al
+ra ble
+pa rent
+hun ger
+sn app
+collec t
+philos oph
+dedic ation
+c f
+c m
+le ep
+repe at
+re ha
+un fortun
+a er
+a ero
+abstr act
+mon itor
+ag ents
+bu l
+sci ence
+harb or
+drag ons
+floo ding
+ac compli
+d ash
+juli a
+the red
+tues day
+cy ber
+b low
+ta ined
+le m
+refe rence
+pp o
+ne goti
+char le
+con nor
+au lt
+access ories
+commissi oner
+rain y
+re ar
+advis ory
+luc as
+ma id
+co al
+k av
+pol o
+ðŁı ¾
+tran sport
+mar gare
+straw berry
+bur ns
+gre ens
+ne v
+partici pants
+col in
+belgi um
+col our
+in form
+d ell
+br on
+cal y
+kick off
+strate gic
+re union
+hon ors
+li b
+egy p
+âŃIJ ï¸ı
+hy po
+si zes
+regi stered
+bet es
+relax ing
+bloo m
+inten se
+valent ines
+insan e
+w wii
+p x
+tri o
+bla de
+wiscon sin
+con e
+plat in
+ali ze
+ra ven
+incre asing
+indi ans
+il ian
+bl u
+rabb it
+exten sion
+je f
+au di
+fer ry
+s ell
+a day
+us b
+swe at
+cham pag
+metho d
+mem ph
+assi st
+s by
+ca pe
+remo ved
+mag n
+v t
+r ams
+f bi
+tack le
+phe w
+h on
+motor cycle
+su spec
+eleph ant
+sub ject
+let te
+da iry
+whe at
+awk ward
+ac t
+tro l
+mit ted
+zay n
+sheri ff
+ene my
+con s
+ke tt
+bul ls
+ev alu
+bt c
+satell ite
+ho lo
+por ter
+dia betes
+bet ter
+rele asing
+sur f
+: -
+se basti
+collec ting
+en cing
+e thi
+go ds
+al ley
+health y
+m ills
+sma sh
+co pper
+cr ack
+read ers
+sp ac
+licen se
+bas ket
+bang la
+en tic
+om i
+m ere
+si vely
+anim ation
+lan es
+dent ally
+chill in
+fi e
+k aren
+dep th
+li pse
+n g
+ri p
+mel o
+sand y
+ðŁijı ðŁijı
+vin cent
+nu t
+hu g
+who le
+cre ates
+? ???
+âĿ¤ï¸ı âĿ¤ï¸ı
+bak ed
+up grade
+rober ts
+har a
+carib bean
+auth entic
+mb s
+mosco w
+attor ney
+wi ki
+ch lo
+hu ll
+cor k
+" !
+sty lish
+ðŁĵ¸ :
+di ary
+impro ving
+ex pand
+bri ght
+pollu tion
+k nights
+person ality
+chec ked
+fac ilities
+z el
+bow ling
+gu er
+ðŁİ Ĥ
+on going
+un its
+hoo k
+be ck
+confl ict
+to dd
+far ming
+educ ational
+k ak
+cla y
+stro ke
+bel ly
+explo re
+mill enni
+th m
+loo p
+sm s
+consi st
+cir ca
+br yan
+d ab
+youn ger
+soli dar
+pp a
+experi enced
+b ella
+bo ard
+shef field
+steph en
+consu mer
+sub mit
+spon sor
+t ang
+ag gre
+comb ined
+trac king
+sand ers
+b az
+survi ve
+fer red
+equ al
+se p
+re ed
+str ong
+priv acy
+st ap
+un g
+ac ry
+pa sta
+pir ates
+ag er
+fair y
+du p
+introduc ed
+wi p
+let s
+spr ay
+ðŁĵ º
+gre w
+a sts
+pitts burgh
+new york
+jo ey
+lau ren
+tra de
+ch op
+pi pe
+cla ire
+behavi or
+v ap
+cre ws
+lap top
+ðŁ¤ Ĺ
+che ster
+disci pl
+d f
+out doors
+k s
+go ver
+super star
+cas ino
+far mer
+; -)
+re turned
+ðŁı Ī
+ma il
+roa sted
+co sta
+v ill
+pe z
+gard ening
+distribu tion
+sh ining
+inve stors
+ra sp
+dec ades
+reali zed
+bar n
+p ti
+st able
+ut d
+pan thers
+m ens
+b n
+ca de
+bu cket
+yn n
+when ever
+wa ke
+da is
+ber nie
+lo dge
+ju lie
+atmo sphere
+ðŁĺĺ ðŁĺĺ
+major ity
+par ti
+exc it
+cu t
+me h
+musli ms
+be gun
+fli ghts
+vene ss
+ce me
+po sing
+so le
+g ou
+dark ness
+pe ach
+cel tic
+auth ority
+grand ma
+ful ness
+smi th
+speci fic
+gar cia
+co ins
+good ness
+aldu b
+recru iting
+den nis
+gar y
+sle eve
+weap on
+pl z
+disco ver
+harri son
+recruit ment
+ja i
+ch im
+com pared
+tom s
+mo thers
+am y
+archi ve
+t ask
+ben jam
+se g
+law yer
+al um
+inve sting
+mi e
+che z
+j p
+a ke
+fl am
+wall paper
+âĻ¥ ï¸ı
+t ton
+che st
+favor ites
+we igh
+coo lest
+r ating
+relev ant
+lo gan
+ma ple
+run ners
+pri or
+peop le
+ma ur
+terrori st
+te sted
+carni val
+su spen
+me asure
+m v
+cyber security
+app ren
+terror ism
+o z
+v ital
+ni es
+gon z
+fun ded
+twi st
+assess ment
+die sel
+en for
+colum n
+ad dressing
+ca sts
+pay ment
+x ton
+fi er
+, '
+la st
+ne e
+un less
+clo se
+sk ill
+cuis ine
+fun eral
+ti les
+a un
+k ru
+relation ships
+ðŁĴ ¯
+ev ent
+âĢįâĻĤ ï¸ı
+kind ness
+pro posed
+acou stic
+a es
+defen der
+dan ce
+h tt
+w at
+vo y
+ðŁ¤ ĺ
+au s
+cli ff
+sear ching
+beauti fully
+in qu
+at l
+speci alist
+ðŁIJ ¶
+da i
+tra ils
+class ics
+inst ant
+v ous
+re venue
+mar ch
+kir k
+fr inge
+fire works
+tri via
+âĺ ħ
+tr action
+wal ter
+mo to
+l ily
+att itude
+cli mb
+sc an
+sav ings
+c w
+fa ith
+cred its
+ab led
+gra ff
+auto graph
+he he
+ran ch
+ha d
+ro gers
+ðŁĮ ¹
+f in
+re qu
+fol k
+ad ditional
+lyn n
+u ber
+dol lars
+lo gic
+wor th
+so m
+the sis
+p ound
+bi c
+st ur
+cer am
+spen cer
+en tered
+v amp
+organi zed
+âľ Ī
+pp s
+tr on
+merce des
+no ti
+compet itive
+do w
+ous ness
+vic tor
+gr illed
+na i
+pu tin
+ab ra
+bl ame
+alex and
+anim al
+dec ent
+p ent
+inter ior
+:' )
+but ler
+bal let
+ðŁĴ Ķ
+albu ms
+down s
+la d
+si r
+pla in
+p ers
+blon de
+dis c
+paki stan
+se ment
+ga a
+w age
+ch as
+man i
+co ps
+terr it
+lo l
+lau ghter
+ri vers
+magnific ent
+lam p
+w b
+new sle
+char ts
+ble ssing
+p unch
+lon gest
+fl oral
+cu tie
+fare well
+sto pping
+mb b
+bu d
+chee se
+de cla
+si m
+mc donald
+de ter
+you th
+t ch
+fre der
+kin dle
+fer n
+at or
+as leep
+p ond
+spr int
+p ounds
+la zy
+gh e
+fundra ising
+dead ly
+gran de
+dou g
+he y
+lin da
+consi dering
+i um
+gol den
+vi k
+auth ors
+di ss
+u ally
+appropri ate
+mor ning
+y le
+hon oring
+foli o
+be c
+re bec
+fin land
+formu la
+corn wall
+sh ay
+cau sing
+bl end
+sig nal
+t ent
+kash mir
+nation als
+har mony
+sc out
+acce ssi
+he ight
+medi eval
+impro vement
+ke es
+prac tical
+car d
+de par
+hu n
+om ing
+cal gary
+ste l
+bu bble
+gur u
+ma h
+unex pe
+n h
+ed a
+me at
+i ge
+si o
+god dess
+in ches
+tun es
+br itt
+sti on
+ra j
+âĻ «
+mer cy
+ðŁĴ ĺ
+sen ds
+i est
+pol ici
+val e
+reduc ed
+as ap
+vi jay
+defen sive
+celebr ations
+ri ders
+med itation
+har mon
+g ing
+Â ¡
+program ming
+in au
+sud den
+m h
+replac ement
+sk u
+j ar
+gra des
+ta st
+k itt
+brand ing
+k aw
+boo t
+f ought
+p ays
+g f
+iz ation
+ho p
+k k
+activi st
+v end
+coast al
+cha os
+ðŁĶ ´
+se me
+bill board
+li fting
+cu mb
+sc al
+ðŁĸ ¤
+stru ck
+l v
+indie dev
+beat en
+jun gle
+al right
+destin y
+m ing
+k c
+ch ances
+om an
+q atar
+cra f
+tra ined
+pri x
+char m
+o tive
+s mu
+e c
+and ers
+hand ed
+al ban
+certain ly
+arri ving
+i ze
+sa i
+tr ack
+pain ter
+hu mble
+appo intment
+head line
+manag ing
+mo d
+as pe
+andre a
+Ã ¤
+ethi op
+un ited
+exi st
+bal i
+k ad
+n t
+d red
+re x
+recogni ze
+tam pa
+be ers
+ati a
+he els
+no te
+transport ation
+tur tle
+re de
+hipho p
+sp icy
+sp urs
+⬠ĩ
+cor p
+ther n
+to ast
+hur ry
+proper ties
+ma ge
+mar co
+ele ments
+bou ti
+syn drome
+ms g
+develop er
+gra ders
+he im
+re sil
+off ices
+del ay
+di men
+vin tag
+barbar a
+ðŁĺ ±
+vene zu
+cu lar
+fac ed
+bar n
+ðŁĺ Ĩ
+survi vor
+wor m
+confu sed
+passion ate
+Ø ±
+identi fy
+electr icity
+sou ls
+brad ley
+repor tedly
+lun ch
+shel f
+eli a
+swee t
+smoo th
+emplo yment
+am el
+manhatt an
+ste am
+oun ts
+ye p
+li ving
+un e
+descri be
+ca res
+man ila
+sha wn
+ac ted
+bas h
+st even
+re st
+pet ition
+div ine
+wel sh
+rac e
+platin um
+ðŁĮ ¸
+p b
+extra ordinary
+solidar ity
+m all
+on ion
+schedu led
+game of
+fer gu
+de ms
+nor m
+p k
+tri als
+polici es
+publi shing
+st ole
+fron t
+charac ter
+van ia
+ex ce
+sti e
+sc a
+resi dential
+sa iling
+ðŁĶ¥ðŁĶ¥ ðŁĶ¥
+spons ors
+th ick
+champag ne
+she pher
+continu ing
+ven ice
+per th
+na p
+a ster
+y ak
+un limited
+cho ices
+ne o
+hi v
+repor ter
+bru ssels
+f old
+dy s
+se mi
+la wn
+it alia
+wi fi
+as k
+em ed
+fr ame
+monit oring
+ste ad
+i da
+gr in
+is a
+fli p
+re stric
+offen sive
+atta ched
+di sh
+wh y
+philli ps
+gre et
+p als
+mix tape
+v ou
+fiel der
+spar k
+alber ta
+g len
+ca sh
+s ri
+u ri
+ro dri
+entreprene urs
+climate change
+p sy
+d le
+em ents
+lin ked
+nether lands
+acci dentally
+oppos ition
+vel vet
+ra ys
+c w
+om o
+m f
+lmfa o
+newsle tter
+: )
+toi let
+liter ature
+di sp
+phili p
+uni form
+sudden ly
+head er
+cool er
+-- -
+prou d
+bri g
+nis san
+scienti st
+j ah
+con centr
+pac ks
+appo inted
+so ap
+eng age
+cho se
+âĻ ¡
+se tup
+jeal ous
+har ry
+g ation
+tun nel
+te mp
+osc ars
+dec ade
+recomm ended
+child ren
+ab a
+anxi ety
+ve ments
+sal on
+pho too
+organi z
+mach ines
+ab s
+vil le
+hy pe
+ti ff
+emer ging
+av geek
+[ #
+contribu tion
+bra dy
+re sto
+g mail
+fit z
+photo shoot
+hel met
+h t
+eleg ant
+ug anda
+nur sing
+or leans
+pen n
+na h
+foo tage
+em a
+w o
+w ad
+concer ns
+ve re
+re mark
+who ever
+str ang
+p t
+qu it
+sh ang
+histor y
+s ick
+perman ent
+ill ness
+col d
+visi on
+he m
+ar row
+con vic
+pin k
+oc cup
+bal d
+ex hau
+u of
+am o
+on t
+ãĥ »
+adop t
+la id
+smo ked
+inter pre
+ess enti
+associ ated
+b d
+bb y
+fi er
+inst all
+dipl om
+con diti
+c f
+w ak
+any a
+gr aci
+fi sher
+s ss
+ap r
+il it
+mus ician
+symph ony
+cor d
+h ack
+le gi
+l v
+bless ings
+hum or
+sc ra
+e ti
+min ster
+trav elling
+bu sh
+jewell ery
+li me
+!! !
+pregn ant
+pe e
+lo b
+cap ital
+ip a
+pen cil
+la bor
+duc ks
+prou dly
+wedd ing
+dere k
+m w
+pe g
+valent ine
+an gu
+re treat
+pro spect
+dang er
+vul ner
+up set
+, #
+sr k
+x im
+thur sday
+n fl
+kis ses
+re ds
+cr ack
+re ward
+c u
+ko k
+me te
+aband oned
+it t
+me als
+sp ell
+stan bul
+del ays
+ru m
+le op
+gu m
+no va
+super man
+ch ick
+m is
+dram atic
+inno cent
+r ounds
+re c
+auti sm
+bangla desh
+mor al
+mo vie
+sp oo
+k la
+âĥ £
+ou ting
+mess i
+ab road
+loo kin
+a im
+q i
+st ack
+colla ge
+à ¯
+hud son
+sc an
+ho e
+ch au
+oc cur
+comm ander
+ho les
+ðŁİ Ħ
+bi as
+v on
+stick er
+ma k
+responsi bility
+colum bus
+sa int
+ed mon
+rac ism
+far ms
+w en
+gul f
+may o
+!!!! !!!!
+corpor ation
+ba chel
+el a
+inter nal
+je ep
+fol lows
+di alogue
+de rer
+smart phone
+he len
+rich mond
+equ ity
+s land
+b g
+ne ar
+av i
+memph is
+we ir
+discu ssed
+bad ge
+p up
+mi stake
+phen omen
+un ite
+ðŁ Ľ
+de pic
+ri des
+in augu
+n at
+sof twitter
+comb ination
+gosp el
+âļ ¾
+ad mission
+retro gaming
+ðŁIJ ¾
+sch u
+mb o
+jun ction
+al arm
+à ¦
+gr ac
+kh ali
+k ul
+m ale
+cap tion
+wi sh
+te re
+cor ps
+ru bber
+play station
+er in
+effici ent
+l or
+jo kes
+in ary
+nor man
+lu is
+inaugu ral
+ch ed
+âļ½ ï¸ı
+di p
+to e
+str at
+aa c
+am u
+pi er
+co tt
+comm and
+tt en
+sn oo
+cu be
+clo ses
+class ical
+s word
+expre ssion
+reach ing
+n app
+co st
+affe ct
+ric o
+gi f
+brea the
+tri be
+or tho
+h ay
+l g
+fri es
+n m
+hi ding
+richar ds
+en de
+mic ro
+capit ol
+cop y
+ro m
+regi me
+mary land
+tax i
+di al
+embar ra
+un believ
+ch t
+v s
+elim in
+o dd
+pen ny
+sound track
+l ings
+trans ition
+rema ining
+a is
+mali k
+? !?
+rand om
+def end
+ul tra
+tru m
+danc er
+st ol
+dri ve
+a ver
+ro ast
+defin ition
+se an
+excit ement
+partic ul
+su rely
+sh av
+ber y
+di shes
+com m
+is ol
+i am
+ob li
+gho st
+hugh es
+chi efs
+b as
+conserv ative
+speci al
+fe min
+sh ri
+n ancy
+inte l
+tu ne
+ðŁĩ ª
+jo el
+gg le
+mo to
+ðŁĺ Ķ
+bu ck
+d ag
+antic ip
+mont ana
+gu id
+fro g
+ec raft
+op e
+dri ves
+nu mer
+x y
+color ful
+wednesday wisdom
+illu min
+bey on
+inau gur
+deep ly
+pre fer
+for tune
+coo ked
+ti ble
+âĺ ķ
+swe ater
+it ter
+tt y
+u i
+gi e
+com plic
+~ ~
+tax es
+cu ps
+di verse
+sam anth
+âłĢ âłĢ
+ba king
+sy mp
+wa i
+be half
+mer cur
+travel s
+ðŁİī ðŁİ
+or ia
+eng aged
+jump ing
+reti red
+n aked
+p uni
+speed way
+sci ences
+rehear sal
+on ym
+dy ou
+pl ates
+r ati
+kri sh
+jaz z
+car ol
+ra f
+pen alty
+tim eline
+ru by
+engine ers
+ra f
+bel le
+do se
+che on
+esc ap
+me g
+ran k
+or d
+me gan
+mer ch
+ec lipse
+âĺº ï¸ı
+ple dge
+kir k
+per si
+leice ster
+sa k
+w k
+saf ely
+yy y
+je t
+promis ed
+j c
+en ne
+no ah
+re no
+re a
+ðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤ
+tra il
+ðŁij Ģ
+f d
+soo o
+ri min
+w k
+ภ²
+i al
+x ox
+bis cu
+d ale
+fan dom
+particip ating
+fla g
+privi lege
+pe ach
+mach ine
+bo ston
+gro ss
+o g
+mir acle
+adop tion
+u ss
+mon sters
+be ij
+clar ke
+pu shing
+pra ying
+ar o
+d n
+ell is
+apol lo
+od ds
+refuge e
+to w
+b p
+ðŁĩ¬ðŁĩ §
+h end
+app eared
+memb ership
+pe an
+du m
+viol ent
+v y
+potat oes
+aw w
+greet ings
+t ts
+ac on
+sh ane
+photograph ed
+cra b
+temper atures
+cu ba
+c fc
+wel com
+he l
+in nings
+m k
+co de
+kno ck
+gra ss
+swe dish
+p ta
+ick y
+v at
+lin ing
+s q
+sa p
+ar c
+announ cing
+sk ins
+cit yof
+br ing
+co x
+gam er
+it arian
+i da
+h d
+ros se
+sad ly
+ge o
+âļ ¡ï¸ı
+tag s
+fa ther
+chan ge
+l ance
+whis key
+adel aide
+te c
+stick ers
+marke t
+class y
+bad ass
+flo rence
+lin er
+fro st
+k ate
+ac on
+scand al
+es sex
+ðŁĺ ı
+vi vi
+dr ill
+blo ggers
+recomm end
+d ha
+ac res
+ro ma
+bu y
+gro cer
+er ia
+ma har
+ff er
+patter ns
+ver i
+com pu
+st ev
+ang a
+ment or
+do o
+it ali
+cdn poli
+on ly
+conduc t
+elec tro
+de f
+wh ale
+prepar ation
+bicy cle
+vi ral
+turn out
+bra ss
+qu ad
+hospit ality
+pack aging
+den cy
+ceme tery
+abo ard
+dre aming
+pic ture
+t all
+inv ent
+ad mi
+o e
+tem ps
+qu an
+fun dam
+pro mp
+resi dence
+mu d
+sour i
+âĦ ¢
+graff iti
+gi f
+d nd
+com p
+s war
+pe eps
+pale stine
+devil s
+san g
+assi stance
+bi ke
+missi ssi
+inter viewed
+ne phew
+dru ms
+v and
+gentle men
+n sw
+inst a
+leban on
+ee ee
+oli via
+ver y
+rou gh
+industri es
+m ation
+ðŁĺ Ĵ
+bar rel
+n ay
+po ps
+moder n
+ill y
+are st
+on ents
+protec ting
+v ans
+e o
+vi kings
+restaur ants
+re ck
+jac kie
+andre w
+w illing
+he ath
+citiz en
+disc rimin
+๠Ī
+stu art
+m ys
+hi p
+tran sp
+" ?
+te x
+su shi
+ke d
+cro ssed
+dist ur
+pe dia
+f ate
+some how
+mo th
+proce ssing
+is s
+r in
+u ts
+yy c
+ver t
+lg bt
+re id
+on to
+arab ia
+habit at
+= =
+stre ak
+simp son
+addic tion
+wim ble
+deli vers
+challeng ing
+ðŁİ ¶
+fran ch
+e du
+s me
+ai ds
+hur st
+th am
+tari an
+remem bered
+palestin ian
+fe es
+tru m
+sket ch
+ur u
+fit ting
+jes se
+ðŁĶ¥ ðŁĶ¥
+---- ----
+ba ch
+ici a
+colo red
+da h
+associ ate
+int el
+s eller
+p u
+stu ffed
+ac s
+b s
+sh in
+cooper ation
+certific ate
+ab u
+ingredi ents
+re v
+in ge
+el der
+christi an
+bun dle
+th ic
+dir t
+beij ing
+comm it
+ted dy
+ed u
+to day
+s field
+w yn
+confir ms
+lo o
+j v
+ene ss
+al pha
+vir us
+ari um
+gr ind
+bri dges
+introduc tion
+pol ls
+bac ter
+z ach
+termin al
+ra iders
+fla vor
+zom bie
+vo d
+sp reading
+gameof thrones
+effici ency
+lat ely
+ale m
+twee t
+cri mes
+cl er
+de y
+dg ed
+hy un
+pay ments
+cir cus
+ðŁĺŃ ðŁĺŃ
+mis souri
+lu b
+episo des
+c age
+po s
+mat ching
+tumb lr
+lin ed
+ge st
+am bi
+nar r
+ing ton
+regu l
+blo wn
+is le
+co co
+on don
+joshu a
+tour ing
+sm a
+sau sage
+best friend
+bo eing
+desi re
+sav age
+ra pper
+de vo
+te ar
+take over
+cow boys
+po ker
+par ag
+pp e
+h int
+we ars
+se th
+ro les
+l anc
+man ga
+form at
+fl yer
+c ay
+mo or
+ba ke
+spla sh
+v ad
+ker ala
+proce eds
+sil ly
+reflec tion
+di str
+wi d
+su it
+ci vic
+yan kees
+by n
+migr ation
+di stin
+or ch
+fe mini
+quali fying
+tu ri
+o be
+hun dred
+cra p
+wan g
+mathe mat
+bu re
+expo sure
+fergu son
+seme ster
+re serv
+pl ym
+a hu
+fac ial
+wa x
+wor ried
+ca b
+vi o
+as a
+co d
+to pics
+p cs
+hal o
+rescu ed
+horiz on
+ar k
+âļ ª
+hol ly
+el f
+ul ti
+pu p
+quali fied
+attend ance
+ati vely
+destro y
+y c
+for th
+photoo ftheday
+c ents
+ic eland
+meas ures
+de sk
+port folio
+artic les
+direc tors
+dat ab
+e w
+creep y
+oun ding
+hon oured
+mi st
+j it
+men tioned
+port able
+iti c
+d ann
+friday feeling
+am id
+ti ger
+scri p
+helicop ter
+hard ware
+expl or
+work place
+austri a
+beat les
+ber nar
+spi der
+disc o
+cul t
+lim its
+shor tly
+fin al
+nin ja
+lu ke
+le bron
+wal mart
+o il
+van illa
+shi re
+ye g
+ak y
+c s
+bl er
+collec ted
+t g
+rol led
+speci als
+b ff
+pier re
+sh im
+vi er
+flash back
+restor ation
+individu als
+pro d
+fre aking
+tu rer
+o a
+re fre
+mor oc
+gre et
+re yn
+care ful
+our ing
+u sh
+is d
+g ill
+vie w
+thunder storm
+b led
+pic nic
+guar di
+pi g
+ar k
+syl vania
+bann ed
+u cl
+vi jay
+ori um
+av engers
+believ es
+eu r
+monu ment
+concer ned
+la bs
+ber g
+a ap
+vi sh
+sing les
+can cel
+z el
+ar ab
+ru th
+too th
+ar ta
+sh af
+chair s
+r ack
+dise ases
+crow d
+cl y
+fle x
+christ ma
+artif icial
+tom at
+fin e
+dra ws
+advoc ate
+fran ce
+Ù Ĭ
+ðŁĺ ³
+heav y
+s our
+compre hen
+no ble
+aa p
+hin du
+cor al
+g ars
+ow en
+n l
+st all
+yel low
+mar ina
+in ver
+suppor t
+tou gh
+promis es
+pi e
+master piece
+sco re
+for ce
+mor tg
+crypto currency
+o x
+r ors
+rock in
+pro vin
+ho g
+no stal
+oak land
+pat rick
+inclu sion
+tra ffic
+ah med
+a ha
+lux ury
+con secu
+de mon
+âĸ º
+b lowing
+st ag
+: "
+encoura ge
+ben e
+sku ll
+do dge
+bu ster
+kin son
+wit ne
+er ror
+lo west
+fel low
+à °
+sh re
+bl ur
+vir gin
+compos er
+sli p
+mor nings
+ga ins
+tab le
+gra in
+ari st
+braz ilian
+w we
+tu es
+ribb on
+an ag
+di st
+sac rif
+em brace
+entreprene ur
+af fili
+de o
+t ali
+touri st
+fat al
+ì Ĭ
+autom atic
+ðŁĩ µ
+we ak
+wel fare
+confir m
+benjam in
+fi ghts
+alleg ed
+me ad
+strugg ling
+pro secu
+che f
+Ã ¨
+propos al
+er n
+ðŁĺ Ħ
+dy k
+on gs
+hon g
+m ack
+mel on
+on ent
+ru sh
+d ap
+tol er
+pro pag
+c ze
+trans lation
+wal let
+cott age
+sa il
+constitu tion
+ðŁĴ Ģ
+mun ici
+fav or
+storm hour
+i h
+ðŁĺ Į
+approach ing
+pin ned
+j ed
+niger ian
+n ach
+sh at
+particul arly
+mc don
+camer as
+anni e
+admini str
+he at
+electr ical
+char ming
+gib son
+bouti que
+ex posed
+ac tor
+pil low
+beach es
+genu ine
+margare t
+ben nett
+lou isi
+pos itions
+el y
+shin y
+ten tion
+architec t
+ren tal
+ac qui
+goo gle
+sub way
+mom ent
+ðŁļ ¨
+ri m
+metho ds
+cy cli
+nor folk
+Ù Ī
+over whel
+ra pid
+we ar
+happy birthday
+progre ssive
+ðŁĴ ¥
+co gn
+pap a
+f ool
+philosoph y
+pol ar
+jim my
+wi g
+ðŁĴ ĭ
+oper ating
+reduc tion
+ph i
+fla gs
+to the
+o di
+a res
+k oo
+k ang
+ar kansas
+ash ton
+wimble don
+sci fi
+attrac tive
+mississi ppi
+logi sts
+ral ph
+la bel
+gradu ates
+ma ha
+home town
+âľĮ ï¸ı
+foun ded
+on the
+li z
+trans l
+mini mum
+pre sti
+ta m
+gener ations
+re bel
+journ alists
+par am
+mc m
+acry lic
+death s
+tes la
+w t
+bry ant
+jer us
+i stanbul
+muham mad
+ri ley
+k ris
+work shops
+is o
+coun ts
+stre t
+prote cted
+trin ity
+man ual
+r hin
+r il
+pleas ant
+le mon
+ner d
+har der
+dar ren
+bur y
+ra h
+bas is
+mi gu
+occa sion
+li sts
+âĿ¤ï¸ıâĿ¤ï¸ı âĿ¤ï¸ı
+e b
+de cre
+hamp ton
+ìĿ ´
+tra vis
+trans form
+puer to
+nh l
+av oc
+tri ps
+unexpe cted
+ve t
+di dyou
+bar ber
+st ages
+m son
+re presented
+for t
+l al
+pp le
+nic ely
+ignor e
+qu il
+qu inn
+h k
+carri er
+remin ded
+am ong
+pass enger
+el len
+gue z
+sc ape
+mu ral
+youn gest
+ma sh
+d ill
+rout ine
+stain less
+jack son
+gand hi
+th al
+on ers
+edit orial
+convers ations
+sd ale
+autom ation
+i ke
+า à¸
+ðŁĩ ª
+hau l
+la ying
+men tions
+am en
+abor tion
+i bi
+coun ties
+ca therine
+man ds
+jam e
+roll er
+au t
+n am
+o logical
+cep tion
+ran king
+tox ic
+sn acks
+victor ian
+bang kok
+psycho logy
+re g
+ang ela
+respon d
+sty le
+sophi e
+dak ota
+achiev ed
+mar ked
+imper ial
+in as
+glo ves
+sli m
+confi dent
+att acked
+gg er
+lon ely
+valentine sday
+re b
+craft beer
+orig in
+zim bab
+ce iling
+te ens
+other wise
+w b
+f ers
+day sof
+advis or
+y ah
+âĻ ª
+en der
+republic ans
+av a
+skir t
+pi pel
+chi e
+jan e
+ja x
+ðŁĺ ĭ
+âľ Ĭ
+j ays
+bre tt
+bal o
+cru cial
+d har
+as is
+de au
+lloy d
+chat ting
+âĿĦ ï¸ı
+rel ay
+remark able
+n s
+we t
+bris bane
+ðŁĶ ´
+tion ally
+f k
+la yer
+house hold
+consecu tive
+es is
+pend ant
+st ir
+crit ic
+su gar
+photo shop
+pa res
+arti stic
+do dgers
+c un
+cra fted
+am end
+bo at
+âŃIJ ï¸ı
+egyp tian
+sa w
+tra ge
+small er
+ox y
+pa ired
+nex t
+i res
+tac o
+o y
+u c
+st i
+a erial
+: //
+dr o
+dot com
+gg ins
+r pg
+ay e
+le an
+stri ker
+lo bby
+prote sts
+pri ority
+congre ss
+am ate
+inv it
+r ington
+mom my
+th us
+allow ing
+pione er
+enfor cement
+g ori
+tal k
+dra g
+du mb
+bul let
+san ge
+er y
+tar gets
+ðŁĩ ¦
+he ather
+consi der
+seaf ood
+ve st
+ris ks
+% .
+p g
+sac red
+he ating
+kick ed
+tto t
+. -
+chan di
+co ven
+po ol
+pul se
+i a
+ro ster
+shakespe are
+es a
+car go
+pean ut
+tro op
+ac tion
+tab let
+home work
+cast le
+stru ction
+mus icians
+free zing
+bu tt
+justin bieber
+j j
+bah rain
+an them
+au dit
+didyou know
+na vig
+guid ance
+âĸ ¶
+tur f
+n un
+fic ations
+ye men
+char ging
+x c
+bron cos
+su bur
+p ale
+bor ing
+among st
+for the
+em per
+om fg
+p j
+expe cting
+ðŁĴ «
+st l
+ad min
+expect ations
+sw an
+shoo t
+oooo o
+min ent
+ãĢ IJ
+wall ace
+stan g
+satur day
+adop ted
+dou bles
+hom ie
+ome z
+d han
+vent ure
+surroun ding
+fi le
+mob ility
+de es
+w ski
+broo ke
+emb ro
+re members
+kar a
+test im
+bo tan
+m tv
+sacrif ice
+jerus alem
+d l
+Â ´
+proper ly
+ili on
+as i
+leg it
+co pe
+m cla
+recy cling
+lar ger
+ðŁĴ ĵ
+pat ric
+gener ous
+ja red
+p f
+mol ly
+thom as
+ju dges
+h b
+sor ts
+bl vd
+o ven
+enter ing
+plan es
+be et
+integr ation
+boo ked
+fre ed
+ver n
+ash es
+to pped
+de pot
+welcom ed
+ren a
+m ick
+d and
+see ks
+gam er
+ran kings
+ren e
+mu t
+whis ky
+fire fighters
+gu es
+ga ther
+tour ney
+de men
+y ang
+new ton
+autom otive
+back yard
+deta iled
+mi st
+to bac
+fi ber
+un usual
+grat itude
+sp are
+ne ys
+: *
+per i
+flo ating
+fin alist
+don ating
+dre ss
+bro ad
+be the
+econom ics
+tai wan
+ed wards
+plu g
+pra iri
+val en
+bab a
+f ad
+an as
+har per
+dis order
+app lied
+p att
+bi kin
+li ver
+cu ri
+carol ine
+ann er
+juli an
+wal king
+mal col
+screen shot
+co ding
+skin care
+activi sts
+myster ious
+ex act
+blo cking
+mercur y
+bat ter
+du mp
+âľ Į
+en se
+li sh
+ridic ulous
+prote sters
+ðŁĻ Ī
+lu st
+swe at
+as s
+ali ke
+co dy
+re ments
+win ds
+as pir
+vi enna
+pra y
+.. .@
+bo i
+cand le
+assi sts
+te e
+der son
+p ony
+f ence
+con spir
+âĺħ âĺħ
+oo th
+e pic
+ba rely
+a unt
+b am
+diamon ds
+end less
+scre ens
+can cer
+gr o
+p st
+pro spec
+mo sque
+help ful
+ou ri
+bro ther
+gu jar
+cri sti
+ine z
+to wers
+ad dresses
+gra y
+bur ton
+re tweeted
+ðŁ¤ Ķ
+n ity
+du ck
+super vis
+jo an
+kin der
+sanc tu
+pi ed
+âı °
+ł ï¸ı
+m ati
+reven ge
+ce ster
+eli fe
+desig ners
+back ed
+bo li
+wei ght
+cou ch
+su res
+s its
+shri mp
+la gos
+auth orities
+os ity
+hol ly
+compu ting
+fac tors
+ab e
+pan els
+ram ad
+sent ence
+missi on
+hol m
+r b
+d ads
+shang hai
+mon ey
+she ets
+sk ate
+thre w
+cup cakes
+infin ite
+l is
+practic ing
+ess ay
+ka i
+as ci
+mo b
+u gh
+hol mes
+re gg
+ik h
+mo ck
+collec tions
+pe p
+o va
+sal t
+nan dez
+co y
+thre ats
+tex ts
+cin nam
+pregn ancy
+pen ding
+stam p
+flow er
+g is
+agre ed
+pay ne
+ro ver
+ph ra
+sof t
+f fin
+fa thers
+pass engers
+aw ays
+al a
+h es
+li van
+in s
+samu el
+ingu i
+h of
+j j
+chen nai
+cat al
+om ic
+he ath
+ni ece
+pump ed
+integr ated
+are l
+no m
+produc tivity
+wan ting
+vis a
+di ana
+tw il
+it v
+cam ps
+ro wing
+d ley
+black and
+gu ards
+b ells
+re verse
+vi be
+ric ky
+mo ss
+ny t
+âĺ Ģï¸ı
+el le
+tro y
+cu dd
+ev an
+women s
+fo to
+mi stakes
+wick ed
+mi l
+c led
+me mes
+co smo
+schol ar
+ren o
+ðŁĺ Ģ
+v ents
+# â̦
+terrori sts
+ca sey
+cardin als
+ðŁĺĬ ðŁĺĬ
+venezu ela
+bol a
+liter acy
+t w
+en o
+con tains
+au stin
+fin anci
+ev an
+har vard
+origin ally
+chev ro
+her ald
+nott ingham
+manag ers
+âŀ ¡
+accep ting
+wal sh
+tutor ial
+entrepreneur ship
+yach t
+requi rements
+glen n
+pe de
+unfortun ately
+ach ing
+dais y
+gi an
+night mare
+âĿ Ĺ
+r ina
+b art
+ema ils
+oppo site
+who m
+sa ke
+pu zzle
+da shi
+par ty
+blan ket
+bus es
+lo re
+beau ty
+reas on
+pun jab
+winds or
+func tional
+exi sting
+hel lo
+gli mp
+con vin
+la k
+scre aming
+rebec ca
+bli ss
+north west
+infin ity
+cosme tics
+pul ling
+coffe e
+pl ing
+op ho
+colom bia
+interior design
+( +
+emo tions
+sa c
+sun glasses
+sav es
+d f
+six th
+al y
+ðŁĺ »
+de en
+dev ast
+polit icians
+lac rosse
+g u
+pe i
+jav a
+comb ine
+coal ition
+er ts
+survi v
+ch ad
+stri an
+n n
+de vi
+coun c
+concer n
+contro ller
+bre ast
+j ury
+tu m
+introduc es
+la di
+mobi le
+al z
+ste ady
+nur ses
+h acking
+on line
+oce an
+ðŁİ Ħ
+a am
+ju ven
+ic c
+louisi ana
+ar te
+street art
+is on
+wn s
+fr m
+p anda
+no ir
+main tain
+del ay
+symp toms
+thor n
+ge ome
+ter n
+carri ed
+p ru
+pan or
+as sy
+per u
+clou d
+sp ra
+pe di
+e ste
+tag ged
+ðŁĺ Ŀ
+shado ws
+naz i
+ا٠Ħ
+cor ri
+âĻ¥ âĻ¥
+j ad
+ðŁĩ «
+form al
+spo ken
+ðŁĮ ŀ
+enjo y
+lo pez
+out look
+in ho
+w ander
+Ù ħ
+ma ya
+pe e
+d ine
+ãĢ ij
+brief ing
+suppor ter
+ar ily
+ght ers
+natur ally
+doctor who
+j en
+v ar
+new year
+re se
+si mm
+re x
+con sequ
+tomat oes
+bur st
+bra vo
+bur gers
+cr acking
+nor theast
+bi om
+mush room
+mar que
+dou ble
+ni er
+v ag
+tw enty
+key board
+win ni
+jama ica
+par ish
+: -
+mental health
+ali zing
+ren der
+wa king
+ðŁİ Ĥ
+g ly
+na than
+wa shing
+mel issa
+jun g
+loy al
+chil i
+song writer
+guit arist
+bo wie
+neighb ors
+onym ous
+as set
+ta i
+head quarters
+ðŁĮ Ī
+i hear
+ci gare
+sur g
+) "
+re pl
+dar ling
+ðŁĻ Ħ
+z ak
+sa re
+ãħ ĭ
+mic key
+ware house
+mass age
+ine es
+did nt
+i w
+hur ts
+eng aging
+mag ic
+women in
+k itten
+mor s
+c art
+tit ans
+colle ague
+compe ting
+er an
+k hal
+mar ble
+dem and
+del ight
+et ary
+bli zz
+lou ise
+m ls
+fini shes
+experim ent
+conduc ted
+electr onics
+itt ers
+car ing
+wh ats
+sym bol
+jun g
+e cu
+pi x
+con text
+char ger
+ðŁĺ ĩ
+re ig
+fra g
+ë ĭ
+ch ad
+tru e
+ker ry
+def ending
+a int
+au ton
+check out
+bar nes
+less ly
+d t
+m me
+clou dy
+second ary
+are z
+_ :
+app a
+const ant
+" )
+ve ts
+jo b
+i ent
+ðŁĺŃðŁĺŃ ðŁĺŃ
+m j
+fren ch
+di ver
+davi es
+hh hh
+e book
+๠ī
+mar iti
+bree ze
+susp ended
+mat o
+vi et
+ra hu
+se i
+bol t
+en ary
+le is
+kar l
+fr amed
+expla ining
+ab c
+de aling
+nat o
+ja ke
+exp and
+leon ard
+establi shed
+du b
+ar men
+el led
+voc al
+nichol as
+ori ent
+k yo
+illustr ated
+ah h
+danc ers
+milli on
+ge ta
+po pp
+as u
+mur dered
+gi ble
+sto ked
+gri ffin
+maxi mum
+adri an
+en counter
+ther o
+david son
+ðŁį »
+holi day
+ev o
+asse ts
+car son
+memor able
+âļ ½
+ob am
+represent ative
+cb d
+tr icks
+vo gue
+vo ice
+mm mm
+sebasti an
+cli f
+ath y
+par alle
+ðŁ¤ ·
+pa k
+ev acu
+e ats
+ا Ø
+tou ched
+organ ised
+spir its
+can ad
+gui ded
+frame work
+ðŁĮ Ł
+pe d
+natur al
+ag ar
+replac ed
+anch or
+ti t
+sha h
+organ is
+super ior
+r n
+ch ro
+eric a
+st ill
+cor on
+chu ck
+loc ks
+or gan
+ro sen
+sc am
+ben ed
+/ #
+ke en
+tre vor
+vamp ire
+sor ted
+! '
+af ford
+in tro
+gr ace
+ðŁĺ ľ
+sau r
+kick starter
+influ en
+v u
+y up
+po c
+ðŁİ ¥
+a ar
+s ang
+tre k
+et sy
+tb h
+scre am
+chevro let
+pix el
+shepher d
+an or
+gabri el
+tw ood
+sd cc
+me ters
+develop ers
+clo sure
+v w
+twit ch
+ì Ĺ
+se oul
+pr ice
+ho g
+n ish
+hill ary
+scrat ch
+in cen
+wag on
+dis ability
+pan ther
+ch ats
+g d
+wit z
+sus sex
+l ate
+den mark
+ger ald
+cancel led
+net te
+i x
+nav al
+bap tist
+te t
+y ad
+ma th
+ho y
+r andy
+po int
+intel lec
+fru its
+w ool
+gu in
+pr on
+the ft
+con dem
+mar ry
+n ola
+architec ts
+cin cin
+roc kets
+gentle man
+ex plan
+t ate
+do e
+ra ises
+wild life
+w l
+insi der
+blan c
+w p
+for sale
+ny c
+po well
+unbeliev able
+pen s
+goo dies
+mu stang
+p ens
+st ays
+squ ash
+xox o
+near by
+ever ton
+co co
+le agu
+k han
+stu d
+south west
+con struc
+s worth
+cro atia
+le a
+su ms
+aim s
+e an
+van ess
+iti ous
+pa thy
+arc ade
+b end
+sugge sts
+sac ram
+roy als
+ri er
+em ir
+in cl
+an k
+clar k
+ri ght
+vac c
+ठ¾
+tan e
+li b
+u sc
+sal es
+hu h
+s ally
+ver a
+p ga
+gro ws
+dru m
+tre e
+eth ics
+sug gest
+is ab
+se aled
+pre viously
+anim ated
+ab du
+ri ses
+glo b
+pre dat
+scar f
+del ic
+om ar
+ll i
+sx sw
+py thon
+ne bra
+fun k
+reflec t
+pav ilion
+tic ally
+ch asing
+bak ery
+inva sion
+ko h
+believ ed
+co hen
+con qu
+cra fts
+nat i
+cle ver
+govern ance
+sam ples
+fa ils
+â Ķ
+ti mo
+r itu
+stri king
+inclu sive
+sho cking
+can t
+requi res
+dra wings
+ภŃ
+purch ased
+du m
+z ach
+war ner
+con sole
+man sion
+foun tain
+circu m
+e sh
+is land
+mil k
+pro fits
+hali fax
+ri val
+âľĪ ï¸ı
+jen ny
+sand ra
+ny e
+k elly
+y al
+qu ad
+no s
+inste in
+fin alists
+mid fielder
+cu e
+excep tional
+a an
+sa pp
+gett in
+sa a
+f ati
+sl ice
+vol k
+s wal
+la sting
+sum mary
+it as
+sm o
+s z
+âĺ Ĩ
+ip l
+fl ames
+ene ws
+ha v
+hoo die
+pitch er
+win dy
+re vol
+centr al
+ton ite
+ðŁİī ðŁİī
+sol ved
+mil wau
+organiz ations
+wee ts
+re fin
+s th
+ãĥ ¼
+el in
+ton a
+cinnam on
+ðŁİ ¨
+ðŁİ ģ
+ron aldo
+pen insu
+ome ga
+el ds
+desig ning
+e igh
+blu et
+ben z
+nu g
+ash a
+robo ts
+su dan
+choo sing
+en do
+ser ge
+clo sely
+hand y
+fing er
+be ing
+ar te
+survi ved
+fl ame
+mile stone
+gu t
+d war
+fu tures
+é e
+el o
+fri dge
+eli c
+ou ch
+u b
+p v
+tit an
+col lar
+st ation
+nev ada
+aur ora
+r d
+dun can
+âģ ł
+bri en
+mar sh
+Ð ¾
+to tal
+ch ry
+s ers
+su ffe
+ra chel
+colle ge
+to days
+cour ts
+ch it
+re united
+gym na
+gen esis
+be side
+re presentation
+ch ant
+collec tor
+ra k
+ath ens
+ni gh
+mun ich
+langu ages
+fl u
+particip ation
+__ _
+c v
+spec trum
+so da
+co ver
+refe ren
+ab bo
+ap a
+public ation
+ed m
+mon ica
+ar my
+ðŁļ Ģ
+div or
+dr y
+stre ams
+robo tics
+ci der
+bull ying
+appro val
+sto ke
+plat forms
+sier ra
+ex tin
+i b
+ha yes
+succe ed
+suff er
+at ically
+da i
+lyn ch
+h ound
+del ines
+ack now
+d ated
+exclu sively
+he res
+fac ilit
+dam aged
+char ter
+la kers
+fal con
+unve iled
+wel ove
+e ase
+pati ence
+l one
+gent le
+gene tic
+produc ing
+g our
+shann on
+bil ities
+zimbab we
+p int
+dau ghters
+liter ary
+bel le
+cl am
+surroun ded
+k any
+ne il
+pir ate
+rang er
+hb d
+nat alie
+bel ong
+olym pi
+emb assy
+sc ol
+en er
+ak in
+lo ren
+b h
+: /
+di va
+den im
+hi pp
+ðŁĩµ ðŁĩ
+arn old
+? '
+we ren
+em power
+dis abled
+man or
+rasp berry
+b af
+aw ful
+dru mmer
+kar dashi
+n ash
+machine learning
+ch u
+rebel s
+tim ing
+mon roe
+ton gue
+ran ge
+pup ils
+re ss
+amaz on
+b z
+har ley
+pal mer
+ballo on
+s ings
+ic ec
+j b
+c ers
+g ps
+whi st
+ri se
+l t
+oo oo
+c attle
+shoo ter
+vod ka
+uc l
+mt g
+le sli
+jon as
+di spo
+at ric
+ste in
+vintag e
+fir ms
+flo yd
+cow boy
+soo oo
+is aac
+war craft
+disney land
+beauti ful
+be am
+franch ise
+bu n
+k ag
+an on
+tur bo
+swee p
+made in
+kar achi
+dete ctive
+penn sylvania
+contro versi
+vitam in
+a side
+chron ic
+descri bes
+remo val
+ha h
+ap er
+ten ed
+u to
+bad ly
+mir ac
+f ry
+ye a
+in jec
+ther mal
+comp act
+th or
+te ed
+ur gent
+l ite
+g illi
+sop hom
+ic o
+che m
+p m
+for k
+fre ak
+ch ak
+recipi ent
+i y
+ni k
+model ing
+c ans
+ðŁı Ģ
+del ux
+se am
+surviv ors
+rad ical
+investig ating
+reli able
+f m
+tur t
+ligh thouse
+to ol
+go wn
+) )
+bo ts
+auto graph
+a id
+bu ffe
+h mm
+horri ble
+ssi onal
+ann i
+๠Ģ
+k its
+sch i
+eter nal
+hu ss
+sens itive
+r u
+tast es
+chec ks
+im o
+por tion
+sk ate
+e den
+half time
+fri ed
+ri hanna
+ti se
+fl ick
+ca in
+s gt
+âľ Ķ
+sh au
+sta ined
+ra ffle
+dro ve
+sal man
+princi ples
+sh o
+ar u
+je ss
+gu ine
+gar bage
+my an
+jel ly
+dis ru
+z ia
+q ld
+ent ries
+la v
+fle w
+ad mit
+objec ts
+comp are
+ny times
+cann es
+p n
+suff ol
+ro c
+d ana
+e gg
+hi st
+coun sel
+' !
+phy si
+imag ination
+ad just
+explo sion
+plym outh
+hor ror
+elli ott
+bour ne
+de x
+bre ed
+au dio
+lob ster
+disappo inted
+nation wide
+( (
+incre ases
+austr ali
+ce dar
+star ing
+rac ial
+e is
+g mt
+visi ons
+stay ed
+discu ssions
+de an
+cur tis
+mai den
+stel lar
+happ iest
+h wy
+pre season
+car av
+mon days
+hospit als
+glimp se
+schol ars
+ja i
+ter race
+ann a
+goo se
+gra ded
+lot us
+hun g
+grocer y
+stam ps
+emper or
+sc oop
+in ser
+c as
+exist ence
+he al
+fal cons
+mar vel
+reduc ing
+terri fic
+magne tic
+perfor ms
+bar re
+p us
+tre ating
+ic on
+w h
+decla red
+tra uma
+do d
+come dian
+nik on
+bu gs
+as m
+mont gom
+ibi za
+comprehen sive
+ha s
+san ti
+fellow ship
+da sh
+p sal
+louis ville
+sp y
+fau lt
+d the
+fi led
+vi sta
+de sc
+fe ars
+you tu
+sp s
+es p
+ri g
+cri me
+ber ger
+wonder land
+k ent
+in formed
+stev ens
+my th
+ast on
+ir i
+visit or
+at ri
+produc ers
+al la
+person ally
+separ ate
+agen cies
+af ri
+il an
+spo ke
+n ina
+squ ad
+di ves
+de pend
+li v
+fier ce
+enter taining
+cha in
+sc at
+bor ders
+pal ette
+sp ro
+os is
+der by
+tobac co
+zi o
+willi e
+ju vent
+zoo m
+hol y
+enti rely
+af e
+mart inez
+be ds
+pe a
+bull dogs
+ðŁĩª ðŁĩ
+ib m
+ne on
+ethiop ia
+team mates
+plan ting
+tw er
+any time
+for bes
+ó n
+run way
+ner vous
+ro ger
+p ile
+ch anc
+apo caly
+u w
+o i
+dr ought
+territ ory
+br ick
+cre atures
+go in
+w aff
+gre n
+sou theast
+je an
+am bul
+ed ited
+stra p
+c v
+aar on
+ãĥ» ãĥ»
+t su
+descri ption
+kin dly
+clu tch
+im mer
+en or
+women sday
+or ange
+ra g
+ob vious
+hy der
+chann els
+man go
+me yer
+ra ining
+ge tty
+pil gri
+coordin ator
+up load
+ninten do
+don uts
+san chez
+app arel
+j r
+zz i
+, @
+jeff erson
+accessi ble
+great ly
+e id
+initi al
+budd ha
+par is
+ma scot
+â¬ĩ ï¸ı
+sch war
+si ri
+sp inning
+mortg age
+e cho
+end ange
+ge dly
+chlo e
+enh ance
+kar nat
+k ry
+explo res
+ðŁĴ ģ
+af fair
+ic als
+all a
+dar t
+dolph ins
+diffe rences
+squir rel
+au gh
+dr ones
+ell en
+re store
+pa w
+un for
+pi ke
+hil ton
+colla b
+consu mers
+co inci
+out comes
+pp p
+a q
+coup on
+li est
+si ms
+k ho
+av es
+spo on
+pu dding
+cor byn
+hat ers
+ex ams
+sla ve
+. !
+p sa
+app les
+tam il
+se d
+co ke
+zz o
+lo sange
+car bon
+cla ir
+... )
+k hu
+cra ig
+explor ation
+sanctu ary
+su e
+al way
+demen tia
+won ders
+super hero
+pakistan i
+brown s
+bluet ooth
+lo cker
+mar c
+ev entu
+delux e
+rodri guez
+âĿ¤ âĿ¤
+ro bb
+ðŁĴ ¦
+lin ux
+ten s
+intellig ent
+se ed
+vo ter
+s ler
+pe aks
+inter n
+teen age
+peninsu la
+hand ling
+ti e
+cou sins
+wen dy
+me e
+à¹Ģ à¸
+din o
+ðŁĴ °
+ðŁĺ ĥ
+ze e
+s bury
+trage dy
+b k
+bo re
+z in
+war ns
+idi ot
+tou ching
+contin ental
+tac os
+saf ari
+wa shed
+po dium
+morri son
+fore sts
+c bc
+al on
+partic ular
+be ads
+inv ented
+lo ch
+li ghter
+where ver
+i de
+docu ments
+a we
+k r
+no where
+min er
+st it
+ro x
+contribu te
+har dy
+cl an
+ob ject
+ca it
+ðŁĴķ ðŁĴķ
+happ ier
+vege tables
+t art
+g ag
+nom inee
+heav ily
+pan ic
+j d
+there sa
+at m
+u ph
+s fc
+su ri
+drin k
+n al
+re vel
+k l
+avoc ado
+nom ination
+ma donna
+shar on
+malcol m
+control led
+sh ers
+revi val
+legis lation
+shoo ts
+n in
+comm entary
+pro s
+human rights
+str anger
+mit ch
+pipel ine
+leg ally
+th u
+gil bert
+tol l
+gran ted
+gh s
+ir anian
+refre shing
+du k
+ab i
+pri me
+jose ph
+mo sa
+stati stics
+produc tions
+mer ry
+pat el
+sa x
+human itarian
+struc tures
+e missions
+town s
+fre el
+ster ing
+rat ings
+alle gedly
+cab in
+st l
+w ade
+fl yers
+tri m
+promis ing
+z u
+bal lot
+compar ison
+free ze
+ou ter
+great ness
+as sign
+snow y
+r ale
+tor ies
+med iter
+kno ck
+consult ant
+cincin nati
+analy st
+sc oo
+je ws
+appro xim
+pu re
+portra its
+cy rus
+ation al
+lo ans
+acqu is
+el u
+accep table
+uni on
+water color
+ru st
+batt les
+per fu
+seas onal
+ser ial
+mind set
+ri ot
+fel d
+enni al
+clo set
+pri est
+tan ks
+int l
+scre w
+bu m
+ab dul
+ou x
+expla ined
+ric a
+imag ing
+law yers
+bu ried
+ãĥ»ãĥ» ãĥ»
+ear l
+âĢ ķ
+l ton
+resto red
+stri pes
+fo ss
+de mands
+ste aling
+alex is
+mun d
+ak er
+ur us
+war dro
+hu gs
+gen re
+e go
+Ù Ħ
+particip ated
+bab es
+ban quet
+ti ous
+he mi
+ds b
+lo st
+milwau kee
+jen ner
+ge m
+ou tra
+lo ses
+id i
+re ps
+ðŁİ §
+regu lation
+fla w
+f ang
+vibr ant
+ram p
+ra ins
+well being
+so viet
+vie wers
+de po
+libr aries
+bi go
+ser y
+g ill
+de struction
+co z
+c x
+bri dal
+al ds
+plan ted
+amate ur
+lu d
+che ering
+show cas
+pro file
+i u
+ver tical
+pack ers
+wiz ard
+ski p
+s light
+be au
+air ways
+mu ch
+re ra
+ðŁĮ Ĭ
+ab sor
+pati o
+pack ages
+s ells
+ment ally
+ðŁĺ ¢
+reyn olds
+k are
+tri bun
+wal t
+kn it
+ta ste
+sur rey
+boun ce
+cre ature
+b are
+bet ting
+su re
+mi ley
+laugh s
+al ore
+cy n
+t l
+arti st
+ann ah
+war mer
+dynam ics
+lunch time
+mariti me
+vulner able
+ðŁĴ ĥ
+wol ver
+dur ham
+const antly
+am in
+si bl
+: @
+bul let
+k ach
+angel o
+wil der
+doo m
+desk top
+law suit
+k ca
+hen derson
+inv iting
+bet ty
+ta wards
+ra fa
+le aked
+and i
+ge ms
+af l
+vel o
+mediter ran
+pro be
+to tten
+steph anie
+sn ation
+com be
+q s
+over come
+assas sin
+ra v
+fil ip
+winni peg
+sh il
+determin ed
+k as
+ou tre
+regre t
+gui des
+aa a
+ðŁĺ Ī
+wi ves
+mani fe
+er ly
+sm y
+sh ima
+x ing
+pix el
+jac ob
+ac commod
+to y
+on o
+po o
+ti er
+an swe
+ðŁĴ ģ
+ro sa
+le ase
+bel ongs
+th ar
+eventu ally
+nei ther
+go a
+ski ing
+at ra
+ag h
+broad casting
+f ury
+py ram
+d ice
+volk swag
+wom ens
+provi der
+bom bs
+miss ile
+whi p
+d ick
+nor we
+back up
+el der
+mat ure
+concer ts
+gi ous
+sque e
+good morning
+bra ves
+^ _
+au ssie
+lun a
+mal es
+he ck
+for tn
+rome o
+steel ers
+p n
+pe er
+re presents
+Â «
+kat y
+migu el
+requ ire
+cha ins
+l ur
+immedi ate
+ti mber
+âĸ¶ ï¸ı
+advoc acy
+ex port
+an z
+tiff any
+auth or
+ðŁİ Ī
+du des
+chil ly
+hi d
+har m
+bu g
+mon ster
+terri er
+tu c
+story telling
+ta k
+in ti
+immigr ants
+b is
+reach es
+com passion
+john ny
+contribu tions
+ðŁIJ ¶
+mechan ical
+impre ssion
+ran ks
+ko be
+men ting
+bloss om
+pab lo
+buil der
+bom bing
+tw el
+sul livan
+om o
+pe te
+de mi
+ku dos
+w bb
+t gif
+mass ach
+neighb or
+che fs
+eng ines
+pun e
+ga ined
+phan tom
+s days
+ext end
+gr an
+cent ers
+jac qu
+dat asci
+sleep y
+el vis
+answe red
+s lot
+con y
+flexi ble
+ti ally
+le tics
+% ,
+andre ws
+si ble
+mom ma
+vin o
+do x
+invit ational
+twil ight
+j ade
+ill ery
+joh ns
+f ou
+p v
+-- ->
+break down
+billi on
+prin ter
+mon d
+c bc
+mag gie
+legi on
+du b
+kur t
+po or
+paren ting
+regi ons
+bikin i
+be ware
+si onal
+au burn
+kid ding
+amp les
+sp an
+con tempor
+c ic
+ha bits
+ak o
+pre fe
+bud dies
+it z
+em ily
+person nel
+moun tain
+ver sus
+ðŁĺ ¬
+ear ning
+s ink
+dar i
+u u
+s win
+i ster
+bru tal
+n ac
+kat a
+clo th
+am and
+ðŁĶ Ĺ
+ne o
+alu min
+week ends
+nebra ska
+co des
+delay ed
+brun o
+pro ven
+in c
+i ght
+fl an
+or o
+lam bert
+regu lat
+w f
+massach use
+kardashi an
+bern ard
+fi esta
+volcan o
+grand pa
+anc a
+d re
+st itu
+mean ing
+fo am
+au ck
+at ed
+r l
+hot el
+pers ons
+dy nasty
+ell or
+ma i
+am ne
+sty ling
+avi er
+e g
+vege tarian
+, â̦
+foun ders
+sta in
+g d
+cy cles
+sky line
+trac tor
+exi sts
+tra l
+kid ney
+mar il
+inst ag
+se tte
+addic t
+tri angle
+flash back
+controversi al
+z on
+p ins
+i as
+tr ay
+town ship
+deleg ates
+sp am
+h ms
+cr ane
+peop les
+o lo
+fac tion
+but es
+on ica
+deleg ation
+new profile
+eli er
+mc a
+w and
+g ely
+losange les
+ber ke
+ti ve
+dis rup
+zz a
+cas a
+jor dan
+ford shire
+ga thered
+ic hi
+atten dees
+à¸Ń à¸
+pe ppers
+co in
+bour bon
+ern ity
+ro tary
+behavi our
+jere my
+team work
+compli ance
+tre mend
+ðŁĩ §
+bu hari
+cam bo
+bu yers
+ha gen
+bu ds
+bay ern
+mon te
+sm ells
+an za
+ath lon
+descri bed
+work force
+gi ving
+ap i
+invest ments
+da il
+sel ena
+datab ase
+th um
+mor tal
+stu dent
+bu yer
+do ver
+gar ten
+att le
+loy alty
+gen oci
+holo cau
+theat ers
+ru ling
+ven us
+pat ent
+ch un
+ab by
+awa ke
+mass acre
+bang alore
+break ing
+simm ons
+ju sti
+hal e
+ed chat
+gg les
+haw k
+mar king
+head lines
+stro m
+co ve
+breath taking
+med als
+hair cut
+christ ine
+tele graph
+gujar at
+ju ra
+can e
+sho re
+propag anda
+mu eller
+.... ....
+sa vi
+stom ach
+thro ws
+ta b
+war m
+j ong
+reno wned
+hi r
+ra is
+mush rooms
+guaran teed
+bo a
+m j
+revolu tionary
+certi fication
+bru ins
+jo in
+w es
+pas sport
+c g
+sex u
+cap able
+w v
+ton es
+jac kets
+ac compan
+spin ach
+fore ver
+bla ir
+wat ts
+g l
+cou ples
+prairi e
+newprofile pic
+logi stics
+massachuse tts
+jagu ar
+o id
+we al
+under water
+mo z
+y i
+ma ths
+myan mar
+pre ps
+suffe red
+tr ace
+wal i
+ah hh
+bor g
+st itch
+cu lin
+real ise
+infe ction
+discrimin ation
+sh ame
+an kle
+hu mid
+y t
+brac ket
+tru ck
+tri u
+ea ster
+commun ity
+post card
+invol ving
+ty ler
+car amel
+over view
+ex amples
+integr ity
+base ment
+instru ments
+ani um
+at us
+gh er
+laun dry
+achi eve
+gen eva
+pr icing
+hyder abad
+beli ef
+me ta
+j aw
+accoun ting
+lead er
+cristi ano
+cou ture
+cy p
+vis ed
+, ,,
+k nu
+h ick
+break er
+br am
+ra b
+mo or
+ham as
+gradu ating
+pupp ies
+ak h
+ta h
+ach es
+ri e
+op ini
+g ta
+re ign
+tra gic
+re ver
+p ill
+pine apple
+tou ches
+da re
+le ys
+il o
+inter iors
+sc outs
+bar t
+en zie
+don o
+bro ck
+christi ans
+ense mble
+Â ·
+cine mas
+new port
+air line
+win ston
+le igh
+cont ents
+pre scri
+ur ge
+tr out
+fic ally
+il ia
+sub si
+are r
+âļ¾ ï¸ı
+w ounded
+ðŁĻ Ĥ
+pe pper
+ðŁĴ ŀ
+fit ted
+af f
+re sur
+thursday thoughts
+z ero
+archae ology
+di v
+je e
+i on
+awa iting
+co zy
+beauti es
+bal d
+dat a
+gri zz
+stal k
+kin ds
+cle ared
+jess ic
+regu lar
+ali ens
+plac e
+bo s
+bi zar
+thisi s
+ðŁĴ Ģ
+totten ham
+ma fia
+s lam
+ari ana
+car roll
+back pack
+care y
+uni v
+r g
+pe p
+dig it
+tatt oos
+ag on
+volunte ering
+diffe ren
+consu mption
+ka thr
+head phones
+t shirt
+o b
+ele ment
+re tail
+sh ru
+al gori
+contain er
+consci ous
+fi l
+com ing
+ra sh
+u rope
+def ine
+gi or
+femini st
+flow ing
+rout es
+gl aci
+fer t
+somer set
+ant es
+twee ps
+$ $
+h our
+endange red
+year sof
+ro h
+po pped
+bac king
+ba sil
+bra ke
+mon aco
+lgbt q
+pra gue
+ut ility
+cas si
+gate way
+haun ted
+sch ul
+ðŁİ µ
+shou ld
+walking dead
+comple ting
+dann y
+montgom ery
+pengu in
+ss i
+mer chandi
+ðŁij ij
+chur ch
+h ates
+cap tain
+brea thing
+ce t
+fair ly
+approach es
+compan ion
+surpri sing
+kany e
+pe y
+hin di
+targe ted
+lor ds
+de ut
+di gging
+ger man
+ru t
+ener gy
+close st
+y un
+apo logi
+ภ±
+s ack
+ru p
+dd y
+port al
+d ough
+b ats
+ðŁĵ °
+at ur
+graph er
+pi res
+mo tors
+ðŁĮ ¹
+j c
+dan g
+tu k
+clu e
+us c
+pag e
+d less
+bro ws
+ju s
+ad ing
+re marks
+oo m
+car dio
+ste fan
+arm strong
+âĢ¢ âĢ¢
+ni est
+belgi an
+bi op
+so y
+lo f
+í ĥ
+q t
+flashback friday
+ce e
+ģ à¸
+wre ck
+mar ines
+amend ment
+wardro be
+vo y
+bur ned
+guit ars
+ra inf
+li fel
+ssi l
+oun ce
+exter nal
+c key
+me sh
+she ikh
+inv itation
+sugge sti
+pop corn
+phenomen al
+an onymous
+tun a
+chic ago
+o val
+del y
+loc als
+( &
+pro f
+no vel
+fin der
+spar ks
+la ven
+in fu
+nic ks
+qu ant
+ra e
+exe c
+dist ingui
+st ances
+mu tual
+sh al
+unve ils
+edmon ton
+zan ia
+a dio
+vie wer
+brad ford
+audit orium
+qu is
+re act
+htt p
+l ero
+chee ky
+impac ts
+ta k
+ed t
+desper ate
+t ay
+ì Ħ
+sett le
+bar gain
+resu me
+un ite
+thro wn
+ke st
+se ys
+mar ching
+am it
+decl ine
+sch ar
+me tr
+stan ford
+lin ke
+ber ra
+dol ls
+rug by
+jam i
+b or
+road trip
+dino saur
+mi k
+sun der
+re m
+b k
+over seas
+nau ghty
+imple mentation
+iam srk
+lun cheon
+fir ing
+mi ami
+pere z
+the e
+z on
+gi fted
+con version
+ceram ic
+¡ ï¸ı
+pe dro
+ì Ĩ
+v ick
+! @
+he ed
+si d
+b w
+docu ment
+pl un
+gr ants
+fant asy
+predic tions
+vali d
+car ved
+gradu ated
+ðŁijį ðŁı»
+nation ally
+ch y
+af l
+re sso
+blan k
+ri vals
+j ig
+e ties
+om ics
+une mp
+b ound
+sk o
+inspec tion
+par al
+high s
+cri sp
+b ans
+ob a
+[ @
+co spla
+costu mes
+rec all
+mou th
+ni gel
+b ts
+ter a
+ko v
+do cs
+west minster
+dic t
+gra vity
+kar i
+ro gue
+t ted
+war k
+ida ho
+w end
+aw i
+queen sland
+proce sses
+cli ffe
+m ick
+com pens
+op ol
+the y
+cl ari
+wiki pedia
+salman khan
+haz ard
+pre ston
+swee test
+pd f
+che es
+tr ilo
+south africa
+bur nt
+( $
+con tain
+t p
+sub mitted
+sound cloud
+at u
+re z
+word press
+corru pt
+n f
+ma ker
+í ķ
+par as
+adv ent
+ri al
+ca fe
+fo ssil
+!!!! !!!
+co ws
+c j
+sp ur
+institu tions
+land mark
+ent it
+re ut
+h is
+alz heim
+we mb
+regg ae
+mo squ
+st at
+identi fied
+deal er
+re am
+re land
+ten sion
+ðŁĩ ©
+wra pping
+deep er
+fr at
+red dit
+ar is
+moroc co
+.. "
+b low
+ma pping
+pri orities
+ing a
+swa p
+re wards
+conspir acy
+creati ve
+c j
+congre ssional
+vau lt
+ple x
+sophom ore
+shad ow
+ele ss
+ðŁĺ ħ
+dar ts
+aldu b
+anno ying
+pro ps
+n as
+alumin um
+h bo
+offen se
+j ill
+oni ons
+la ur
+ta e
+har dest
+sh ro
+ga ining
+meas ure
+ed tech
+cyp rus
+tar a
+ang eli
+car lo
+go on
+all i
+im plic
+ju pit
+resil ience
+ha il
+bal anced
+) ...
+joy ce
+gr a
+th eli
+defin ed
+shi pped
+main ly
+min a
+l m
+sac ri
+o ber
+p im
+claim ing
+ent ers
+co rey
+bo k
+cri ed
+cool ing
+dani elle
+pharmac y
+thor ough
+ca ke
+k lo
+outre ach
+z ens
+digital marketing
+val ent
+sn p
+her b
+mr w
+caf é
+cap tures
+no tre
+triu mph
+pan cakes
+cu mber
+spi ke
+d ation
+bi gg
+sp er
+crit ical
+am al
+too th
+foun ding
+a stro
+' #
+quan tum
+th ames
+un c
+pri de
+air bus
+kno cked
+un defeated
+mediterran ean
+cal cu
+clo wn
+sens or
+ham mer
+for give
+cu shi
+ber ry
+maje stic
+elec t
+polit an
+g ta
+k ari
+bur ke
+sea hawks
+volkswag en
+re i
+landsc apes
+cas u
+grand father
+list ened
+/ /
+star trek
+rainf all
+fur ry
+vi er
+star k
+rif le
+ff a
+leg es
+hillary clinton
+min us
+correc tly
+architec tural
+pre ce
+up side
+box er
+ðŁĻĮ ðŁı¼
+is ai
+de t
+pro vo
+tis sue
+spoo ky
+ve led
+re con
+prospec ts
+que bec
+âļ «
+ig no
+anat omy
+shap es
+w p
+p interest
+hor e
+an es
+pick up
+ti p
+pra desh
+hu gh
+co e
+po k
+gram my
+well ington
+sti gate
+ri gh
+lea p
+king ston
+scen ic
+go sh
+v ani
+au g
+s ary
+zi er
+bure au
+lin son
+con te
+fra gr
+all an
+g aw
+lan a
+colli sion
+surve ill
+ren ais
+ar range
+s ali
+do in
+br ance
+bren dan
+our se
+in coming
+suspen sion
+à ´
+l la
+educ ators
+in tri
+da e
+bio graphy
+bul gar
+villa in
+go thic
+rw anda
+e w
+may or
+meet up
+democr at
+mor gan
+su dden
+te sco
+car rot
+bom ber
+mck in
+re ne
+fun day
+agricul tural
+haha h
+show time
+form ing
+col a
+scor pi
+quo te
+po ppy
+s life
+d az
+tu b
+ne n
+mo t
+ðŁĺ »
+s ore
+elder ly
+o ve
+skin ny
+um i
+anc o
+man ship
+we re
+g v
+k ah
+fol ding
+ne at
+samanth a
+dan ish
+uk rain
+humid ity
+nu tri
+jak arta
+cand les
+oooo oooo
+at ile
+streng th
+i bra
+bap ti
+charle ston
+fr ames
+girl s
+clear ing
+glu ten
+# #
+super natural
+ju bi
+ph one
+he in
+dr un
+le ak
+invest or
+y er
+dom ain
+ball room
+mi sh
+app li
+off shore
+bla ze
+dor o
+âĺķ ï¸ı
+win ery
+shar if
+ad ore
+n ir
+saf er
+si gh
+as cri
+strong ly
+trac y
+ck er
+ol l
+faith ful
+ey ed
+deli ghtful
+vis m
+karnat aka
+tit an
+wh ar
+jer seys
+re fur
+heav en
+gri p
+pan ama
+pre li
+glu ten
+o dd
+cont ent
+pon ti
+tion ing
+e commerce
+feder ation
+flaw less
+ge ar
+ti res
+by r
+pol ice
+cu ban
+tri butes
+tic ul
+chur ches
+nur sery
+di aries
+muse ums
+snapp ed
+i van
+wi ght
+touri sts
+ramad an
+t rent
+prophe t
+won dered
+focu sing
+hi d
+ic ons
+i q
+ambul ance
+pi st
+fun niest
+time less
+sr ilan
+bu ys
+ki ds
+colour ful
+a shi
+ch ir
+mu m
+ðŁĵ ļ
+let ter
+x en
+reut ers
+pre serve
+in ting
+ste p
+fu ji
+uni ver
+i u
+show down
+po ems
+surveill ance
+suspec ted
+ta e
+sol ving
+tom b
+mother sday
+car pen
+recru it
+pil ots
+bro c
+mix ing
+fri days
+ty r
+represent atives
+tra pped
+abdu l
+free style
+clu ster
+âļ łï¸ı
+k d
+sk ill
+pit t
+ex o
+commer ci
+muse um
+loc ally
+g ina
+no bel
+immun e
+fr ac
+cap su
+main ed
+attemp ts
+bull dog
+be spoke
+sing ers
+sp elling
+seg ment
+nat ures
+tic k
+lip stick
+clean er
+gett able
+preci sion
+â̼ ï¸ı
+th ood
+re ef
+no pe
+bill y
+di gi
+mu si
+ri val
+figu red
+tal ity
+sun ny
+ber k
+aw ww
+awa its
+un real
+co pen
+asy lum
+ex otic
+bu en
+mo ck
+en able
+arch y
+fr a
+pla stic
+al mond
+amp li
+displa ys
+abbo tt
+s me
+x p
+ðŁĻ ĥ
+graph ic
+i ved
+mar a
+cau tion
+lea ks
+en berg
+ul u
+unic orn
+cann on
+appren tic
+ðŁĺĺ ðŁĺĺ
+b ball
+wil low
+at ics
+am as
+manufac turer
+campaig ns
+port ers
+flo ors
+l su
+ty pe
+ke j
+honor ary
+it im
+to le
+min ecraft
+d x
+ma sh
+ri o
+consequ ences
+ron ald
+go ssi
+suffol k
+mu se
+r bi
+live music
+i van
+ðŁİ ¤
+le u
+patri ot
+man it
+lan ca
+home decor
+de ar
+sig ma
+ti de
+str ings
+v ita
+sequ el
+try na
+inve stigate
+bor is
+ve gan
+barri er
+mind fulness
+web b
+hu stle
+in da
+tan zania
+str ay
+tex as
+c ag
+diagno sis
+wom an
+g w
+ob session
+l ative
+nu fc
+fl ynn
+moment um
+sof a
+wal d
+vege table
+tu cker
+supp er
+se ab
+ar ro
+se ag
+ven ting
+counc ill
+sp lat
+cal cul
+.. #
+com fy
+odi sha
+sto pp
+war fare
+ca es
+à ¨
+co y
+price less
+in sec
+ðŁĺ Ľ
+contro ls
+empower ment
+datasci ence
+per pe
+gen ic
+e res
+tru deau
+man o
+sla very
+expand ing
+ma he
+fa iling
+s aga
+photograph s
+cre st
+re on
+surf ing
+hi e
+ðŁį Ģ
+ja e
+fel lows
+south ampton
+sol om
+ce ster
+tab ility
+hor n
+se ct
+he e
+cole man
+at las
+explo rer
+consul tation
+copy right
+organi zing
+den ied
+mon keys
+noo dles
+br is
+fl or
+dou gh
+bon ds
+sho cked
+eco system
+care fully
+w m
+apart ments
+cur ve
+san diego
+must ard
+comm en
+cere mon
+e ch
+ru th
+ðŁĻĮ ðŁı»
+hawa i
+fil med
+te ar
+as ingly
+ca ir
+wat t
+instru ment
+ou tta
+ye ol
+river side
+ë °
+. :
+nor wich
+alo g
+migr ants
+new man
+ri de
+spr ink
+targe ting
+beli eve
+tor ch
+reflec ts
+per mission
+ff man
+ene mies
+bas ics
+se ized
+sun days
+le i
+hass an
+en do
+h c
+st ad
+le ments
+kk kk
+nan o
+shar k
+man a
+on ic
+treat ments
+ear ly
+collabor ative
+shu ttle
+bran ches
+mis ses
+mained cm
+ap ers
+ky le
+carri e
+leis ure
+sh et
+bir ding
+adv ances
+ðŁĵ Ŀ
+popu lar
+di ane
+a be
+re war
+neigh bour
+k pop
+remem brance
+play ground
+ru b
+krish na
+e bola
+inqu iry
+ep a
+lu min
+organ isation
+abra ham
+norm ally
+pre ten
+jan et
+w t
+ðŁĴ İ
+encoura ging
+a stic
+bu mp
+syd ney
+s z
+ss ss
+gar rett
+ðŁĵ »
+consul ting
+roman ia
+spo tting
+chanc ellor
+ar ma
+presti gious
+ðĿ IJ
+t ad
+cry st
+compe tit
+rati o
+cat aly
+bro w
+j ur
+vi king
+commu te
+y day
+la yers
+du mb
+esc al
+genoci de
+f ill
+gu pta
+ste pping
+se i
+fo to
+wild cats
+col i
+projec t
+ear nings
+st r
+ge ons
+comple tion
+b m
+decor ated
+craw ford
+af ghan
+sc are
+visi bility
+hi b
+direc tion
+stro ll
+christ ina
+alter nate
+cl are
+sty list
+be hold
+s ance
+leop ard
+acqui red
+narr ative
+ash i
+the a
+?? ??
+pe as
+at ch
+sli des
+le en
+renew able
+eng lish
+qu ir
+co aster
+r x
+fo ols
+match day
+mis m
+amaz ing
+z ig
+ke ting
+won t
+to wel
+di ab
+sta ke
+n m
+mel t
+e than
+gra pe
+polit ician
+sm en
+í ĺ
+re o
+wedd ings
+cat cher
+or acle
+me mo
+ðŁĮ ´
+ec k
+rob bie
+norwe gian
+oper ator
+am or
+se wing
+ju l
+x ie
+u v
+fif ty
+me ga
+tatt oo
+liber als
+u pri
+traffic king
+richard son
+su v
+ki p
+mess y
+tremend ous
+gl ou
+cour tney
+la d
+stere o
+my ers
+i dio
+^_ ^
+man ning
+dy e
+w d
+thr one
+jun k
+as u
+provin cial
+k ook
+wr c
+fine art
+hamp shire
+renais sance
+b red
+fall out
+s j
+sn l
+al am
+tor ture
+fy i
+sh ines
+pa w
+ch ar
+hen ry
+c row
+aci ous
+di an
+pa ige
+ba re
+stock holm
+scen ery
+ðŁĩ ·
+jef frey
+pu sh
+decor ation
+ne d
+cu te
+brig ade
+laven der
+inv ites
+e sports
+vo ir
+dri ed
+tran spl
+sur geon
+no vels
+pul ls
+son y
+lun ar
+man e
+i vy
+fru str
+dor set
+sa i
+tor res
+ssi on
+shut down
+suggesti ons
+writ ing
+e o
+battle field
+u ga
+ðŁIJ ¾
+vac u
+spl ac
+g it
+u g
+high land
+% )
+mer maid
+sacram ento
+ta ils
+p w
+ka h
+t ell
+enh anced
+ì ķ
+auck land
+cru el
+ðŁ¤ ©
+au dre
+sail or
+gram mar
+g love
+de on
+infl am
+fresh ly
+k ell
+zi p
+christi e
+mil d
+di xon
+instru ctor
+g ence
+ãħ ł
+sub jec
+constitu tional
+crow ds
+in visible
+ru ins
+da k
+si p
+pla que
+p ouring
+comple x
+z ine
+ste ad
+f let
+trans mission
+lo way
+ar un
+incre asingly
+au d
+transp aren
+cro wned
+sc oun
+blizz ard
+lux u
+fi ers
+achieve ments
+hun ters
+rock ed
+bas in
+vio let
+pro ves
+achiev ing
+pro sper
+se ga
+flo at
+vi an
+xi v
+pol ic
+tur a
+approxim ately
+wander lust
+keep ers
+geta way
+co d
+pol is
+br yan
+col ts
+tal ents
+yo gur
+gluten free
+wri st
+gr y
+cze ch
+ðŁİ Ī
+ev ille
+ðŁı Ī
+to x
+dani els
+am er
+bi ds
+weare one
+me tab
+g t
+boy z
+pd x
+pos session
+pu shed
+shr ine
+reali stic
+tri gger
+na vi
+ru mors
+n af
+jen kins
+tr un
+comm uni
+Ã Ĺ
+gam ers
+arm or
+moham med
+bal cony
+y ah
+stron gest
+rhy thm
+unfor gettable
+k p
+ho bb
+custo dy
+greg or
+r ita
+aes thetic
+il ation
+sponsor ing
+n ay
+kid napp
+sh s
+ra jas
+me g
+signific antly
+butt ons
+la c
+ver sions
+essenti als
+opini ons
+k ro
+d printing
+wi dely
+d k
+ur an
+y al
+reque sted
+c n
+cur ric
+plu m
+gr un
+v m
+dev on
+m yo
+rel ation
+juvent us
+rou ge
+min ority
+min es
+jupit er
+n ine
+oxy gen
+fran kie
+une sco
+fab ric
+disgu sting
+sal man
+dete ction
+lan ka
+d ac
+ðŁĩ« ðŁĩ·
+argu ment
+shel ves
+cel tics
+rober to
+pi gs
+he dge
+fau l
+pow ering
+butter flies
+fi r
+re make
+att i
+com o
+emp ha
+kend all
+poke mon
+se ating
+d ans
+bald win
+ðŁij »
+lesli e
+one direction
+ti mber
+im an
+fon t
+e der
+di on
+ste ph
+for mat
+gre gory
+pro p
+he x
+ru in
+sor y
+inf er
+n aw
+bar ak
+sd gs
+kar ao
+lu sh
+v ander
+end ent
+g is
+a fro
+soc cer
+ay an
+t uni
+lun g
+da yof
+alex a
+mar ath
+addic ted
+ag ile
+hy gi
+light weight
+ì §
+mand ela
+jo ey
+anc y
+hu m
+bi r
+memor ial
+jim in
+ging er
+v ak
+jav ascri
+cro ps
+orig ins
+d ari
+pi per
+im port
+aggre ssive
+predic tion
+re pairs
+cr acker
+voy age
+ni ke
+mu mmy
+linke din
+country side
+bor der
+gla ss
+per t
+s als
+sho e
+autograph ed
+wal nut
+colle gi
+sal ary
+pa iring
+ðŁĮ ¸
+cath ol
+swee the
+defe ats
+streng then
+roof top
+impro vements
+barri ers
+ur u
+t ally
+ru led
+ðŁĨ ļ
+nai ja
+emo ji
+per cent
+gi o
+pro bs
+on ce
+adm its
+pa ths
+li ar
+day tona
+pe ters
+cal i
+cal li
+mu g
+o sa
+ap h
+ab y
+hy de
+eth nic
+pla ins
+ol f
+haha hahaha
+holi c
+?! ?!
+su bli
+bl acks
+mo t
+gh ton
+lo vin
+b rent
+bar u
+l ati
+de w
+ate au
+q a
+pain ful
+bu sters
+st atic
+ðŁĩ¨ðŁĩ ¦
+note book
+out fits
+si es
+r f
+floo ds
+Ñ Ģ
+thro at
+su ici
+ro vers
+beng al
+pre pares
+blo g
+mini ature
+Ø ¨
+am phi
+com b
+r sp
+in timate
+green e
+Ì ĩ
+al tar
+surg ical
+ves sel
+... ?
+gav in
+g ator
+threat ened
+z ar
+rob bery
+di er
+promo ted
+y g
+x s
+su bs
+inter viewing
+threat ening
+do zen
+me ado
+water fall
+nintendo switch
+cal um
+mini sters
+dro p
+univers ities
+war ned
+tac tics
+ðŁĩ ²
+refu se
+ad ju
+v ast
+ðŁĺ ´
+mc fc
+lib ya
+no filter
+distribu ted
+re ser
+ron nie
+de co
+javascri pt
+mon k
+intere sts
+fle x
+mar tha
+sti es
+oo d
+ðŁ¤£ ðŁ¤£
+e un
+b ali
+g omez
+sti mul
+moder ate
+d ity
+ir is
+stra w
+consist ent
+direc tions
+adop t
+sal sa
+cro o
+reco vered
+black friday
+lan caster
+accep t
+weareone exo
+buil ds
+free man
+air plane
+diti on
+bel ong
+jam ie
+pit ching
+li f
+om in
+cri spy
+pre pping
+ve g
+chan g
+accompli shed
+graci as
+dolph in
+elec tor
+culin ary
+super bowl
+wal a
+pur suit
+black berry
+be an
+cardin al
+pro ved
+immigr ant
+stric tly
+holocau st
+pass age
+ha us
+cou p
+pur se
+har ass
+< <
+le ed
+ado be
+st ad
+legis lat
+par ked
+pri yan
+sil va
+kri st
+s the
+fun ky
+ig a
+sett lement
+ph s
+t mrw
+stre ssed
+hun t
+ho ckey
+treas ures
+cham bers
+ol u
+hu t
+mar ley
+tex ture
+wilder ness
+mm ing
+poten tially
+om aha
+ju dy
+to es
+spo iler
+distingui shed
+feli x
+ah u
+recommend ations
+zom bies
+hit ler
+tri ple
+colla pse
+motiv ated
+ulti mat
+gg ling
+so y
+ci gar
+fo ren
+vine yard
+gl itter
+fin dings
+colon ial
+hun ter
+eri k
+den s
+beet le
+lot te
+sub tle
+s matter
+tru sted
+experim ental
+nam ents
+ðŁĺ Ĩ
+regi on
+acquis ition
+bre eding
+quarter back
+am reading
+oo td
+ru de
+initi atives
+st out
+hy ung
+out come
+al fred
+mic s
+exper tise
+bacter ia
+pengu ins
+jump er
+valen cia
+bar k
+ing day
+sell ers
+contrac ts
+hou ston
+commissi oned
+adap tation
+swan sea
+santi ago
+common wealth
+ju dging
+sub mission
+sco rer
+tom my
+ñ o
+ex quis
+fil ing
+explan ation
+alli son
+wemb ley
+ri dge
+chev y
+san tos
+own ership
+cogn itive
+favour ites
+sh ed
+phil anthro
+dele ted
+go dd
+s nor
+gui delines
+ff ing
+je ep
+cli ps
+sw amp
+an or
+guil d
+bol ton
+spring field
+munici pal
+goal keeper
+ye on
+ðŁĺįðŁĺį ðŁĺįðŁĺį
+ãħĭ ãħĭ
+water front
+gra ve
+contempor ary
+ar ity
+ÃŃ a
+sle eps
+sy rup
+al am
+pi re
+co yo
+moto gp
+ty son
+kej ri
+cir cul
+sing ly
+cr unch
+complic ated
+nostal gia
+k op
+mo ve
+k ale
+mac ro
+mid west
+h ans
+tri bal
+nu de
+௠į
+bey once
+congratul ate
+cat er
+leagu e
+ðŁĻ Ĭ
+la dder
+cra shed
+tech nic
+karao ke
+harass ment
+ro ts
+experi encing
+kri sten
+ðŁĩ ³
+ðŁ¤ Ĺ
+reflec tions
+guin ness
+illustr ator
+ðŁĻı ðŁı»
+cen ter
+nar row
+comm ons
+regul ations
+Ù Ĩ
+har m
+cro ft
+cu ssion
+hong kong
+st ical
+intern ship
+zo e
+cho p
+hoo ds
+estim ated
+batter ies
+berke ley
+smooth ie
+shau n
+cro s
+~ ~
+cam pe
+hu mp
+b g
+proto type
+cl ick
+shaw n
+re viewed
+tem pl
+p f
+jed i
+blo gs
+ray mond
+as th
+ba h
+av ail
+scot ch
+leaf s
+nik ki
+to k
+hol low
+ur ges
+of t
+un like
+lat in
+u e
+cat ering
+mil i
+alter nati
+ma ver
+Ð ¸
+ag le
+pre order
+lu x
+cu cu
+ðŁijı ðŁijı
+t art
+âĿ¤âĿ¤ âĿ¤
+arab ic
+rapi dly
+ar rang
+all en
+travel tuesday
+pa ws
+flo ws
+st ability
+flu id
+ca pp
+can berra
+uu uu
+sp ani
+demon stration
+m la
+plac ement
+m w
+presi dents
+awe som
+bever ly
+ani st
+ne al
+father sday
+referen dum
+la hore
+o aks
+deb bie
+half way
+gho sts
+de bor
+matthe ws
+fi at
+t fw
+pre sen
+rob i
+de d
+bro ck
+laugh ed
+am ounts
+bam boo
+kinder garten
+eat en
+mtv hottest
+break out
+u sic
+fra ser
+legis lative
+p ang
+modu le
+sam my
+go ver
+ear ns
+expe dition
+gar h
+concep ts
+char lie
+la va
+bachel or
+veg gies
+deter mine
+el lie
+un locked
+fru it
+dal la
+cou pe
+wash ington
+depo sit
+iv ory
+pau la
+chic ag
+gu cci
+ðŁİ ĥ
+cul tiv
+pier ce
+li fted
+stu mb
+re cover
+musc les
+conduc ting
+cb s
+mcla ren
+sophi a
+cel lu
+oce ans
+up loaded
+game play
+mal dives
+kim ber
+avo i
+rac er
+ca ine
+cav s
+h ana
+li ga
+ra ven
+inter vention
+inaugur ation
+oo h
+at traction
+merchandi se
+tune in
+li king
+juni ors
+int ended
+att acking
+aqu arium
+i wd
+comp onents
+sur ing
+cent u
+yogur t
+ðŁı ĥ
+show room
+op tical
+ty our
+ju dge
+yi eld
+an to
+pl c
+transparen cy
+recy cled
+chi ef
+ar om
+ambassad ors
+plan et
+âĿĦ ï¸ı
+om ed
+vaness a
+cour t
+mar gar
+hal ey
+v r
+reg ina
+pd ates
+hi span
+live stream
+âģ £
+ya hoo
+gal la
+secu red
+w ir
+bene ath
+off l
+n il
+am b
+ye g
+out let
+u te
+pe ep
+lind say
+bent ley
+... !
+he el
+trilo gy
+vo s
+ty re
+there fore
+tor onto
+ab i
+simp li
+ja e
+exten sive
+eleph ants
+s or
+orient ation
+im peach
+re play
+constru cted
+peter son
+pa is
+por ted
+custom s
+colla p
+ad u
+high lands
+sal em
+shel by
+ko vic
+stra in
+ro sie
+sen ators
+snap s
+bo bb
+suz uki
+bla des
+k p
+lo lo
+gener ate
+si ght
+ma e
+struc tural
+predic t
+jump ed
+ah mad
+sun g
+just ice
+gla m
+vol vo
+jubi lee
+de tention
+lo sses
+pu ri
+every time
+Ð °
+ra o
+ed ge
+li mer
+rese mb
+har old
+re tri
+sacri fic
+surpri ses
+am c
+srilan ka
+bar bie
+men s
+fin n
+ag s
+ukrain ian
+em brac
+î IJ
+flav ors
+hom er
+lau re
+ou th
+pr iced
+ver de
+fir m
+ah s
+cu b
+tre y
+par anor
+pro fit
+in dv
+who a
+har sh
+al ot
+crit ics
+hu bby
+fi gur
+gi ra
+ca stro
+chan el
+in put
+origin als
+ten ant
+yy yy
+ture rs
+lincol n
+co on
+lear n
+ch ou
+ac are
+o les
+din er
+hy p
+bizar re
+mc r
+let sgo
+decor ating
+ðŁĮ İ
+al ison
+ar vin
+f d
+reha b
+mccar thy
+lot tery
+da h
+minne apolis
+eli gible
+diagno sed
+emer ald
+destin ations
+s ans
+or y
+bla zers
+n v
+ba il
+digital art
+no c
+mal ta
+sol ar
+pi pes
+alleg ations
+no ck
+po pe
+bri d
+premi er
+n x
+present ations
+ef a
+bo ws
+val ve
+opp onent
+Į ë
+visu al
+ing le
+cate gor
+e ter
+po is
+dan i
+at tract
+neu tral
+th ene
+cra shes
+fred die
+ut ili
+c st
+awak ening
+slo ven
+quali fy
+pro of
+fair y
+le v
+fre ight
+enjo ys
+cup cake
+flav our
+â ķ
+protec tive
+ðŁijı ðŁı»
+is u
+ad mir
+h mmm
+continu ous
+ai res
+rap tors
+showcas ing
+y uk
+pa ste
+follow er
+instru ctions
+sp ru
+@ __
+the o
+debu ts
+ve tte
+sto w
+es of
+ach ed
+sul tan
+sand wich
+som alia
+franc o
+car ne
+flu ffy
+al pine
+jas mine
+he ated
+viol in
+ple ss
+divor ce
+per former
+phi es
+port sm
+dar a
+kir by
+lo p
+chill i
+for th
+sky pe
+ðŁĩ®ðŁĩ ¹
+celebr ities
+ed y
+ve e
+po ison
+ey el
+gra bs
+ssi c
+un o
+wester n
+rail road
+am er
+numer ous
+s v
+fo w
+fi st
+âĢ ĭ
+reque sts
+mar tial
+em my
+accept ance
+lau ra
+ภ´
+er up
+hyun dai
+out lander
+u tt
+wrest le
+esp resso
+demand ing
+g dp
+geo graphy
+sas kat
+tro ll
+confe der
+su es
+se m
+be ts
+t ful
+to sh
+teach es
+col oured
+gal way
+mac y
+dis orders
+bb cra
+at em
+fen der
+lit ter
+e sh
+provi ders
+renov ation
+nomin ate
+ps g
+nomin ations
+jen na
+shar p
+some day
+z ur
+bra ins
+che shire
+pre y
+hu go
+Â ¿
+to ken
+r v
+car r
+tac tical
+zel da
+kay la
+fern ando
+photograph ers
+j our
+umb rella
+woo dy
+congress man
+du mp
+le vy
+ju an
+d azz
+sign als
+la in
+an u
+mic hel
+por ch
+al den
+sibl ings
+y ale
+pe el
+sw ick
+gg in
+ll c
+k ale
+s con
+il d
+pat reon
+re el
+qu in
+wit t
+mar ty
+moo dy
+ton i
+der y
+g ators
+speci fically
+dd in
+ly on
+tr ick
+meado ws
+p j
+bor gh
+vi k
+tu r
+bron x
+pu ff
+lan tern
+ðŁ¤ ¦
+g ently
+be stie
+fac t
+refu sed
+fas ci
+mp y
+ðŁĶ µ
+cross over
+mead ow
+indian apolis
+duc ation
+sle y
+loo m
+mix er
+new music
+film maker
+prosper ity
+li m
+week end
+cre amy
+neu tr
+lu ther
+h v
+nor thern
+tw o
+h ra
+cat ches
+appear ances
+ha bit
+kitt ens
+n v
+illa c
+inf an
+regar dless
+liz ard
+dun k
+cur tain
+ac om
+in tu
+ve z
+e min
+fl ats
+calend ars
+em power
+ru ined
+hun gary
+vi d
+we x
+u lum
+aber deen
+o sa
+k t
+ma ssi
+se emed
+s den
+' ?
+tele phone
+de fi
+insp ires
+me ow
+z ones
+bl ind
+pl y
+tuc son
+advent ure
+ge d
+oy ster
+ðŁijıðŁijı ðŁijı
+out put
+tt t
+metal lic
+sma sh
+ucl a
+sco ts
+perfe ct
+lu cy
+regular ly
+sp ic
+rel ative
+ath ers
+mis e
+batt ling
+deci des
+mat a
+occu pied
+random ly
+cat softwitter
+gi an
+ball y
+al ties
+al lies
+im men
+sy rac
+ðŁĴľ ðŁĴľ
+l lan
+au r
+k ut
+lam ar
+affe cts
+n ra
+star war
+ðŁ¤ ĺ
+sc ram
+en chan
+pro cess
+luxu rious
+ar ray
+sher lock
+comp ati
+dor f
+stre ss
+m su
+s with
+sal a
+sof instagram
+fo il
+under stood
+qu ay
+r p
+c ade
+ja w
+en ab
+en coun
+ðŁİī :
+do ck
+satur n
+mu ll
+lay out
+ra rely
+happ ily
+fix ture
+or ph
+over looking
+her bs
+m itt
+pil lar
+nol an
+pe tty
+str y
+u i
+mu k
+o res
+o vers
+á µ
+re creation
+we sley
+ri t
+kejri wal
+sto cking
+g v
+subscri bers
+moo se
+ma e
+ber t
+opp re
+assign ment
+u ro
+high lighting
+cal vin
+we igh
+cambo dia
+av on
+ke m
+dis abilities
+read y
+char gers
+p ads
+iz ing
+illi an
+tru ste
+col leges
+associ ates
+alban y
+mil ton
+cr on
+bu r
+har dly
+si ghts
+anti ques
+e cho
+surpri singly
+ha iti
+cap t
+ph p
+op io
+ine quality
+equ al
+ken y
+sch mid
+autograph s
+ren t
+qu er
+cit rus
+challeng ed
+te c
+epi de
+fe st
+z hou
+li me
+citizen ship
+cry stal
+convin ced
+mess enger
+copen hagen
+âĿĹ ï¸ı
+war ran
+develop ments
+ï¸ı âĥ£
+fore x
+hi ro
+sne akers
+xi de
+vi va
+stere o
+bat ting
+ss el
+ho st
+beng al
+critic ism
+q c
+cr un
+attemp ted
+ry e
+determin ation
+cre ations
+d read
+label s
+pos se
+anc er
+joh an
+si ster
+partner ships
+les bian
+k st
+guaran tee
+bar o
+fix ing
+ma son
+m ous
+chem icals
+t less
+bio diversity
+par o
+bhar at
+ac ol
+refu ge
+en te
+t iti
+dys sey
+respon ds
+lef to
+in er
+se vel
+rahu l
+ol ine
+frank fur
+cho reo
+enjoy able
+c to
+strugg les
+wood land
+heavy weight
+gen s
+rece p
+ac cred
+ðŁĺ ¡
+trans formed
+list en
+at op
+n k
+sur ge
+be re
+gover nor
+prison ers
+clau de
+t ill
+mu lator
+emo tion
+water loo
+star t
+ðŁĩ º
+clean ed
+grand mother
+fear less
+afric an
+astron omy
+ðŁı ģ
+ภĻ
+the world
+su itable
+anth ony
+k and
+tt en
+meaning ful
+disc lo
+jaco bs
+Ã ¸
+tom linson
+ghe tti
+ty pho
+sub stan
+as co
+te k
+nag ar
+mu d
+am on
+vacc ine
+f ty
+fle sh
+no el
+infl ation
+portu gue
+glam our
+tra m
+v re
+te qu
+roun dup
+w yn
+rejec ted
+mosa ic
+si ghting
+cal f
+o ta
+com position
+go pro
+gonz ale
+e ed
+b ard
+tu e
+effec tively
+we en
+al to
+ri bs
+rel ate
+thir sty
+fu rious
+di m
+ch ard
+perfu me
+s ny
+chur chill
+k of
+master class
+wa ve
+ðŁĶ µ
+er in
+own s
+to be
+sk illed
+te m
+go f
+en i
+tor i
+cra zy
+l ick
+resi stant
+ici al
+ag ar
+! :
+g ali
+del aware
+bl itz
+koh li
+pu ck
+avail ability
+hi malay
+influ ential
+cro chet
+victor i
+read ing
+ho bby
+vie t
+j as
+en gra
+sk ul
+ðŁĩ² ðŁĩ
+educ ate
+tech no
+distric ts
+blu es
+se tt
+seven th
+lear ns
+ee ee
+apocaly pse
+hang out
+cru el
+mu tu
+bru h
+hel en
+she er
+c tion
+kle in
+tex ans
+ce real
+sh ine
+ne red
+gra s
+am bro
+f ella
+hin du
+matthe w
+li ma
+mir anda
+je wel
+so ho
+euro vision
+neighb ours
+chand ler
+be sides
+ðŁ¥ °
+ast ros
+thu mbs
+ren ault
+ra ve
+hi red
+ðŁĸ ¤
+it ary
+z or
+bla zer
+k ine
+ea u
+kat y
+dc comics
+pe c
+ro dgers
+water proof
+kill ers
+super int
+pre serv
+as so
+brew ers
+promo tional
+sc am
+villa ges
+sket ches
+ju icy
+for life
+au dit
+so lo
+fundam ental
+len e
+philipp ine
+t end
+conserv atives
+sponsor ship
+dd le
+a ine
+h tc
+os i
+hul k
+w af
+ภĻ
+evalu ation
+ant ine
+sle e
+robert son
+roo sevel
+ag i
+sophi stic
+emplo yers
+bubb les
+ko wski
+inter action
+sh u
+bou le
+ic an
+j are
+han k
+leg itim
+k nicks
+kar ma
+recei ver
+per ks
+u h
+sta ir
+sun i
+labor atory
+gra ves
+voc als
+oo t
+c ture
+thri ve
+tic o
+ãĥ ³
+b w
+carto ons
+mcdon alds
+dra w
+y ung
+pl er
+li d
+eth ical
+groo ve
+ent a
+international womensday
+pat ron
+wor ries
+ðŁİ ħ
+ðŁij ĭ
+ka therine
+di az
+tor i
+bach chan
+tru st
+min eral
+ic om
+buil ders
+bor n
+col oring
+lat te
+ca se
+revolu tion
+tra der
+ox id
+chi pot
+inst antly
+sou thern
+se hun
+pro b
+her nandez
+lis bon
+hu awe
+p ong
+me a
+ro oney
+wheel chair
+ke en
+be tt
+cor in
+regulat ory
+di splac
+ka ren
+sch em
+sun sets
+wh ales
+remin is
+he p
+hi de
+mar cel
+pand ora
+do yle
+th fc
+ot to
+no kia
+trans gender
+ko v
+hawai ian
+sha ve
+so vere
+exc er
+nick i
+pu g
+st or
+ro th
+wee t
+leg al
+dig nity
+po w
+hom age
+ðŁĩ³ ðŁĩ
+s re
+can on
+la x
+wo ah
+quart z
+ñ a
+gree ting
+flick r
+nai robi
+advoc ates
+an c
+vi i
+eu gene
+th ra
+c re
+el an
+pen sion
+th letics
+ton i
+re agan
+x v
+sto re
+ben ch
+har lem
+todd ler
+sent enced
+âĻ¥ ï¸ı
+glob ally
+che aper
+u f
+ma m
+nic o
+ik u
+tho u
+ni st
+dam i
+th ala
+rho des
+sal e
+bow ls
+â Ī
+las vegas
+sanc tions
+adm ire
+mat ched
+un able
+travel er
+ele ven
+straw berries
+âĢĶâĢĶ âĢĶâĢĶ
+stu dio
+jac ques
+im s
+valu ed
+s no
+cheese cake
+n xt
+e os
+s x
+f x
+ton ic
+hat ch
+chic ks
+gra ds
+hand ic
+r ory
+as p
+ri pped
+denti st
+n en
+lu fc
+âľ Ĭ
+di ge
+hop kins
+sher man
+f da
+for all
+ash ley
+str and
+h y
+liqu or
+buffe t
+ess ence
+phar ma
+suri ya
+ðŁĴĻ ðŁĴĻ
+festi vals
+z an
+re fresh
+pur ple
+uni forms
+kenne th
+= )
+as an
+hel sin
+transform ers
+k ali
+person alized
+chal k
+bo bby
+â Į
+the mes
+depar ture
+prin t
+illustr ations
+qui et
+agre es
+gri ff
+Ø ³
+m iti
+toge ther
+conven ience
+ab ar
+car lo
+turt les
+info sec
+some what
+ar lington
+scholar ships
+emir ates
+mu ms
+st ella
+auton om
+fe ather
+g ore
+nom inees
+fragr ance
+Ñ Ĥ
+w ong
+thea stern
+gr e
+z illa
+is i
+bump er
+go o
+do zens
+ab duc
+âļª ï¸ı
+o ils
+don ors
+sil icon
+i pod
+fortn ite
+ðŁĴ ¨
+tor o
+spark ling
+consci ousness
+pal a
+nu m
+moun ted
+ffin s
+thi eves
+team mate
+pra b
+om er
+ta pes
+bo d
+mit su
+ste w
+e re
+p bs
+tu sc
+lo we
+ra de
+parliam entary
+h m
+ed gar
+ðŁijĩ ðŁijĩ
+to a
+a gh
+hon i
+s late
+ge ek
+ap t
+hard t
+ta p
+horiz on
+grow th
+make over
+hi l
+paper back
+id an
+reha bil
+gi u
+possi bilities
+let tu
+fran co
+bo ss
+ach er
+does nt
+mo e
+ta ker
+huss ain
+ml k
+di l
+th ia
+ham a
+real ised
+raven s
+curric ulum
+m ith
+k night
+ted x
+r v
+isai ah
+cumb ria
+birth days
+f ing
+pre z
+mu barak
+exquis ite
+clear ance
+y en
+par i
+ev o
+Ã º
+modi fied
+app lying
+imple ment
+disco vering
+chap man
+indie game
+dis k
+crowd funding
+mach in
+li vel
+sty led
+âĿ Į
+ma king
+rehear sals
+nutr iti
+subscri ption
+and ro
+cre ators
+car ries
+ky lie
+cam den
+appren tice
+tax pay
+c ca
+tuesday thoughts
+pis sed
+er man
+dete c
+freed om
+mer i
+.. !
+psal m
+sun light
+per spec
+be ings
+book store
+rock star
+fun ctions
+p ence
+fav es
+z n
+obam acare
+sp ill
+coven try
+pi geon
+pi vo
+ba it
+kol kata
+av al
+don or
+wa h
+privi leg
+tra ditions
+rajas than
+ten ess
+portugue se
+yn es
+tack les
+de fic
+tor n
+pol ling
+thor ne
+in a
+bened ict
+bar ry
+cal ories
+ver dict
+save the
+nor ton
+off ice
+main stream
+impro ves
+fr on
+respon ding
+real tor
+scotti sh
+de clar
+r l
+shi v
+supp lier
+re sting
+swee ts
+qu i
+. â̦
+whit ney
+startu p
+thank you
+teach er
+h alls
+ha ve
+hand made
+pro ving
+quar tet
+ro chester
+li an
+virtu al
+mend es
+of icial
+mid lands
+x box
+meas uring
+o vo
+accommod ation
+bri des
+collegi ate
+intellec tual
+in car
+ni ag
+ðŁį ·
+sf w
+coco a
+co ats
+civil ians
+presi dency
+mat rix
+sweethe art
+tri athlon
+wag ner
+ra dic
+plann er
+the o
+execu tion
+k um
+the walkingdead
+sc ar
+ro tation
+blo gging
+bom b
+re son
+bb les
+st are
+assi sted
+e do
+brand ed
+war nings
+thor pe
+acknow le
+satis fied
+sho res
+ri d
+dor a
+phys ically
+bi gh
+appro ves
+ha h
+ric al
+vers atile
+pret end
+lu m
+ab hi
+ye e
+sp it
+ãĢ Į
+dj s
+ash tra
+j t
+ven ues
+gram mys
+cy clo
+tr acker
+over watch
+repl ica
+el yn
+nr l
+lind sey
+hom o
+ballo ons
+kitch en
+si s
+am os
+ende av
+ðŁĴ »
+a rec
+thu g
+hoo ked
+hr c
+new york
+bur gh
+americ as
+patric ia
+ug u
+ap athy
+ha st
+psy chi
+cor k
+petro l
+ðŁİ ¬
+ak u
+po pping
+psycho logical
+au x
+g ma
+cad illac
+wa ste
+auth ent
+bri stol
+nam e
+que er
+to ber
+jer ry
+com in
+ch ant
+privileg ed
+op ar
+lo ser
+tex t
+mar ker
+stri es
+equ ally
+ak i
+christ mas
+gare th
+ble w
+em ma
+imag in
+se als
+che at
+conditi oning
+j ana
+ren s
+dar ies
+o asis
+disc ounts
+coun cil
+i ka
+shir ley
+vou cher
+al ps
+w x
+q r
+dri ft
+attemp ting
+ut c
+Ø ª
+gonzale z
+m f
+jo ker
+paralle l
+pa re
+aspe cts
+proce du
+n p
+am a
+rale igh
+bright en
+gu ire
+radi ation
+cre scent
+ho b
+il le
+str and
+v ore
+n ard
+che st
+di wali
+av atar
+al der
+d ling
+pa thetic
+ðŁĴ ĺ
+spir it
+jor ge
+film making
+ðŁĻı ðŁĻı
+challeng er
+b j
+down town
+ht ml
+ade qu
+twi sted
+in ely
+( '
+wra ps
+oper ational
+y ne
+n us
+mag net
+market place
+health ier
+snap shot
+dam on
+inter ven
+fe derer
+ow ls
+biscu its
+j p
+ro deo
+blue berry
+lec tion
+fron tier
+summ ers
+re yes
+pede strian
+go l
+caf fe
+refur bi
+bou lder
+me ghan
+speci alty
+la ss
+e i
+suspec ts
+appro x
+rr r
+ra th
+st im
+cru shed
+he d
+wh un
+lo af
+cr ore
+river a
+gene tics
+so ck
+wa sted
+ny pd
+answ ering
+do ve
+bel la
+ol in
+du n
+fi ji
+pre tty
+spar kle
+y un
+j d
+euro pa
+li fts
+am ber
+mu r
+te k
+boy d
+roy alty
+in do
+ri b
+go tham
+ti est
+inst alling
+ke mp
+the photo
+cos mic
+) ))
+whole sale
+loy ment
+eas y
+su ing
+sett led
+af p
+pro ver
+suppor tive
+re es
+ne ath
+deli ber
+c é
+wel come
+pic oftheday
+new born
+pat ty
+sun s
+si est
+fl int
+diffe rently
+spo ilers
+troop er
+g ins
+cor y
+look out
+equi pped
+ta pe
+to by
+resear cher
+u sh
+ke yes
+al ma
+induc tion
+k w
+k har
+sl ick
+bri de
+e ur
+cra ving
+book ings
+ch es
+tr unk
+vern on
+sp her
+cryst als
+rel atively
+pom pe
+uni ons
+val ley
+par a
+w ant
+ok c
+de af
+ser gio
+len non
+sh ay
+cr a
+v at
+he e
+t we
+liqu id
+pol y
+ðŁİ ģ
+b ent
+be aring
+motor sport
+bar be
+te sti
+han i
+fin ancing
+astron aut
+water colour
+ri sh
+comic con
+gar t
+wr ong
+ber n
+it an
+ste pped
+fil ters
+c low
+me x
+dem ons
+all o
+expand ed
+comm and
+et ers
+go ats
+si ri
+y r
+pot tery
+mari on
+i le
+el an
+san to
+person a
+du ke
+hom eless
+li ghted
+wheel er
+chang er
+cab bage
+sur real
+ham burg
+sma shed
+str an
+k not
+i art
+ob i
+be dro
+di al
+th ick
+b ingo
+fu s
+vacu um
+con ve
+ati ve
+accur acy
+accoun t
+re fer
+ri z
+spider man
+ban a
+r ite
+u b
+ab s
+medic al
+lin k
+si em
+> >>>
+be tra
+g lowing
+re actions
+pupp et
+spa ghetti
+ang s
+re medi
+pray for
+roy ce
+char lotte
+£ ï¸ı
+gh et
+affe cting
+ro de
+soci alist
+mo ses
+az i
+o it
+re porters
+cd t
+ap ing
+s nat
+minim al
+wa ist
+sie ge
+>> >>
+ri g
+schmid t
+h are
+ec a
+thor n
+he mp
+es the
+cly de
+th a
+don ut
+moham ed
+ling erie
+le gg
+carpen ter
+perform ers
+de a
+imag ined
+cur se
+la sh
+ct r
+agu a
+ro ar
+gr i
+ro le
+j fk
+resur rec
+roosevel t
+maril yn
+sm alle
+will is
+wa ited
+char ities
+the res
+li k
+origin al
+car i
+c ough
+cru ci
+la gun
+contra st
+k ou
+arm our
+re moving
+t ent
+maz da
+bri ghter
+thi ef
+cor ner
+tequ ila
+buzz ing
+al bi
+p am
+az ure
+disc oun
+pixel art
+possi bility
+ham ont
+tra des
+bu da
+hi ve
+vers y
+fin ch
+tran spa
+em i
+terri fying
+in qui
+g ba
+sub stitu
+collec ti
+plac ing
+cin dy
+k ann
+pa tho
+diamon d
+mour inho
+guine a
+anthro po
+air s
+pu mps
+ì ļ
+pas o
+cur ling
+an ita
+resi dency
+ne wh
+jo on
+cigare tte
+que ue
+ex trac
+gam es
+spl en
+ex press
+public ly
+bon nie
+tribun e
+ba ek
+reason able
+c or
+timo thy
+she eran
+Ä ±
+f dn
+su tton
+concentr ation
+carav an
+x avier
+al ger
+cy lin
+freder ick
+ner ve
+pe ak
+lettu ce
+j ail
+pre game
+kav an
+up graded
+eco logy
+squad ron
+gra pes
+goo g
+pa stry
+ðŁĹ £
+ãĥ¼ ãĥ
+mil ano
+awa z
+presen ter
+ðŁĮ ¿
+her d
+king s
+tem plate
+fl our
+h v
+k ley
+i ya
+spe c
+at er
+frankfur t
+co ch
+tex ting
+del i
+communi st
+regi ment
+ele anor
+anticip ated
+ðŁijĮ ðŁı»
+thephoto hour
+ran o
+survi ving
+simul ation
+daw son
+ar in
+aqu a
+m or
+â̦ .
+cin o
+ira qi
+sh az
+dun dee
+we s
+dra u
+hann ah
+s news
+occup ation
+ste en
+x m
+ang les
+sett ings
+gur u
+kno x
+or ca
+shap ing
+w ent
+dr illing
+zz ie
+br i
+kis sing
+fin d
+ma ine
+âŃIJï¸ı âŃIJï¸ı
+ðŁĮ į
+lar ry
+bu sted
+ta vern
+acti vely
+- "
+replac ing
+no d
+un lock
+. "
+âŀ ¤
+affili ate
+to w
+l n
+happy newyear
+di f
+j m
+green wich
+contro versy
+daw g
+con dol
+sav annah
+compens ation
+touch down
+te o
+amb itious
+embro i
+convic ted
+iart g
+bar ack
+tr ance
+testim ony
+au dition
+thum b
+my ths
+be x
+que z
+orch id
+den y
+entit led
+hoo d
+gr ant
+in box
+blue jays
+r illa
+smalle st
+bur den
+in famous
+divi ded
+boun daries
+t ter
+el t
+wy oming
+be verage
+me sm
+one ws
+budd hist
+y ana
+as sad
+is ms
+bar rett
+predic ted
+back to
+tw it
+e there
+cap tains
+escap ed
+ay o
+lam borgh
+gard ner
+la ps
+k al
+adverti sement
+insec ts
+na po
+am en
+ac y
+r and
+g k
+te h
+k athle
+tri dge
+pan cake
+at ro
+pyram id
+bu la
+paral ym
+gau ge
+en cies
+tom y
+biscu it
+but cher
+quali fier
+coun ty
+ke i
+po ols
+dar ker
+should ers
+ðŁĩºðŁĩ¸ ðŁĩºðŁĩ¸
+sp re
+( "
+writ ers
+g m
+ðŁİ ĵ
+k nit
+hu ff
+mt b
+philli es
+o st
+den is
+g art
+licen sed
+inter face
+ex cel
+d well
+from the
+co fficial
+az zi
+appear ing
+fore st
+n ana
+ke ith
+manufac turers
+beck ham
+) ?
+e se
+col ony
+delic ate
+ut ter
+mc in
+transpl ant
+pre ferred
+par d
+ari e
+hu b
+po ds
+perspec tives
+pic t
+del u
+app er
+be than
+p mo
+crimin als
+femin ism
+sh ack
+circum stances
+fel las
+prote sting
+wa x
+sugge sted
+t ator
+dre w
+om ni
+fa ke
+kath y
+re b
+del ine
+ber ni
+mi sty
+ðŁij ©
+er able
+break through
+men swear
+millenni als
+chan yeol
+la z
+inser t
+rep lies
+phra se
+n x
+ihear tawards
+audre y
+gran ite
+rac ec
+ori e
+ter ra
+innov ations
+britt any
+at eral
+pe ar
+bio logical
+sh ments
+institu tion
+m sn
+frequ ency
+d man
+neg lec
+t f
+ste fan
+fox news
+ty po
+comm s
+sequ ence
+car men
+wh ites
+econom ist
+exe ter
+se um
+re sorts
+cas ually
+bun de
+divi de
+Ø ¹
+ga g
+cre ed
+reti re
+cau cus
+rapi ds
+wrestle mania
+tul sa
+sunder land
+fundam ent
+o di
+yam aha
+v ary
+intri gu
+el se
+be acon
+an gie
+tra ded
+tran sm
+g ents
+kn itting
+gal ac
+ðĿ Ĺ
+u to
+sea side
+hol t
+re rs
+far go
+train ers
+mon soon
+b ale
+sou ght
+mad die
+h w
+co li
+fr an
+fav s
+ðŁĴ Ķ
+int ent
+r ally
+s bs
+lemon ade
+barack obama
+bre ad
+stick y
+explo sive
+chel ten
+t j
+as soc
+ram en
+hom ies
+v log
+mi ster
+lor d
+âĢįâĻ Ģï¸ı
+aly ssa
+sketch book
+ru mble
+cat ch
+migr ant
+discipl ine
+un likely
+chronic les
+fl ora
+sl ams
+am id
+s boro
+coo p
+ju mps
+tran qu
+mel is
+sof ia
+en ri
+gab e
+sy ri
+nicol as
+cha i
+w v
+be cky
+foo ty
+ta o
+suppo se
+ðŁĺįðŁĺį ðŁĺįðŁĺį
+plu sh
+ri sh
+ðŁ¤ ĵ
+k ha
+satur days
+ac cent
+he c
+lim it
+carl ton
+wi red
+taylor swift
+ðŁĺ ij
+sq l
+har ro
+recipi ents
+g at
+go p
+th of
+amaz ed
+gh an
+ðŁıĨ ðŁıĨ
+por to
+cla re
+di stant
+na c
+ohi o
+ðŁĻı ðŁı¼
+mt n
+anti bio
+dino sa
+me sa
+par tial
+b v
+lear nt
+lov ato
+questi on
+ex tract
+gossi p
+gi bb
+niag ara
+ðŁij ¨
+displa yed
+so oner
+ste vie
+nug gets
+ml n
+bro m
+tur b
+give aways
+stu pi
+bl ink
+c ili
+conven ient
+mo h
+vi ve
+f ric
+cau se
+cham ber
+cu les
+ne arest
+is se
+small biz
+t j
+canadi ans
+smar ter
+bra sil
+ra re
+que tte
+w ha
+cand le
+at omic
+ðŁijį ðŁijį
+warri or
+relax ed
+stri ps
+ne ur
+k ka
+r fc
+jen sen
+reco vering
+respon ses
+sal am
+ortho dox
+acti ve
+ell ers
+n it
+âŃ IJ
+metro politan
+centu ries
+vi da
+gra ding
+transpa rent
+sim ple
+do ts
+superint endent
+elev ator
+autom ated
+red skins
+ima m
+summer time
+jona than
+ge aring
+michel le
+confl ic
+m ice
+to te
+publi sh
+pa x
+) -
+na iled
+á ´
+tele scope
+ser bia
+ba b
+ape u
+st ically
+sen ti
+r ats
+isol ated
+grou p
+hat red
+paranor mal
+stan ley
+ali on
+safe ty
+l s
+ठ°
+nex us
+alexand ra
+mas ks
++ +
+tr on
+au k
+brother hood
+brow se
+mix es
+sim one
+mu sk
+appro ve
+lo la
+ex p
+per th
+fu turi
+un seen
+d m
+chel se
+sc outing
+o we
+portsm outh
+k ram
+mi ze
+di spen
+su p
+d lc
+adver t
+tere sa
+is le
+cy cle
+met all
+shi elds
+marin ers
+ra z
+ing en
+fun d
+an go
+jon es
+o ka
+mad den
+broc coli
+domin ic
+situ ations
+mer o
+cric ke
+puni shment
+d b
+sha king
+ðŁĺ ļ
+m q
+ari ans
+le h
+cla w
+we ds
+d ure
+ni el
+j elly
+gour met
+tra ders
+le vi
+w ages
+kne es
+wi se
+heaven ly
+avi d
+melo dy
+z ack
+ban anas
+apprentic e
+pro p
+fun ny
+o de
+respec ted
+me gan
+fe wer
+dra fted
+med it
+gra pe
+us army
+cru sad
+vo cali
+prepar ations
+non sense
+us age
+th r
+ro th
+wiz ards
+insi de
+promo tions
+mon a
+red sox
+si g
+eleg ance
+ch ia
+univer sal
+ãĢ į
+ra ja
+un ga
+pol lin
+filip ino
+ak a
+t sun
+ik on
+bi king
+decor ations
+z ac
+cade ts
+hum our
+ag m
+re ppin
+vac cin
+elo ve
+u w
+dia be
+galla gher
+az er
+do l
+a while
+pro minent
+wel sh
+t ann
+' )
+bi en
+wa g
+in al
+c wc
+wic ket
+ur st
+q anon
+x e
+out door
+dun n
+star r
+co logy
+ric ky
+u efa
+reb ounds
+s music
+inf ant
+ðŁĻ ĭ
+so p
+u mber
+hand ing
+beg in
+sor ting
+ha sh
+sp ati
+re k
+buda pest
+black hawks
+dele te
+ro m
+can did
+auth ori
+de bris
+spe cul
+inter section
+marri ott
+im ran
+ðŁĺģ ðŁĺģ
+cru ises
+ram sey
+rafa el
+aware ness
+vas cular
+beyon cé
+ru g
+ðŁĺ Į
+festi v
+ar am
+s able
+bas il
+p ill
+flo oring
+un beaten
+implic ations
+u f
+w ound
+for ge
+poin ting
+po ts
+popular ity
+ðŁijı ðŁı»
+mani pul
+s lots
+deb ates
+abs ence
+ver mont
+never forget
+wri st
+gl oria
+ren ce
+hu sk
+mel ting
+ðŁİ Ł
+br aces
+tim ely
+transform ing
+am ps
+ma k
+po e
+ah an
+gener ally
+nd p
+ale ppo
+unic ef
+pro fs
+nor d
+ma sk
+jackson ville
+v v
+sh ells
+bloom ing
+oper ators
+char coal
+ne ville
+ma gi
+chi p
+sam a
+ir an
+re forms
+accu mul
+ru e
+æ ľ
+web sites
+ga on
+devast ating
+sto s
+glaci er
+ra pp
+chipot le
+pr a
+or ous
+rom ney
+seas on
+decor ative
+c isco
+dit ch
+compla in
+ll o
+assu me
+ðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤðŁĺĤ
+n els
+cent ric
+ft w
+car rots
+tat a
+can ter
+per ience
+li ers
+demo s
+bl unt
+oper ate
+reserv ations
+le ah
+sub stance
+di son
+an te
+elec tion
+v ue
+squ are
+non profit
+ca a
+f su
+y am
+ãĤ ¤
+v ladi
+comple tes
+mar i
+philli p
+ne ill
+er as
+ka it
+men do
+mahar ashtra
+g p
+dan e
+provi dence
+ther apeu
+juven ile
+me mo
+in corpor
+aa aa
+seven teen
+teen ager
+Ã £
+or ns
+wi de
+cu teness
+tw d
+ff les
+bar a
+com edy
+over time
+y az
+bar on
+unemp loyment
+ðŁij ĭ
+exter ior
+den se
+cent res
+match up
+history month
+artif icial
+qu it
+e sk
+war n
+cr itic
+j af
+ðŁĵ ²
+inform ative
+fu els
+recy cle
+nam ing
+stri pe
+sol ic
+mole cular
+dee pi
+con vo
+s sel
+na e
+de scent
+ti z
+accoun tability
+ter ry
+r ito
+sl ay
+em o
+dem ol
+sens ation
+co v
+tor e
+round table
+y ol
+excu ses
+ॠį
+tur quo
+hh hh
+pod casts
+cele b
+me ssi
+li o
+man n
+contribu ted
+u z
+gener ator
+ele ts
+veg gie
+indu l
+en suring
+detro it
+pun jab
+tran spor
+instru ction
+ad d
+por cel
+pan eli
+cir cles
+persi st
+clay ton
+sp n
+dog softwitter
+is nt
+sp r
+retail ers
+p w
+hun gar
+el ena
+mon aster
+gu atem
+je ssie
+an z
+ra shi
+fle e
+car ving
+fau x
+l al
+hen ri
+d jo
+du ll
+s ana
+lar a
+glo be
+cri mson
+com pass
+pau se
+na b
+lion el
+ba ths
+u fo
+invent ory
+sin gh
+sat an
+ðŁĩ ¸
+ce ments
+in form
+gener ated
+bi den
+av g
+tas ks
+de er
+sa u
+ja iled
+pa stel
+sc c
+na il
+steel e
+per is
+lamborgh ini
+pur sue
+mar gin
+u ch
+bo sch
+dra in
+cl ara
+bo m
+lat ino
+web ster
+rose mary
+r ha
+s oun
+billion aire
+not ch
+percent age
+con or
+' "
+hom es
+earth day
+h ort
+big gest
+di sin
+wal ton
+edit ors
+im ma
+om ar
+equi valent
+pharmac eu
+ah med
+cam eo
+han ni
+under rated
+ge ment
+micro bi
+v oo
+honor able
+obe sity
+âļ ¡ï¸ı
+limer ick
+invol vement
+st agram
+boule vard
+bur g
+blackand white
+liber ation
+fi ve
+inter im
+sm m
+rival ry
+cap abilities
+stat ements
+thu mb
+ve d
+sw ans
+bar ber
+e que
+seren a
+hel m
+noo dle
+sam pling
+n awaz
+sing le
+thunder storms
+sh on
+in ev
+ë ¯
+to pp
+orch ard
+bi an
+ðŁĺ Ķ
+door step
+salv ation
+marke ting
+r ons
+cle mson
+ra vi
+in take
+stand with
+sin a
+ha iku
+ple y
+elector al
+ph illy
+la ys
+electr ic
+cap turing
+u pp
+er gy
+believ ing
+cul tures
+es day
+inva sive
+ed ed
+spee ch
+end ur
+viet nam
+boy cott
+pe de
+deli ver
+ðŁĴĸ ðŁĴĸ
+mer chant
+st ir
+den ies
+poc kets
+o ti
+cu ddle
+ro land
+mm ed
+den ed
+lear ners
+hoo p
+sour cing
+h acked
+di m
+environ ments
+ben son
+jud icial
+wor cester
+pear ls
+govern ments
+arri vals
+cor ners
+tun ing
+la bour
+y m
+or dering
+le wi
+i fe
+hygi ene
+thou ghtful
+indone sian
+campaig ning
+princi ple
+assau l
+ru bb
+at v
+wil ly
+en tre
+il i
+ph on
+du ties
+âĻ¥ âĻ¥
+sn akes
+lo op
+am ar
+conver tible
+bon ding
+ment oring
+max well
+ethere um
+destro ying
+ax is
+ca iro
+fin nish
+sho ck
+ðŁĺ IJ
+cal eb
+com a
+pe dal
+co re
+contin ent
+el son
+temp o
+helsin ki
+ac p
+tack ling
+st ated
+bl a
+dou b
+sma shing
+a ja
+camer on
+disru ption
+warm th
+being salmankhan
+bullet in
+o de
+syrac use
+ar an
+mc gregor
+bul k
+an ton
+confir mation
+sp ine
+im ran
+instru c
+jac ks
+chi o
+pal m
+str e
+embarra ssing
+un t
+elimin ate
+to ss
+c ise
+a ws
+oni sts
+sh inee
+jo s
+ho se
+li vely
+opp onents
+mo vements
+recogni zing
+sandwich es
+sh akes
+exerc ises
+se at
+profe ssion
+merry christmas
+lu gg
+adopt dont
+mar vin
+byr ne
+un le
+he t
+ku wait
+rah man
+aspe ct
+humb led
+gen es
+f and
+long time
+) ;
+cam pu
+an gus
+ðŁijį ðŁı¼
+q uran
+sle eves
+s lic
+¸ ë
+twel ve
+your e
+i ke
+go gh
+b st
+dic tionary
+reflec ting
+to on
+yar n
+em bed
+ðŁı ´
+re serves
+floo ded
+ver iz
+du sk
+estab lish
+pro li
+au d
+ritu al
+or bit
+declar ation
+recor dings
+cam o
+cas sette
+good luck
+cu tter
+bo p
+b ho
+che ating
+paci fic
+ma res
+tim er
+col t
+tr ous
+tomor row
+han sen
+ci e
+w ang
+ban i
+circu lar
+ac ute
+far mer
+co ys
+p se
+ir ving
+w j
+haw kins
+b ison
+ur day
+cru ising
+o te
+k ath
+whi stle
+your selves
+ant is
+sla sh
+thorough ly
+ke sh
+ser ie
+ex em
+en ig
+guil d
+sh red
+ho gan
+ap o
+ä ¸
+pu zz
+ne tball
+au ssi
+panor ama
+ws j
+av is
+ar ming
+hum ph
+brow ser
+cri es
+fo ggy
+mat te
+ðŁĮ »
+it er
+tal lest
+by ron
+cap tiv
+je su
+any ways
+flag ship
+p ton
+we y
+fay ette
+financi al
+f oul
+solom on
+jenni fer
+cucu mber
+ar gue
+tex tile
+wrest ler
+john ston
+pa stor
+ðŁĺŃðŁĺŃ ðŁĺŃðŁĺŃ
+cac tus
+edi ble
+re served
+ric hie
+met res
+ingredi ent
+h ella
+un to
+ch ol
+cele bs
+po ets
+gra ham
+hay den
+coinci dence
+b aw
+communic ate
+flet cher
+/ -
+tole do
+ecu ador
+coun sel
+s laughter
+line ar
+at p
+os u
+jo el
+ev ed
+conqu er
+ru stic
+plic ity
+recogn ise
+room mate
+cr acked
+jas per
+ph er
+ðŁĮ º
+wo ven
+mo ist
+ff c
+ste ering
+ni sh
+stand ings
+frequ ent
+ar di
+haz el
+as msg
+bau m
+d art
+si dd
+nat h
+ch ero
+card board
+c ss
+n sfw
+pa ir
+ðŁĺį ðŁĺĺ
+occur red
+homeless ness
+mal one
+ph e
+xi a
+pad dy
+decl are
+theat re
+b f
+per sian
+ta d
+ax e
+susp icious
+lam b
+mu cho
+sen ior
+st as
+k ite
+st ing
+gra d
+k af
+wat ering
+Ø ¯
+spi ral
+th ms
+educ ator
+jer ome
+of c
+clo ck
+su l
+pe mb
+.... .....
+park way
+de aux
+restric tions
+m ons
+need le
+e j
+le agues
+water melon
+am an
+pl enary
+max im
+w ab
+coming soon
+bry ce
+vi gil
+super market
+fortun ate
+turquo ise
+presi dent
+li v
+inter ns
+feel in
+fix tures
+stun t
+st aged
+premi eres
+lo k
+prac titi
+shor tage
+log ne
+ve c
+con cor
+roc ke
+li g
+com posed
+syn thetic
+di p
+cam ila
+ch is
+j ou
+su san
+eye brows
+supp lement
+satis faction
+moham mad
+ti bet
+house of
+pu n
+as sam
+shado whun
+psy ched
+se duc
+mand atory
+her bert
+sc allo
+stream ers
+proto col
+block buster
+produc es
+sch nei
+lau rel
+tri be
+time hop
+pl a
+mod elling
+tv time
+mtv stars
+wi dow
+me tric
+ch am
+con do
+flow ering
+ale c
+d ms
+inten sity
+Â ¨
+mccar tney
+islam abad
+k b
+f fi
+ph al
+anal og
+f ond
+h acks
+positi vity
+treat y
+sub marine
+conne ct
+sel en
+categor ies
+cu b
+organi ze
+si k
+quote oftheday
+remin ding
+am or
+loc king
+ðŁijı ðŁı¼
+comp ound
+et te
+b out
+rec ur
+fe rence
+mi zz
+tren d
+hip ster
+for tress
+forth coming
+preli min
+o dyssey
+ang p
+del ici
+even ings
+ðŁĶ ¹
+i q
+d w
+da ir
+kathr yn
+christian ity
+moon light
+ha b
+wh oo
+f bf
+se th
+genu inely
+pa x
+char ity
+deplo yed
+b nb
+bu cs
+ju dg
+con ge
+plant ation
+im press
+car a
+sc lub
+sco py
+land ers
+compla ints
+b ama
+re build
+x y
+real ism
+sh our
+le in
+brac elets
+mer a
+assas sin
+an chor
+ðŁijĮ ðŁı¼
+lin en
+con fron
+chronic le
+comm ent
+cat alog
+il les
+gor ge
+me try
+jung kook
+love my
+sent in
+se em
+fit ness
+alli ed
+ts man
+digital transformation
+pr an
+lo ft
+min ton
+alden richards
+en vel
+cher ish
+certain ty
+zz z
+rhin o
+per kins
+en rich
+cape town
+ome ter
+sec tions
+ske leton
+def enders
+ðŁĺ Ŀ
+pen c
+bri t
+ja h
+capital ism
+ðŁ¥ ĩ
+baz aar
+re me
+ex t
+kk k
+conver t
+stor my
+b ye
+kar an
+chry sler
+ad os
+pre ssed
+syn c
+ation day
+dang er
+bad ges
+refu ses
+em powering
+ly m
+ex ports
+adoptdont shop
+ðŁĩ ¯
+th c
+awa ited
+focu ses
+fin ed
+o at
+haha hah
+âģ ©
+n family
+fi ona
+luck ily
+thr illing
+ty ping
+out break
+di es
+he u
+craw l
+ne sses
+o ath
+scri pts
+gee ks
+ðŁIJ Ŀ
+p b
+mathemat ics
+al is
+________ ________
+gymna stics
+acti vism
+recommend ation
+gre n
+wa in
+cour ty
+n apol
+cau li
+hor nets
+g als
+jo ckey
+dir ty
+at ar
+enor mous
+pe st
+greg ation
+an os
+ii ii
+def ends
+black historymonth
+at x
+mb c
+lugg age
+wit ch
+co b
+la sts
+cu m
+gg g
+ba thing
+n ar
+ce bu
+ðŁį ĥ
+navig ation
+min e
+re jo
+ðŁİ Ģ
+gif tide
+re ta
+use less
+pu ll
+defic it
+al lu
+ati me
+it v
+tr illion
+pu e
+ac ies
+proce dure
+l ori
+jen ny
+c ad
+ul ously
+dr ac
+promo tes
+ing the
+can u
+woo hoo
+na omi
+zar dari
+ts u
+be ir
+sd g
+le ver
+we ber
+ab ud
+lun d
+crow ded
+deplo yment
+ter rain
+ken ny
+ho f
+witne ssed
+lo ch
+j k
+bul ly
+w ren
+poe try
+do ff
+ww i
+mo red
+din i
+cul ture
+promp t
+Â ¥
+maur ice
+to pps
+r m
+cor respon
+ab out
+jewel s
+gi br
+eag le
+ðŁĺĺ ðŁĺĺðŁĺĺ
+l ending
+sou ven
+ç Ķ
+contemporary art
+establi shment
+j ong
+â̦ "
+gat or
+patri otic
+mc coy
+v ape
+human e
+feli z
+coach ella
+re posting
+ste als
+fu ller
+n ering
+at ra
+( -
+bla ke
+he ather
+wor ms
+discipl inary
+rede mption
+y ard
+am in
+" @_
+d nc
+t ds
+k appa
+ne wark
+comm its
+spe ars
+j ams
+t and
+msn bc
+inter medi
+aim ed
+at ic
+teen th
+observ ation
+kash mir
+kavan augh
+ou l
+san francisco
+re u
+bel ated
+cho w
+pass word
+st ills
+deta ined
+sar i
+day ton
+dar ren
+itali an
+ar th
+amu sic
+ar bit
+w m
+v m
+he m
+dou g
+my r
+a sho
+pre v
+vin d
+bra h
+sta g
+ภµ
+pre views
+gu k
+con taining
+leon ardo
+sad dle
+ru shing
+st av
+lon gh
+gam bling
+ve gas
+reserv ation
+end ale
+bal a
+fl a
+vari ant
+he dge
+bulgar ia
+nat ali
+we aver
+sol st
+encoura ged
+ap c
+as parag
+ne st
+cycli sts
+fe l
+ìĬ ¤
+overwhel ming
+pey ton
+j it
+a post
+mb le
+ble eding
+neighbour hood
+a very
+expre ssions
+mac donald
+gi gs
+mon ds
+illu sion
+n ct
+cam ero
+over head
+my th
+ol y
+vi o
+et v
+lau rie
+unve iling
+pri or
+con n
+iron man
+di ff
+day in
+crit ici
+con go
+re vision
+wal e
+direc tor
+p ines
+black pink
+gar ner
+cur ated
+manit oba
+h ac
+common ly
+bar ton
+.... #
+mor tality
+live smatter
+philos op
+shor ter
+con vince
+fre ak
+vend ors
+insi ghtful
+el ly
+sens ors
+e led
+s berg
+weight loss
+u kip
+sp ur
+priv ate
+qu a
+ss c
+, ...
+supervis or
+advis er
+amaz ingly
+less er
+at es
+mah on
+oooo oo
+sar as
+pmo india
+waff le
+un ders
+toler ance
+sculp tures
+her sh
+kno cking
+smo ke
+cathol ic
+gri m
+tra veled
+fli p
+ge off
+dinosa urs
+sle pt
+scar let
+ok i
+compla int
+ob sc
+nam i
+la g
+cross fit
+u fc
+mc cain
+refe ree
+sad ness
+pen ny
+li eu
+mo de
+ki er
+vol s
+w is
+el on
+she a
+ba o
+son ia
+cla ire
+em manuel
+moist ure
+di gest
+vi ii
+t eller
+ch on
+access ory
+night club
+foss il
+aw an
+hu sky
+ab original
+brand on
+ffici ent
+cou gars
+ste d
+ad mitted
+igno red
+content marketing
+ag as
+v ase
+execu ted
+negoti ations
+she ad
+n and
+tab lets
+go th
+ts al
+d fw
+on ep
+protec tor
+sp ho
+gaz ette
+andre as
+ss er
+comp ilation
+ha v
+contain ers
+bro ker
+soc al
+porcel ain
+hy uk
+air ing
+ðŁĴ °
+publi sher
+scen ario
+spart ans
+re viewing
+itu des
+ed el
+pear son
+ba sh
+mau i
+a ad
+ðŁĮ Ĭ
+li u
+ul ate
+program mes
+fav our
+web design
+real ty
+motiv ational
+cro sses
+' ...
+bus ch
+adjust able
+ar jun
+mist ak
+dimen sion
+pi stol
+weigh s
+en y
+unve il
+indy car
+gor don
+f ade
+fran ken
+qual ities
+bet t
+loc ate
+ker r
+sp c
+confu sion
+ne e
+luck y
+bas es
+dep ends
+fire fighter
+ol a
+re t
+mar oon
+ðŁĶ Ĭ
+w am
+defin ing
+whe at
+bi l
+é s
+b hai
+psy ch
+ta u
+ic ans
+thi k
+ob ile
+inspec tor
+ìĨ Įë
+ill on
+go s
+ev angel
+fa i
+si st
+voc ation
+bur ge
+chi stan
+renew ed
+enthusi asm
+en ting
+ag ri
+ike a
+m sc
+aero space
+sens iti
+memo ir
+hosp ice
+co caine
+der ry
+mechan ics
+Ħ à¸
+tin o
+reduc es
+collec tors
+in justice
+supp re
+v ana
+ab un
+nap a
+su sa
+os lo
+e ff
+en core
+lic ence
+ched dar
+z al
+moun t
+ðŁĴ IJ
+threat ens
+!! "
+archi e
+fu tsal
+scu ba
+jo s
+gn on
+se xi
+s official
+compar ing
+domin ant
+tof theday
+fa it
+propos als
+gi ft
+y as
+cn c
+l r
+ha b
+reser voir
+beli efs
+gener al
+mar ti
+t d
+est e
+ì ł
+wi l
+ðŁij ¯
+ðŁĶ «
+sp x
+et work
+excer pt
+e instein
+hir o
+sil hou
+team ed
+per ception
+corri dor
+mental health
+hin ts
+ben ny
+induc ted
+sw x
+wi desp
+spe ak
+cher yl
+dru g
+ðŁĺ ķ
+h f
+asparag us
+myster ies
+fitz gerald
+off er
+therap ist
+care er
+dam aging
+ts d
+per u
+wei bo
+y ay
+phoeni x
+disc re
+mac book
+bar ker
+stig ma
+sp read
+roc kies
+kang ar
+bri dg
+pa i
+bi shop
+ta iled
+capsu le
+ðŁĴ ĵ
+ge of
+roy ale
+short listed
+o ste
+ash amed
+ch app
+key e
+cl a
+screen shot
+austri an
+nati ve
+en ight
+juli et
+michel e
+ðŁĮ ´
+travel ers
+pi l
+football er
+win chester
+ðŁĻ Ħ
+azer bai
+gold eng
+organis ations
+interpre tation
+predat or
+ofthe week
+lo gan
+pok é
+mari e
+cal la
+t nt
+cin de
+ge tic
+fit fam
+gra v
+ow ens
+ðŁĮ ±
+shoot out
+sal is
+commissi ons
+co he
+p tic
+ni xon
+hi a
+amb ition
+mar ine
+cruel ty
+t k
+cru de
+sal ty
+jim a
+mon go
+ir ony
+on wards
+arre sts
+strang ers
+ig er
+cycli st
+ra g
+exten ds
+tra dio
+bour g
+mo i
+el la
+e able
+lex us
+au l
+der a
+histor ian
+mor ton
+ti ff
+man ner
+ko t
+d k
+po inted
+mar qu
+a an
+en ey
+du blin
+on poli
+em ili
+secre t
+fl o
+âļ ¡
+ba j
+ste ep
+accompan ied
+rum ours
+dev i
+purch asing
+fi g
+pu b
+sch oo
+autonom ous
+go alie
+x ia
+autom atically
+re vers
+ter o
+fu ku
+titan ic
+shoo k
+sand als
+see kers
+exc av
+nor dic
+bigo live
+ba ke
+r att
+z ak
+ne p
+ðŁĺ ¤
+cand y
+billi ons
+book worm
+pp et
+à ³
+sur faces
+sc ars
+phil ip
+do gg
+ci gars
+co te
+transl ated
+cur ator
+sin dh
+han gover
+bre wer
+on es
+el ton
+ðŁĴª ðŁı¼
+mar cu
+elli ot
+righ te
+di oce
+ru ss
+rail ways
+grand son
+as cen
+apo logy
+awa it
+mob ili
+re spir
+parti san
+oli vi
+stri ke
+yo o
+white house
+expre ssed
+pu ps
+bed ford
+cul tur
+fro gs
+fly ing
+cav ali
+c ds
+fri ger
+street photography
+re solve
+tali ban
+kan g
+cru shing
+ju m
+ðŁĺ Ĵ
+william son
+tan g
+cur ly
+t man
+veter an
+fa ire
+artificial intelligence
+un anim
+pre n
+back drop
+fr ances
+oc cer
+doro thy
+work ing
+ar thr
+conver ted
+day light
+serv ant
+pad dle
+compla ining
+thir ty
+nad al
+ak u
+ibra him
+ad dressed
+p iss
+green house
+batt alion
+si mulator
+out lets
+embroi dery
+ðŁĵ ±
+fis cal
+ger ard
+sas sy
+ðŁİī ðŁİīðŁİī
+vent ures
+mer it
+public ity
+ðŁij Ī
+sophistic ated
+c tu
+conven tional
+condol ences
+isra el
+tra dition
+ar an
+te ss
+gla d
+ðŁĺĬ ðŁĺĬ
+correc tion
+ge on
+am d
+or ship
+be ast
+ch ment
+ì ŀ
+nic o
+wk nd
+wel s
+cushi on
+beli e
+vo c
+idio ts
+under neath
+pu ma
+corn ell
+en ation
+lu l
+swa ch
+ab ig
+u rer
+mi e
+form erly
+ca f
+er nal
+chor us
+juli us
+sen ator
+âľ į
+wh ir
+salv ador
+ph d
+uni fied
+boo ster
+graph ical
+w rec
+son ny
+mi z
+dere rs
+s all
+ven s
+tusc any
+wi d
+y ong
+kur ds
+w az
+trol ls
+mac ro
+cat urday
+pre ssing
+sa sha
+cent ennial
+gu sts
+em c
+be fore
+den ise
+cu st
+ðŁĵ ¢
+lo oo
+base l
+eng land
+y olo
+ar du
+manife sto
+do ha
+ì ľ
+kni ves
+bourne mouth
+bi bl
+bar b
+al icia
+Ø ©
+com er
+cycl one
+g it
+ane ws
+character i
+vent ura
+in tra
+sf giants
+hu t
+be a
+dar win
+ell er
+al v
+re ese
+bl y
+kar an
+conclu sion
+man ny
+fla kes
+unite blue
+nad u
+co pp
+ed ges
+lanca shire
+i als
+o tta
+philipp e
+l ent
+che e
+ment ors
+festi val
+an ism
+compli mentary
+r j
+pu g
+d ine
+we i
+cli ffs
+sar my
+ti veness
+treas ury
+il and
+after math
+rabb i
+ou n
+bou quet
+herit age
+zi on
+sur render
+shen an
+in ks
+kar l
+gh ty
+pol icing
+exam ination
+ce y
+per su
+measure ment
+hydro gen
+lu han
+âłĢâłĢ âłĢâłĢ
+war i
+о Ð
+j y
+fow ler
+mis h
+al fre
+âĺ ij
+bb naija
+cat alogue
+recogn ised
+sa ver
+hu skies
+col in
+mun do
+si va
+p ng
+discoun ted
+man utd
+fre sno
+de vin
+prelimin ary
+tro phies
+pla stics
+du g
+pro cu
+indi go
+g ard
+dy lan
+pit ches
+ground breaking
+in son
+bl ac
+an thology
+f h
+expl ic
+r ard
+admi ral
+so chi
+la shes
+splen did
+en vy
+ad v
+sex y
+festiv ities
+stic king
+bi b
+thr ill
+op p
+ari el
+botan ical
+endur ance
+fe males
+br icks
+vat ican
+black pool
+ber mu
+br ough
+roll er
+bi d
+sue de
+sloven ia
+mm ing
+ml b
+med alist
+di ans
+rehabil itation
+ne on
+s go
+li thu
+ram os
+z ed
+pi anist
+inten sive
+broad band
+stu dy
+peter sburg
+lu ca
+ah hhh
+phys ician
+dill on
+tele com
+gri ef
+mu n
+ac ro
+si ded
+s ly
+blo ws
+classic cars
+tri um
+ar gy
+? :
+h ri
+marsh mal
+âĢ ĵ
+to pping
+war saw
+tran sc
+preserv ation
+b av
+re friger
+experim ents
+ä º
+gl it
+sli ga
+g age
+fac tor
+flav ours
+br ony
+sp o
+cook book
+carri age
+aw ay
+ny fw
+on ian
+w g
+simp sons
+ro lex
+ðŁı ¿
+cro sby
+ãħ ¤
+cre di
+syn dic
+pu bs
+ali fe
+poor ly
+mac ed
+ðŁĺ ŀ
+behin dthe
+w enger
+n ats
+ðŁİ Ł
+rubb ish
+procedu res
+typho on
+opho bia
+er do
+fu el
+vi era
+bu mps
+millenni um
+new zealand
+lec tures
+it on
+mil ky
+respon ded
+ê °
+landsc ape
+.. @
+bo ther
+âĸ ¶
+z hang
+huawe i
+tu ition
+s worn
+in u
+y or
+pa olo
+au ditions
+ab il
+malay sian
+ho ps
+fe athers
+mp le
+au ts
+ã o
+boun ty
+ic he
+ì ĺ
+sh q
+pin ot
+ge ars
+disapp ear
+video games
+t na
+alzheim er
+ðŁĮ ŀ
+a ji
+under wear
+swit ching
+sign age
+o scar
+ec on
+dro w
+cl int
+pl ated
+gun dy
+emb lem
+ho es
+ici st
+nel ly
+juni or
+road show
+miner als
+at le
+alexand ria
+ac claimed
+v ell
+shi va
+ad he
+en ne
+amne sty
+h ounds
+councill or
+ðŁĴ ¦
+aes the
+part nering
+influ enced
+mag no
+fl are
+extin ction
+civil ian
+maje sty
+va il
+law makers
+rac ks
+mc c
+ori an
+sp ices
+er rors
+may er
+co ca
+pa i
+s ooooo
+reti ring
+ba thro
+ðŁĻĮ ðŁĻĮ
+âĸ ª
+su f
+endor sement
+buil ding
+broo ch
+pal la
+arvin d
+ag ent
+kar ate
+r hi
+c tv
+ta ine
+um m
+ba x
+reig ns
+uni of
+enterpri ses
+adel e
+fla ke
+at tire
+bru ce
+ba hamas
+gra vy
+sa in
+che ek
+tri vi
+lo v
+e en
+bb lo
+lady gaga
+itt a
+. "-
+du stin
+observ atory
+eigh th
+bloom berg
+kh s
+f cc
+gi st
+commemor ate
+ve er
+sexu ality
+ed c
+nic ole
+vac ancy
+u ser
+son a
+:' (
+dipl oma
+t end
+up grades
+Å Ł
+jura ssic
+cardi ac
+dr s
+widesp read
+Ã ł
+dail ies
+vend or
+sim plicity
+wi der
+len ses
+supp lements
+de pos
+ob served
+vin es
+parti ally
+renew al
+collabor ate
+ali g
+fin ity
+ph u
+zz y
+pe tit
+ðŁĵ ħ
+z in
+i gu
+sm ack
+fall on
+ðŁĵ £
+back wards
+comp onent
+o so
+compati ble
+bin ding
+zur ich
+thom e
+w ounds
+ly ric
+fresh men
+sne aky
+fi bro
+di et
+emplo yer
+in sect
+h ated
+sch er
+raz or
+n sw
+boo ker
+califor ni
+av fc
+Â °
+preten ding
+pep si
+al is
+un titled
+k art
+grand parents
+e the
+o ck
+lux emb
+visu als
+small business
+abdul lah
+min ho
+su baru
+h ra
+reve aling
+heart breaking
+clar ity
+am g
+sl r
+** **
+âŀ ĸ
+recor d
+ici ary
+min ded
+ye h
+exce ssive
+knu ck
+icec ream
+tru th
+ev ic
+ta stic
+ant arc
+ren dering
+, ,
+mit t
+loren zo
+st patrick
+bound ary
+zi g
+vo cab
+osa ka
+fur n
+tu n
+gu l
+s ounding
+blo gger
+utter ly
+g af
+adv ancing
+l cd
+mar gin
+lifel ong
+solst ice
+sh ra
+wa its
+ple ar
+bre ach
+en ligh
+ad er
+itt le
+c ation
+ho on
+stu died
+?? ???
+k ash
+ev angeli
+ps l
+wei ghts
+met als
+ty res
+tur no
+wi e
+car b
+g ale
+se al
+sun ite
+am ic
+patter son
+á n
+eu ph
+up stairs
+quali fiers
+khali fa
+apple music
+ìĨĮë ħ
+vau ghan
+al ter
+cru iser
+mu a
+t ana
+kat rina
+id ols
+spo iled
+secre tly
+fi bre
+part nered
+um es
+gi ov
+com et
+screenshot saturday
+k eller
+fil tr
+fe t
+con way
+pe u
+bad minton
+gi d
+m ound
+don key
+bu ff
+lea ther
+lar gely
+bro ch
+int ments
+am use
+r k
+sto ve
+impac ted
+con t
+cr acks
+prison er
+bar i
+contrac tor
+ori oles
+domin ate
+pol ar
+am elia
+dr c
+ðŁijĮ ðŁijĮ
+vi st
+su arez
+injec tion
+blo oms
+ðŁļ¨ ðŁļ¨
+sti ff
+pay pal
+sno wing
+thur sdays
+goo se
+we dge
+educ ated
+weak ness
+de cker
+abud ha
+bree zy
+Û Į
+hope ful
+o bi
+rai der
+gh am
+de u
+se ve
+par tly
+fu t
+infu sed
+mer ri
+than e
+some time
+hu e
+me in
+cre dit
+sli ding
+ran de
+cher ry
+dead pool
+sh ol
+ar am
+under wood
+sky e
+distur bing
+m nt
+poli shed
+guardi ans
+ha dn
+pic asso
+ari us
+ak shay
+ir ri
+j h
+happ en
+la kh
+dal ton
+at the
+s well
+mar sha
+re h
+cour s
+j kt
+top us
+serv ice
+r ink
+hack ers
+dono van
+hor o
+tc m
+may hem
+cha se
+dev ops
+ken sing
+sc up
+sh ere
+quali fication
+c live
+ton g
+n ancy
+mar is
+der dale
+ber man
+cinde rella
+jol ly
+ci c
+loo t
+collecti bles
+hom icide
+g ge
+epide mic
+su ites
+mu ddy
+gi mme
+e rec
+- *
+tal la
+lis le
+embro ide
+ðŁĩ© ðŁĩª
+veriz on
+ve ctor
+be anie
+arti san
+ga in
+flo res
+vi gil
+u so
+ðŁĻı ðŁı½
+grin ding
+gh er
+air ports
+respon sive
+shaf t
+can cel
+ceremon ies
+e me
+at ari
+bru shes
+eag er
+bo hemi
+children s
+yan kee
+ma a
+suspen se
+mor an
+mac ar
+sun flower
+cre w
+vo id
+ke ar
+fashi oned
+jen nings
+sunday funday
+sub missions
+me ad
+her man
+wa i
+crit ically
+le um
+baek hyun
+for cing
+co bra
+ãģ ®
+acqu ire
+al k
+ge ology
+pri mar
+import antly
+ire z
+bunde sliga
+curi osity
+sen a
+stric t
+con soli
+win ters
+ven om
+chelten ham
+ðŁį º
+cen a
+t at
+ba in
+glo ver
+under cover
+as ses
+car n
+memorial day
+am eli
+i rene
+ch on
+syn thesis
+spe edy
+mitsu bi
+sla yer
+compos ite
+under stands
+pe w
+inter rup
+hen ri
+mor row
+an om
+thof july
+g lee
+thre e
+ðŁĺ ®
+and hi
+ch att
+renew ables
+ye s
+trans fers
+!!!! !!!!
+bab u
+du ter
+lo ops
+pe ers
+o ilers
+pau lo
+ic ation
+h mu
+war a
+mer cer
+hom eland
+fu ji
+ale y
+year book
+re m
+re en
+ab sur
+bo is
+] :
+caes ar
+shot gun
+kur dish
+o ren
+ra e
+anci es
+ty pic
+f h
+def ault
+re plic
+lu k
+trans actions
+r ys
+infan try
+ðŁį ¾
+cho w
+chick ens
+ba gh
+wy att
+ay e
+gg i
+bre ws
+ed itions
+mi ra
+commen cement
+pre su
+peris cope
+ic hi
+guatem ala
+zam bia
+pain ts
+wit ches
+wan i
+un dere
+cro y
+vo ws
+us mc
+hear ted
+theat res
+shu ffle
+le vel
+mul tic
+squee ze
+fer n
+app et
+post al
+mal t
+on board
+ld nt
+co o
+s sc
+k ac
+ðŁĺ ĩ
+sc rap
+mar cos
+deal ers
+ann u
+mill er
+co ve
+ul ary
+vladi mir
+be ef
+th ur
+pick led
+se same
+bengal uru
+mo tt
+kathle en
+hi st
+no tor
+dr ank
+du chess
+snow fall
+e ff
+tin y
+j n
+sy our
+speci alists
+scot us
+bay lor
+eve rest
+mali bu
+pre m
+harm ful
+l ali
+b ates
+g ye
+differen ti
+and ra
+geome try
+el over
+black out
+== ==
+ko ta
+inter act
+asi an
+la yo
+samu rai
+fi del
+exhau sted
+gla di
+pd t
+spher ic
+anti qu
+guit ar
+stu ri
+ho pper
+ang le
+f ills
+sla p
+mi th
+rod ney
+ong i
+in som
+pre venting
+cassi dy
+ap ho
+ore gon
+lo in
+ham mond
+contribu ting
+f n
+gar ri
+ori on
+comp elling
+escap ing
+aim ing
+plu mb
+bi stro
+be asts
+concer ning
+bo e
+do pp
+shop local
+stumb led
+âĤ ¹
+naz is
+âĢįâĻĤ ï¸ı
+gest ure
+war ts
+us open
+hi ggins
+char li
+hang s
+bom bers
+° :
+fe eds
+c ch
+st il
+nic ola
+ðŁĵ º
+clam ation
+tro pic
+af ro
+ou k
+expen ses
+der rick
+al ine
+fa w
+reg ard
+im er
+sat in
+thi um
+ry der
+pear l
+te ss
+mm mmm
+sen ses
+ðŁĩ ¹
+positi ve
+exhau st
+occu r
+nor ris
+lil ly
+is les
+direc ting
+yo fficial
+count less
+sam ar
+on stage
+flo ck
+mir rors
+arch er
+mo i
+k d
+vi v
+in os
+si kh
+le i
+sen sory
+br its
+kno x
+chest nut
+op y
+coli seum
+z af
+di vin
+adap ter
+:) ))
+tem ple
+ku n
+hel mets
+t df
+gu ide
+m old
+o ids
+lu ther
+he is
+monaster y
+sp ree
+k lu
+brit ney
+jagu ars
+gre ats
+c cc
+ky rie
+machin ery
+cric ket
+re ro
+ab o
+aspir ing
+semi finals
+ale ss
+sig natures
+var d
+me th
+her bal
+hol den
+king dom
+ap or
+reg gie
+ore o
+palestin ians
+em mys
+sec tional
+ro i
+ney mar
+qu el
+cu ll
+l ka
+haz el
+estim ate
+ul ties
+go w
+be a
+purch ases
+bel ts
+protec ts
+m é
+gue ssing
+bb o
+clau dia
+fr acking
+jon ny
+el k
+cel tic
+al mighty
+ra je
+courty ard
+ig i
+can es
+ðŁĴª ðŁı»
+bank rup
+le thal
+âľĮ ï¸ı
+graphic design
+vad er
+penc ils
+rough ly
+dan te
+m fg
+const ell
+cam el
+j b
+bloss oms
+en to
+balo chistan
+cine mato
+ill ard
+jer sey
+con sent
+dent ed
+con templ
+sch er
+hol i
+lou gh
+st our
+a yo
+begin ners
+cur b
+v hs
+a jax
+du ff
+av eng
+dom est
+commit ting
+ai red
+cha p
+hedge hog
+disappo inting
+freel ance
+in land
+char ms
+ðŁĺį âĿ¤ï¸ı
+ai sh
+m x
+buck le
+ti dal
+per mit
+bo ating
+ra cha
+kend rick
+b ello
+b hi
+ple a
+estim ates
+l b
+apo logies
+jay a
+bb l
+ast oni
+inter state
+main taining
+el bow
+mu p
+ep it
+ðŁĺ ¡
+viol ations
+def end
+be h
+sl c
+am ir
+pur i
+ti um
+fi fa
+blur ry
+scri m
+ðŁĻı ðŁı¾
+ma ple
+rel atives
+âĺ Ŀ
+cho c
+con nor
+⾨ ⾨
+whi sp
+list ings
+ma ze
+than king
+ri dd
+grass roots
+shi fting
+desper ately
+gor illa
+den i
+ju les
+stra th
+g ley
+ja in
+bu ick
+t anner
+ðŁĴ Ŀ
+ga e
+pri m
+it ors
+n ano
+separ ation
+armen ia
+bor deaux
+ðŁ ħ
+pj net
+bu rial
+e bon
+glo ss
+re new
+gri er
+spe eds
+comic books
+sym boli
+pur poses
+ãħł ãħł
+spati al
+no table
+ci on
+n ps
+ho ffman
+nor man
+rt g
+du sty
+situ ated
+tr an
+k fc
+em en
+nic kel
+hast ings
+sett ling
+gr it
+l ena
+w aw
+art s
+gu m
+ca regi
+le wis
+sapp hire
+rememb er
+embed ded
+t lc
+bl at
+serge ant
+el sa
+boot camp
+bow man
+photo graphic
+pill ars
+direction ers
+classi fied
+no is
+ve er
+barre ls
+wh oop
+ðŁĺ± ðŁĺ±
+fe male
+petro leum
+medi a
+e fc
+poké mon
+ठķ
+enthusi astic
+var un
+pro files
+pedi atric
+acci dents
+con rad
+jan g
+jo jo
+ac or
+ob server
+l f
+live stock
+for gi
+fo s
+el m
+an and
+go e
+c ere
+avoi ding
+gri t
+om an
+thank fully
+scat tered
+nick y
+cylin der
+chees y
+di ver
+mahe sh
+cav es
+ear liest
+qu inte
+subjec ts
+b end
+gul f
+vocali st
+glu e
+pat ches
+un stopp
+sny der
+demonstr ating
+pi o
+hor ns
+wic kets
+and the
+r ama
+yo on
+stra ight
+bed time
+or ang
+bul lets
+sa urus
+min ers
+inci dents
+! ...
+ðŁİ ¸
+ag ers
+hand les
+stat es
+in ity
+d ons
+incredi ble
+emin em
+avi v
+ru dy
+moz art
+folk lore
+appli ances
+mt l
+fre y
+di as
+hu a
+page ant
+stri ve
+im prison
+bul lish
+r ana
+al erts
+bb mas
+hy per
+derby shire
+re cre
+re dd
+debor ah
+cosmo s
+law son
+mel anie
+psy cho
+ho or
+doo dles
+sni per
+shad y
+man tle
+canadi an
+new year
+inter actions
+separ ated
+cor ds
+spiritu ality
+ap u
+it o
+p ct
+pel osi
+rebel lion
+se iz
+wor cester
+sec tors
+ul i
+san ta
+Ð µ
+ðŁĩªðŁĩ ¸
+bi ased
+class ical
+gam ma
+dee plear
+emer ge
+back er
+sur ance
+hand crafted
+ðŁİ ¥
+franc is
+mill an
+ic i
+cro wn
+wo w
+stri ped
+un fair
+relax ation
+³ ï¸ı
+embrac ing
+she alth
+pale o
+martin i
+dist illery
+wr ink
+or k
+na th
+hay ley
+cour thouse
+si ber
+sa di
+quiet ly
+mel t
+m sm
+me h
+smart phones
+rel ent
+pp ing
+war wick
+co logne
+gli a
+cot ton
+pro g
+lon e
+ip sw
+star ters
+expan ds
+u mp
+su ed
+ski pper
+infe ctions
+ing le
+Ã ¡
+cler k
+demonstr ate
+ac ar
+ðŁĺĤðŁĺĤ ðŁĺĤ
+ti bet
+bun s
+alo m
+demol ition
+ssi a
+g st
+[ ]
+so ar
+âĺ Ģ
+ðŁĺ ª
+ðŁĵ Ĭ
+dee pest
+beyon d
+are t
+att ends
+activ ated
+di mit
+âļª ï¸ı
+high lighted
+magaz ines
+rum or
+az za
+steph ens
+dol ph
+sho ckey
+mat s
+we av
+mel an
+serv ers
+tra um
+ku sh
+æ Ĺ
+bab ys
+pa z
+a al
+la use
+break ers
+canter bury
+ul ture
+mi ri
+euro s
+tane ous
+impre ssions
+du tch
+il d
+gh i
+pur due
+adequ ate
+l p
+sy ner
+ang ler
+du rable
+gal ore
+ro wn
+mg mt
+ðŁĵ Į
+lu cia
+âĺij ï¸ı
+zay n
+bor row
+. (
+north umber
+cru sh
+eng a
+su sh
+extra vag
+t out
+ma hal
+ali stic
+ther mo
+gall eries
+es se
+chi bi
+attrac tions
+lex ington
+legislat ure
+docu mented
+resi den
+brow nies
+w f
+st ool
+plan ets
+sho ppers
+conduc tor
+ms p
+tr icky
+fru ity
+end ra
+feel the
+whi pped
+hair style
+re fer
+oo k
+oc topus
+audi ences
+ku mar
+after no
+op tim
+c fl
+ni p
+gen i
+alpha bet
+ann ab
+lam in
+accep ts
+l ng
+ðŁĺ «
+t ine
+ac om
+cheer leaders
+t k
+gr on
+v g
+k ung
+ja x
+dha bi
+r ss
+mack enzie
+beir ut
+clean up
+gy psy
+st ell
+bur ger
+hurric anes
+educ ation
+st ina
+âĻ¡ âĻ¡
+unfortun ate
+jere mi
+bad ger
+at ers
+: â̦
+ter ra
+subli me
+stu d
+y mca
+mr u
+duter te
+bren nan
+bul b
+mel o
+yl on
+hack er
+c red
+gu d
+as an
+pad illa
+embroide red
+vietnam ese
+pione ers
+projec tion
+re boot
+id c
+an ey
+pri mer
+suff ers
+win ding
+p on
+sto day
+mor n
+u ch
+all in
+adid as
+eliza beth
+tu ck
+o graphy
+ðŁļ Ģ
+be g
+os borne
+ghet to
+r h
+cn n
+ir ma
+ma kin
+cab les
+mur ders
+oc ks
+inst a
+al as
+si k
+cu ff
+la re
+foo dies
+o vic
+at om
+geome tric
+em pathy
+ภµ
+cent enary
+newsp apers
+administr ative
+ðŁİ Ĭ
+sti ve
+contrac tors
+le tt
+tas mania
+awesom eness
+den sity
+ve en
+prince ton
+frequ ently
+re ject
+gh i
+modu lar
+ceram ics
+sh ag
+ki wi
+can vas
+sweat shirt
+an j
+ti mm
+napol i
+il er
+appe als
+hamil ton
+ma yo
+we ave
+arrang ed
+whar f
+occu py
+b vb
+as aki
+ot ter
+nor m
+vi es
+de tox
+tion al
+dere k
+id ad
+ad missions
+constitu ency
+u pper
+woo t
+allo y
+se ve
+lu b
+un comfortable
+ed win
+ab re
+d wight
+ar che
+virtu ally
+sp ol
+pri e
+ai i
+er r
+swit ch
+bar ack
+se ok
+cou l
+wn t
+pou l
+o live
+caffe ine
+cardi ff
+notor ious
+de mp
+ex cess
+bar r
+t ford
+a jay
+bump ed
+my thology
+shel ley
+fal con
+shakespe are
+must angs
+no ted
+bon e
+civil ization
+sy d
+par sons
+un official
+hy ped
+sp ends
+oppo sed
+v ings
+space x
+noti fication
+deci ding
+bio tech
+out si
+sal ah
+! .
+fe d
+ss y
+c ms
+bad gers
+cr o
+ela ine
+n ba
+dy our
+n ant
+honey moon
+climb ed
+conom y
+ath a
+m ell
+ne bula
+nature photography
+juli e
+bm x
+inve sted
+mon o
+lieu tenant
+wat kins
+techn ician
+o se
+ka e
+ì Ľ
+mc queen
+pre ach
+trav eller
+flexi bility
+ze bra
+reta iler
+p ant
+ben der
+brand t
+squ id
+war rant
+veri fied
+cas s
+pier cing
+hon ours
+t ying
+mor ris
+kis sed
+op rah
+panor amic
+me i
+splat oon
+wich ita
+ari as
+gal li
+indy ref
+good times
+athe ist
+confe ssion
+ow ski
+re pping
+ad ditions
+mechan ism
+z im
+j ans
+su f
+cho pped
+beg innings
+vitam ins
+ãħ¤ ãħ¤
+or th
+po les
+ru b
+antarc tica
+indie film
+web cam
+ket ch
+bre tt
+cle ment
+her on
+defe ating
+hydr o
+buc ket
+wand ering
+sid ney
+future of
+b inge
+on ies
+knock out
+administr ator
+syn the
+l ent
+jan i
+bar ley
+premier league
+ner ds
+cr m
+bra s
+bot any
+evol ved
+rot ter
+ro wed
+tum or
+weal thy
+Â Ń
+mon arch
+li shed
+da hl
+ðŁİ ĥ
+bu ch
+ken yan
+Ø §
+red ness
+assemb led
+se mit
+hud der
+shro p
+ran i
+lear ning
+mor y
+iti a
+geo graphic
+worl dof
+f b
+pho sp
+boo gie
+am ped
+? ...
+che w
+dwar f
+ar us
+s sen
+ru sty
+recru its
+h k
+gar de
+app lause
+vol umes
+invol ves
+ta c
+hand bag
+trans late
+ffe l
+se ym
+aqu atic
+trans fer
+zo di
+and r
+acade mia
+cr ater
+te z
+ar se
+adap t
+col oni
+snow man
+mal i
+hang in
+di schar
+oy sters
+pho e
+colon el
+w ba
+hispan ic
+thri ving
+sh y
+ag les
+sales force
+cre me
+so les
+la fayette
+â ī
+ter ia
+ach a
+sp erson
+go go
+car ly
+the ore
+am ore
+vo x
+af t
+ãĤ ¹
+stap le
+mu ffin
+di agram
+ino x
+su stained
+av ent
+me ta
+arbit r
+dec ay
+ado le
+Ð ½
+ec ol
+ph o
+n k
+o cu
+gr anny
+ç a
+luxemb our
+stad t
+alber to
+le vit
+am as
+d x
+or phan
+co bb
+as c
+lo gy
+immen se
+chan ts
+off line
+p ent
+bre x
+w inger
+plan e
+i el
+nichol s
+ca thy
+nar uto
+low ed
+/ //
+ignor ance
+cat astro
+you ts
+sch en
+buil d
+haz i
+s ine
+critical role
+du g
+dete ct
+lo gs
+en amel
+stpatrick sday
+ed die
+co pa
+cigare ttes
+ho ff
+kay a
+la goon
+ra pha
+air borne
+choo se
+puer tor
+ke v
+gui ding
+fro sty
+bor ough
+mir a
+ðŁİ Ĭ
+cade t
+anu sh
+yo gi
+e ger
+fl ing
+slo pe
+nin th
+we ston
+foot wear
+f n
+may weather
+a am
+pla in
+stair case
+witne sses
+work outs
+ro bust
+dex ter
+co hort
+ðŁļ Ĺ
+sp ell
+ha ze
+o om
+organ ising
+wild fire
+cont acts
+av on
+min o
+upd ating
+ðŁį »
+li thium
+ing ual
+k is
+au ga
+lo com
+de duc
+u da
+th ak
+boy le
+mp er
+hot tie
+eri k
+re vised
+is la
+travel photography
+oo za
+en qui
+confe rences
+clo ver
+g room
+cur ves
+live on
+per f
+displac ed
+bo log
+xx xx
+ðŁĺ© ðŁĺ©
+te al
+ve ssels
+rain forest
+cal ci
+pan ther
+gira ffe
+ta sted
+imag ery
+pad res
+day time
+bas s
+ri pe
+opio id
+nu e
+vin yl
+invent or
+sen s
+process or
+mu t
+gad gets
+bibl ical
+shann on
+jacqu eline
+car y
+the resistance
+ali en
+n vi
+co sy
+bi har
+fo ley
+ren d
+mu gs
+fa ken
+cl one
+ni allo
+gra bbed
+chi hu
+power house
+n tt
+chero kee
+spon ge
+imple menting
+rh ine
+le one
+ðŁį Ģ
+pret tiest
+infra red
+impro v
+swit ched
+tu bes
+con tr
+bl k
+projec ted
+be aver
+yo t
+bbcra dio
+thi gh
+per secu
+apologi ze
+w ack
+po ster
+oli ver
+az a
+lou d
+( ?)
+f the
+women shi
+spar row
+blu sh
+us able
+sc ales
+it ative
+peu ge
+ne eding
+legg ings
+glam orous
+mat ur
+c z
+wat t
+da b
+tam ar
+et sym
+bau er
+heart felt
+h n
+else where
+bir ch
+alu mini
+hu ck
+e me
+j l
+traf ford
+d z
+por tions
+ana sta
+arthr itis
+esp n
+ber gen
+viol ation
+yo shi
+c z
+northumber land
+clo sures
+ðŁĩ¯ ðŁĩ
+smi ley
+r w
+tel ugu
+inten si
+gre gg
+ve ga
+dun geon
+south bound
+ba il
+domin ican
+semi final
+chap ters
+h itch
+van ity
+trans iti
+recomm ends
+sati sf
+bar ca
+queen s
+( (
+de struc
+stra it
+ra vi
+dess erts
+in tru
+har am
+k os
+fo e
+fat ty
+pais ley
+magn itude
+dri dge
+com ey
+schem es
+vision ary
+our t
+down loaded
+ðŁĻĮ ðŁı½
+gd pr
+lan i
+p wc
+gu ad
+nic est
+stake holders
+re ferred
+george town
+arvind kejriwal
+schnei der
+in doors
+all star
+strand ed
+gen der
+ze pp
+ma sses
+ðŁIJ ±
+pati ently
+bl dg
+z ab
+we arab
+vi vid
+he ck
+d ella
+sy mb
+je opar
+la ger
+à ª
+comb ines
+ne c
+br ay
+flo p
+tx wx
+jo ys
+pon t
+pro found
+sur round
+mad hu
+ma ble
+ay r
+te as
+n sa
+open ly
+er nest
+ãĥ ©
+to po
+g na
+anti oxid
+ti an
+e tr
+c ello
+ma thi
+gener osity
+b iting
+man ic
+kel sey
+chee ks
+ten der
+w th
+pron oun
+ultimat ely
+gu sta
+ari anag
+ger ry
+ble ed
+red dy
+mic h
+mitsubi shi
+oper ated
+sex ually
+ma u
+cl lr
+vi ds
+co c
+mel ted
+ðŁĮ Ī
+q ld
+ite ch
+instru mental
+end game
+ðŁĵ ĸ
+ener gi
+brow nie
+tam il
+at in
+domin ated
+pra ises
+fire place
+sens ational
+men a
+k arti
+un prece
+ru pt
+ori ental
+mc cor
+tour naments
+scen ter
+re eves
+prescri ption
+sam e
+fra u
+tru ffle
+em bo
+roman s
+bla sts
+techno logical
+pr at
+b sb
+y ar
+tren dy
+ac l
+al ad
+ðŁį ģ
+o hh
+bankrup t
+tho ven
+regar ds
+is er
+war wick
+vine yards
+real m
+niallo fficial
+do ta
+ge mini
+to do
+v able
+¨ ¨
+la u
+wre ath
+ju ve
+nat asha
+le ver
+lor i
+hor ser
+cc tv
+air bnb
+es anders
+sin clair
+ema biggest
+high school
+con test
+optimi stic
+t te
+ðŁĴķ ðŁĴķ
+ss d
+ye e
+hel ena
+con sen
+ric ks
+jes se
+an ic
+ðŁİ ¯
+re acts
+ro be
+independ ence
+vol tage
+m ington
+s ant
+à¸Ļ à¸
+-------- --------
+sentin el
+ke tt
+rehear sing
+aaaa aaaa
+sof the
+stir ling
+sear ch
+wi gan
+stand out
+sna il
+pent agon
+Ä ģ
+ch lor
+cru st
+net any
+chemi st
+disapp eared
+ric ardo
+sp iders
+bo se
+war ren
+me ssing
+bann ers
+gu el
+par ach
+ma id
+coun ted
+epi le
+bon fire
+speech less
+se tter
+meas ured
+rejec ts
+nik ki
+le ster
+foren sic
+fab rics
+alo ha
+pre served
+wat ford
+deta iling
+dar th
+bo u
+car ly
+... '
+tail gate
+noti fications
+å ¤
+pas sive
+trous ers
+balo ch
+ro ther
+typic ally
+Ã ¥
+sp it
+wi z
+sic ily
+technic ally
+ex pose
+st age
+hu bb
+cre am
+cap s
+po ke
+sle ek
+ju ne
+tempor arily
+de z
+awak ens
+l ame
+_ -
+ji ha
+tues days
+advis ed
+advis ors
+exi sted
+dis agree
+news room
+lo sers
+world tour
+dr ying
+al di
+har ness
+foot print
+hobb it
+p mln
+i ro
+que red
+asse ss
+gaz e
+sa b
+th ian
+í Ĭ
+ti f
+ob serve
+ev il
+dra wer
+swee p
+cor y
+co dy
+kyo to
+cal lum
+n inj
+lau rent
+be i
+sket ching
+custom ized
+du r
+regre ts
+knox ville
+ìķ Ħ
+mess aging
+grac ie
+abun dance
+bi dding
+bre wed
+fl ouri
+therapeu tic
+alt itude
+ho gs
+bur ner
+elec tro
+wonder fully
+he ater
+post pon
+li very
+r all
+ad as
+a ac
+sau l
+brook lyn
+play house
+âĻ¥âĻ¥ âĻ¥
+char itable
+in y
+z ah
+compet itions
+be av
+plu gged
+o is
+do om
+astron om
+speci alized
+max i
+ta ps
+cellu lar
+depre ssed
+folklore thursday
+cri b
+e mul
+ë° ©
+fi gh
+ru z
+car lisle
+spe ar
+side walk
+de i
+depend ent
+lac es
+nh s
+ðŁĮ Ļ
+reali zing
+net work
+ric he
+re gin
+re fresh
+st ral
+pa thology
+pla id
+psyched elic
+hin d
+u ka
+algori thm
+lin king
+progre ssi
+fe y
+d ade
+hydr ated
+b ant
+fam ed
+cot sw
+bo ise
+as c
+rac ing
+ja vier
+ww en
+mar lins
+poo p
+swe pt
+toni ghts
+we f
+ani me
+slo vak
+âŀĸ âŀĸ
+cla us
+lem me
+cli ppers
+re ls
+arianag rande
+r te
+ko t
+thal apathy
+hungar ian
+zu ma
+y von
+is u
+jour neys
+clin ics
+be be
+ww f
+n ws
+super heroes
+er it
+sle ague
+identi fication
+mo tto
+ba i
+sour ced
+ill er
+ap i
+pri se
+unprece dented
+dam as
+tuni sia
+dra in
+undere stim
+e ther
+quarter ly
+rewar ding
+al ham
+wolver ine
+cab ine
+hyp no
+nad ine
+hav ana
+da e
+ðŁĵ Ī
+dr on
+read ings
+b ati
+pic o
+mer ci
+iti an
+wal kers
+el ope
+mi key
+god zilla
+bur lington
+abu ja
+social ism
+at ility
+sh ell
+harry potter
+g no
+ab ur
+re leg
+fel ici
+ro gen
+neuro science
+inst in
+ath am
+vou chers
+j arre
+fu se
+def ici
+monte rey
+de port
+mid day
+pp ard
+fre ed
+ame ter
+wil t
+n ingham
+pr att
+liber ty
+slo gan
+o to
+pr i
+co ated
+c pd
+ne tt
+il las
+mal awi
+evol ve
+accessi bility
+ðŁĶ¥ðŁĶ¥ ðŁĶ¥ðŁĶ¥
+or nament
+b p
+el is
+son line
+chi ro
+fl ick
+ib m
+ar ak
+en ables
+gar land
+san e
+cu ties
+tri p
+rotter dam
+n ys
+lam ps
+lu cas
+bo g
+ra ils
+travel led
+hic ks
+en u
+sab ha
+scru b
+hi er
+hart ford
+fo o
+fer nandez
+tre vor
+mat tress
+appo intments
+ale j
+fe i
+o logist
+saf ar
+oc ta
+sr c
+sha un
+ambi ent
+dri c
+bi ker
+she e
+must ache
+h ta
+bo one
+her ty
+car dio
+bra kes
+rec ital
+consi sts
+overwhel med
+cau l
+robb ins
+im it
+al th
+ur l
+bi bli
+on ne
+black livesmatter
+diffic ulties
+tel ang
+tall er
+ðŁĵ Ĩ
+deb ating
+bur rito
+mo vember
+strength ening
+bo e
+te stam
+mirac les
+base ball
+re nee
+ðŁijī ðŁı»
+al fa
+âĺ ĺ
+unstopp able
+ec s
+g mo
+giftide as
+path way
+fen cing
+ðŁİ ¤
+b ham
+ra s
+sk o
+d led
+thel ast
+magn um
+bin ary
+wil de
+wil der
+wh ati
+barbe cue
+h ism
+can oe
+kur di
+eli ve
+advant ages
+mad ame
+bi er
+mis sing
+enter tain
+air force
+y ama
+c is
+hash tags
+j is
+ve il
+dream y
+ten se
+may ward
+ch ateau
+hunt ington
+âļ ĵ
+v all
+up on
+bl ouse
+dun es
+ðŁĺ ´
+fert ility
+m ole
+curren cies
+st u
+ber lin
+toa sted
+div as
+wal t
+lar k
+por a
+hit ter
+um er
+chil led
+bal ancing
+fa is
+y in
+or tiz
+east enders
+h ate
+ur al
+ap ril
+tim el
+à ±
+per o
+sto cked
+respec ts
+th t
+best friends
+giving tuesday
+be ad
+inv ent
+im i
+nap les
+comb ining
+tok ens
+thir st
+ma sc
+par rot
+sp u
+dent on
+* -*
+t res
+subur ban
+wid th
+si ve
+con tender
+siri us
+lo k
+troop ers
+outra ge
+tur bo
+frag ile
+me ssed
+do h
+disc ord
+netany ahu
+re sign
+forgi veness
+mo han
+mun ch
+cam ou
+identi fying
+enab ling
+hot ter
+thorn ton
+jai pur
+ar ya
+ðŁı» âĢįâĻĢï¸ı
+mu staf
+maj ors
+o ke
+du ffy
+roh ing
+til t
+ðŁĩ®ðŁĩ ³
+rock star
+she ep
+hend rix
+ra v
+in vention
+do u
+lagun a
+gru mpy
+sw is
+im pe
+) '
+you ths
+bun ker
+st ache
+oppo se
+indi es
+acceler ate
+ml p
+ed en
+w ann
+k ail
+akshay kumar
+su pt
+pol ym
+midd leton
+extra ordin
+wil son
+australi an
+alumini um
+way ne
+alum nus
+mat ics
+gri m
+er nie
+opp a
+competit ors
+rand all
+h ence
+decla res
+pre aching
+sha he
+can e
+sustain able
+stap les
+le dge
+ad ena
+doctor al
+bur gundy
+decor ate
+ren dered
+ri sen
+pr ank
+di or
+bee thoven
+flo or
+ac com
+to t
+ho dg
+touri sm
+say in
+objec tive
+mar kers
+premi ership
+en abled
+camou fla
+gi ant
+Ñ ģ
+smo key
+ric ket
+pan g
+de pending
+s ation
+evol ving
+inter cep
+cen sus
+tof the
+re en
+mendo za
+trum pet
+marke ters
+an it
+ðŁĻ Ĭ
+north western
+v la
+foto gra
+blackand white
+che wan
+wi g
+tro om
+ginger bread
+k n
+ro mero
+n fc
+or chi
+fun ko
+sour ce
+f s
+ra ped
+o st
+tar ot
+ann ually
+ðŁĺ ¬
+r ill
+del av
+.. !!
+se s
+can n
+medic are
+ph el
+ape x
+guardi an
+rema ined
+r pm
+a ñ
+story month
+instag ood
+neighb our
+p ing
+sem ite
+my stic
+as cot
+mat er
+hand ful
+dang ers
+ti d
+ana heim
+opol y
+sh allow
+nami bia
+tor ia
+procu rement
+big bang
+announ cements
+prosecu tor
+beng als
+sal le
+en roll
+ga stro
+sugge stion
+ba k
+ha ul
+budd hism
+berni esanders
+flu te
+fati gue
+cyn thia
+cho i
+ir win
+gu a
+str ous
+h p
+ba p
+satisf ying
+play a
+ðŁİ ¼
+inst ap
+al ice
+t p
+irri gation
+ðŁĩ¬ðŁĩ §
+in tric
+clu es
+ple x
+sa x
+he pat
+dump ed
+signific ance
+by u
+medic ation
+pro v
+tough est
+corn ish
+âŀ ľ
+kel ley
+u v
+si zz
+si bling
+me st
+di stor
+diplom atic
+aun tie
+b hat
+son ic
+bren da
+pump kins
+ro ch
+black burn
+ur ged
+shi a
+arrange ments
+floo d
+sa unders
+lec turer
+nou ri
+popul ations
+diplom acy
+consist ently
+ðŁ¤ Ļ
+t mund
+cauli flower
+l ily
+vocab ulary
+vari eties
+coo ker
+up town
+qu ent
+mo sa
+re inde
+velo city
+spru ce
+social medi
+i ber
+volun tary
+proce ssed
+bal tic
+y ang
+leban ese
+d p
+dol ly
+arrange ment
+y uri
+cran berry
+kal yan
+elev ation
+cli ff
+pu shes
+ìĬ ¤
+sil ic
+co wx
+eter nity
+sla ves
+vine gar
+glou cester
+con tained
+breaking news
+aga inst
+renov ated
+norm andy
+hero in
+ys m
+mo ds
+gre ek
+un di
+tren ch
+v h
+encoura ges
+head ache
+gr ange
+: '
+ever green
+Ù Ĭ
+reck on
+ab used
+th ru
+cho ice
+ti dy
+col der
+scho ice
+ha in
+bru m
+li ars
+bre it
+yor ker
+sh ack
+he idi
+micha els
+sco pic
+fasci st
+play ful
+ca c
+yas ss
+sh ad
+.. ?
+qu en
+ram irez
+clif ton
+pr s
+best fan
+âģ ł
+gener ating
+head set
+disappo intment
+abstr act
+bo iled
+paren thood
+azerbai jan
+exhib iting
+bom bay
+oli vier
+ko so
+un lea
+mat ernity
+iz er
+si ves
+r hu
+col l
+saskat chewan
+fre akin
+de k
+na g
+stab ili
+ðŁį ķ
+organi zer
+bo sses
+ar u
+u va
+at able
+ta un
+after wards
+fert ili
+ver ge
+az i
+mor ph
+๠ģà¸
+jer k
+cosme tic
+ko w
+stru st
+ap ache
+post cards
+for mul
+ì ĭ
+spin al
+jack pot
+elec tri
+Ã Ń
+lo y
+gra der
+diab lo
+ar di
+he sit
+f w
+arch ery
+pa sh
+the ories
+repe al
+re live
+per cy
+âĺ Ĩ
+im in
+syn chron
+sham poo
+coup ons
+o to
+la i
+thou ght
+luxembour g
+mo v
+ðŁĺ ¥
+ge mma
+se ated
+m ga
+strat ford
+un certainty
+shi fts
+est o
+fo ol
+fire arms
+cor rie
+ki ki
+appa rent
+p ills
+olym pia
+fi d
+elev ated
+de cks
+ignor ing
+av alan
+ro v
+whist le
+p tsd
+milit ants
+robo tic
+pac ers
+quil t
+bankrupt cy
+lic h
+per cussion
+celebr ity
+al s
+( ;
+su t
+pokemon go
+h g
+off s
+gibr altar
+scre ams
+billi e
+gen ome
+mar in
+be ams
+arch bishop
+em in
+bedro oms
+g ated
+ol ly
+warran ty
+at own
+cudd les
+gun na
+k ic
+vi ve
+cy mru
+nar row
+pro b
+le o
+refe rences
+manufac tured
+cho pper
+brun swick
+sem is
+don ia
+r ye
+man o
+hur ting
+? #
+hol li
+investig ations
+c els
+ðŁĵ ŀ
+le ster
+temp les
+sto rey
+mc mahon
+toi lets
+wo of
+ï¸ İ
+le verage
+at om
+night mares
+victor ious
+haun ting
+custom er
+ag i
+yo ongi
+mon ty
+ver onica
+w ur
+inti mid
+blan kets
+volu tion
+j m
+âĺ İ
+am on
+jud ith
+ðŁĺİ ðŁĺİ
+distr acted
+dri p
+hurric ane
+and es
+revel ation
+tro op
+ab leg
+col lin
+tibet an
+wor rying
+inter nationally
+eat er
+camero on
+brad or
+y uk
+ðŁĴĹ ðŁĴĹ
+tra k
+slo pes
+ci er
+ne a
+ol er
+ta ka
+albi on
+volcan ic
+am n
+a fi
+ob stac
+face time
+ger ing
+n pr
+metall ica
+organ ic
+ðŁĴ ¡
+ki dd
+d ances
+pemb ro
+wash er
+m its
+om er
+emo tionally
+tan go
+ip o
+do cks
+scan ning
+spec s
+tho m
+the ology
+emer gen
+om i
+g pa
+selec tions
+un necessary
+ima ge
+ter s
+induc ed
+gi gan
+rent als
+supp lied
+m fa
+shan kar
+lat er
+pa jam
+cla ve
+Ù ģ
+ma hin
+carl son
+avi an
+ano va
+kati e
+aj ith
+design ated
+chocol ates
+investig ators
+gla zed
+prin cess
+er ry
+ra gn
+ou rable
+hr u
+sun dance
+peuge ot
+steam punk
+gh lin
+gre ase
+hi res
+z ap
+per ce
+j ill
+tom e
+he hehe
+joy ful
+mae stro
+ni shed
+gene alo
+v ich
+p its
+fox es
+good man
+emer son
+lo bes
+con verse
+o ats
+thom son
+ra him
+mal ware
+ah i
+man kind
+re sin
+im g
+sw ood
+kin der
+sc roll
+ar a
+sak ura
+ro bbed
+xi on
+ny a
+c ism
+ce dar
+be in
+mour ning
+tor to
+heath row
+done gal
+bar b
+hydr ation
+k or
+elim ination
+su pdates
+hill s
+appe ti
+star red
+ko m
+gw en
+dd d
+cra y
+sc anner
+personal ised
+seren ity
+re design
+meta ph
+box ed
+judg ment
+no se
+ë ¹
+er ad
+ac ne
+supp liers
+ener getic
+v om
+as ap
+ðŁĶ ¸
+ir vine
+hat ch
+la ss
+ad ren
+waff les
+accur ately
+ici o
+itt le
+se un
+occup y
+web cam
+thene w
+ent es
+ga i
+j w
+accoun table
+vis or
+ir rit
+licen sing
+hudder sfield
+gen ie
+ðŁİ ¾
+atmo spheric
+ten sions
+spart an
+clif ford
+ol an
+north bound
+ame en
+cen sor
+u el
+ster y
+$ $
+far rell
+hy ster
+cl t
+se dan
+rep lied
+descri bing
+micro wave
+sla b
+pro sp
+assi sting
+ru bio
+e than
+hh hhh
+gu ay
+z man
+ra ise
+roll ing
+o e
+n ile
+ambro se
+scar borough
+hero ic
+coo ks
+mor t
+chop ra
+ðŁĮ ·
+to b
+shav ing
+stac ey
+dor m
+motor sports
+wi ki
+fol ds
+sp iced
+stress ful
+liter al
+fu dge
+pe ggy
+wa ite
+tre sses
+se sh
+pr ic
+ðŁİ ħ
+fri ght
+r va
+mumb ai
+po m
+tt v
+cel lar
+tom e
+andro id
+dor is
+tsun ami
+tin der
+o ec
+m wc
+dor tmund
+no thin
+l iti
+so u
+believe in
+at u
+kno cks
+mag ni
+ss sss
+ro hit
+ine ws
+ang i
+m andy
+ke ttle
+intermedi ate
+av ant
+cur l
+endor sed
+ori o
+ur t
+consider ation
+wi res
+shel ters
+b ino
+vik ram
+imple mented
+ly dia
+bu k
+paro dy
+c news
+under graduate
+canu cks
+sam i
+polit ically
+ro tten
+gh z
+tex tiles
+over load
+moder ni
+recre ational
+fli r
+bat on
+typo graphy
+ov ation
+intrigu ing
+pilgri mage
+al ge
+ad ays
+tcm party
+sp elled
+cur ls
+boo ze
+ste m
+ann es
+ir ls
+spon ge
+sho pper
+sig nation
+bra ss
+mi stress
+le ah
+beg inner
+lau derdale
+augu st
+pre school
+ta ping
+tai pei
+execu tives
+b d
+rhe tor
+esc or
+immun o
+deeplear ning
+stat ues
+it us
+manu script
+ly ric
+cor vette
+mol ly
+la ge
+de p
+cn bc
+le st
+je ssi
+fi fe
+griff ith
+oppo sing
+ran g
+dr ills
+respec tful
+p ity
+d ell
+har ding
+play boy
+blo ke
+shut out
+k ili
+o sp
+se attle
+bc poli
+mis es
+journ als
+team ing
+es ther
+fre ddy
+Ķ ï¸ı
+metr ics
+no tre
+gar ry
+for ty
+navi gate
+perio ds
+bened ic
+j id
+da w
+ance stors
+restor ing
+con g
+aller gy
+tit anium
+c ence
+lean ing
+ab bas
+v ast
+uc f
+roof ing
+e man
+seve rely
+vo gue
+ve au
+in bound
+d z
+tane ously
+stret ching
+man chester
+dr yer
+dav is
+kan th
+the game
+it ted
+re tain
+el les
+conge stion
+frat ernity
+ol lie
+lo ki
+fre ely
+cho o
+pon y
+sc ep
+tab ly
+bal t
+rock n
+di me
+lo gging
+ðŁį ·
+ad u
+ha voc
+water ford
+char is
+swee tie
+run ning
+ner d
+erdo gan
+z ara
+weigh ing
+fif ty
+pre cise
+low ell
+kurdi stan
+r yo
+or th
+syn th
+lin ers
+phenomen on
+art illery
+il legally
+constru ct
+nostal gic
+gar th
+al ta
+shel ton
+a sean
+w ander
+dur ban
+di versi
+bon o
+cl on
+le man
+sh un
+obstac les
+appet ite
+fe eder
+respir atory
+di xie
+formu la
+an to
+so ber
+extin ct
+au c
+ing les
+legitim ate
+; ;
+min nie
+ipsw ich
+dram atically
+ðŁijı ðŁı¼
+ingh am
+milit ary
+mon et
+us navy
+for k
+dun no
+play er
+q otd
+st oo
+ex or
+ethiop ian
+film fest
+pe red
+c ate
+sau di
+in ner
+sin cere
+tion ality
+ale e
+de eds
+cooper ative
+ir onic
+cro cod
+br ary
+post season
+cam per
+can ary
+e in
+exten sions
+nb d
+sher wood
+spo kane
+hu mp
+jit su
+ê ¹
+dar yl
+p si
+stab bed
+offer ings
+expe cts
+cav al
+body building
+fr aming
+f ca
+ye arly
+bom bed
+sk il
+resear ching
+jud iciary
+gree ted
+tu dor
+mil o
+innov ate
+ðŁĺ Ľ
+r hs
+ru by
+contribu tor
+fam er
+soci ally
+m lin
+fi ery
+ut ter
+beau t
+it os
+de voted
+rain bow
+bar ney
+pe ren
+ar jun
+r na
+gab by
+ut i
+hann ity
+pick le
+ser v
+qu akes
+pp e
+fe m
+wh itec
+j n
+victor ies
+ðŁ§ ¡
+gol fer
+congratul ates
+resul ting
+mechan ic
+ur ve
+cen tered
+kie v
+an s
+in cub
+< <
+c mo
+bestfan army
+dap h
+en ham
+on cology
+ku sh
+t xt
+ori ented
+fashion able
+c sr
+sa hara
+r ack
+pd p
+han son
+ภĩ
+ti ers
+ra r
+pan am
+in sky
+sa hi
+testam ent
+asth ma
+in her
+fisher ies
+or der
+ho we
+gall on
+ep is
+suz anne
+drow ning
+paneli sts
+ðŁĺ ²
+ë ¦
+al ach
+commemor ative
+at tribu
+ðŁij »
+mo o
+visi onal
+week sary
+gu st
+ak in
+poin te
+ee e
+di spar
+ni pp
+dent al
+st all
+pi an
+bor e
+ul ster
+tic k
+ir r
+tae hyung
+micro phone
+bermu da
+ga ard
+el er
+plumb ing
+hu gely
+âļ« ï¸ı
+race way
+cam bridge
+mar cel
+burn ley
+to ast
+holly wood
+fa sting
+me red
+hib ition
+ca pped
+benef icial
+ow ning
+cont amin
+arab ian
+to on
+cap ac
+hul u
+sm ir
+nutri ents
+se in
+graph s
+con ditional
+ðŁij ħ
+or ac
+play in
+nor the
+tor nad
+mar ian
+ju mbo
+lex i
+incredible india
+road to
+uk one
+confu sing
+sp h
+shan k
+pi ed
+mq m
+positi vely
+sher ry
+path ways
+consi ders
+tof u
+argu ments
+resil ient
+che tt
+with dra
+ter o
+ated ly
+sw ana
+he b
+fli ght
+har ley
+decre ase
+kind le
+book shop
+³ ï¸ı
+marty rs
+sm ur
+mc cl
+concer to
+sti me
+rejo ice
+app lau
+cle ment
+mer kel
+jai me
+im mortal
+isle of
+mar co
+youtu ber
+stal king
+me too
+st ack
+sp ouse
+u st
+lu v
+âļ¾ ï¸ı
+eque strian
+ev ing
+fl in
+nick name
+the big
+as ar
+st acks
+wal ker
+bor a
+kidnapp ed
+hur ling
+humb old
+rec alls
+co pper
+ann is
+se o
+mer ger
+mu ir
+ad dy
+ðŁĴª ðŁĴª
+be x
+cr acy
+con an
+congratul ation
+mid st
+âĻ ¬
+for bi
+op tic
+cr ate
+crocod ile
+mad agas
+secur ing
+ast on
+o gue
+savi or
+salis bury
+love it
+fuji film
+cast les
+as st
+ar rows
+sp acious
+tr s
+poly vore
+progre ssion
+m ri
+nel son
+bi m
+indic ator
+o da
+pe pe
+re signation
+gu t
+sne aker
+log ically
+az y
+are lla
+te aring
+jo shi
+ssion ism
+q pr
+mari ah
+p x
+ble ed
+mi an
+med ley
+we iss
+ker ry
+gat ory
+at al
+madi son
+av enger
+nab y
+pl and
+gi les
+fresh water
+d ington
+ta j
+demonstr ates
+n tv
+bul bs
+sunday morning
+pe ake
+souven ir
+wa h
+ton nes
+m kt
+complex ity
+con den
+ross i
+b ing
+y ds
+su k
+n go
+mid land
+ol y
+life is
+ri pple
+mo reno
+dd ers
+tu s
+á ĥ
+bou l
+x a
+hol dings
+wn y
+shadowhun ters
+ke i
+asp ire
+m ous
+ow en
+so ak
+skir ts
+moun taine
+stor ming
+ch rome
+ri ots
+sar ato
+amaz e
+less ness
+nav ar
+crit eria
+ra fa
+indul ge
+ay er
+por to
+nam o
+........ ........
+yi elds
+val le
+j h
+mac ron
+sa ins
+dur ant
+tra ilers
+wo t
+confeder ate
+sh rin
+id ol
+form ally
+ten e
+motor cycles
+than g
+no de
+bang er
+dal y
+p ats
+enroll ment
+au ctions
+at al
+ar bor
+lo gos
+de arest
+trans action
+dom ingo
+fle a
+ser mon
+de ck
+sin cere
+questi oning
+juli o
+was p
+pre tz
+armen ian
+k ham
+inflam mation
+picture sque
+acci dental
+film makers
+ðŁĺ ļ
+ðŁĴ į
+ca sey
+so b
+yee zy
+good will
+parag ra
+ss ly
+fe ather
+dy ed
+assassin ation
+na de
+b cs
+app lies
+femin ine
+fe u
+ext ent
+depu ties
+l ack
+psy chic
+go i
+kill ings
+pse u
+ðŁ¤ ª
+un c
+mar l
+tan e
+mck enna
+sur fer
+influ ences
+free way
+hack ney
+mal aria
+el and
+te au
+rema stered
+Ø ±
+raz or
+gg y
+cor ro
+lak sh
+fla ir
+honest y
+hoor ay
+de pp
+am c
+wedne sdays
+q a
+ed its
+- $
+se villa
+dou bled
+human ities
+c cot
+som os
+r ine
+af a
+si oux
+re construction
+wel ding
+th reads
+am ish
+encoura gement
+po der
+bo ck
+bal m
+p tions
+stand up
+accompli shments
+guar ding
+convic tion
+ac ion
+napo leon
+depic ting
+att ack
+su i
+wear able
+âĸª ï¸ı
+pot ter
+esc ort
+vis e
+to ts
+bo on
+event profs
+angu lar
+womenshi storymonth
+bar row
+sch i
+ac comp
+ti k
+l end
+kensing ton
+wol fe
+st acked
+cra shing
+exhi bit
+wing ed
+sab rina
+ma sa
+k ms
+alway s
+et t
+pla sma
+counsel ing
+pick les
+nfl draft
+mr s
+inev itable
+coura geous
+staf ford
+writers life
+ho s
+e j
+gh yun
+trade mark
+adri an
+influen cer
+coron ation
+ra ging
+explo red
+usa f
+excep tion
+eu x
+tan ker
+sw ami
+pac ket
+ðŁij¨ âĢį
+f en
+she en
+a ero
+j l
+re gal
+nw t
+au ster
+meh ta
+char ge
+a ste
+b ate
+inf eld
+racec ourse
+collap sed
+fle ece
+z il
+al lie
+alternati ves
+geor ges
+ðŁĵ į
+quir ky
+fc b
+nat geo
+philanthro py
+bra i
+every day
+ðŁIJ °
+ach ers
+ja an
+fin es
+q i
+fisher man
+distin ct
+gri mes
+nation alist
+comm ence
+ro wn
+âĢ ³
+z ing
+f ter
+hr w
+baro que
+bl ender
+kitt y
+hoo ks
+c ited
+w anda
+consen sus
+reinde er
+an and
+supp ly
+me ds
+v n
+ol ph
+rat chet
+shel don
+secur ities
+ë°© íĥ
+cro m
+mosqu ito
+j eric
+im mac
+dimen sions
+â ¤
+di ssi
+sponge bob
+dami en
+steven son
+jo anne
+del ish
+yi kes
+than x
+surve ys
+postpon ed
+alco holic
+al ised
+ðŁĻı ðŁı»
+do ch
+sen tim
+mered ith
+com pares
+b ago
+happy days
+mo ss
+ãħ ĭ
+ne c
+gn ment
+frustr ated
+comb in
+ri v
+ec lec
+col lo
+compli ment
+actor slife
+ct to
+nic ar
+op hon
+apar the
+man t
+ja de
+trol ley
+optimi zation
+eye on
+eco logical
+qui st
+ep he
+ॠĩ
+cin co
+appo ints
+old school
+c pr
+behavi oral
+min aj
+:- (
+tag ging
+ev al
+jo aqu
+ðŁĺ «
+ha k
+de me
+jama ican
+so s
+hy att
+hand book
+libr arian
+hanni bal
+pump ing
+ch om
+f man
+ga i
+hu ll
+respon ders
+green ville
+n us
+vau gh
+ðŁİī ðŁİī
+ta xi
+gold berg
+man tra
+te ase
+forbi dden
+metho dist
+ati vity
+* ***
+ec t
+mc gr
+Ħ ëĭ
+se b
+amid st
+disapp ear
+thy ro
+phili ps
+er ina
+v icious
+stream er
+million aire
+ma p
+str ick
+hack athon
+gh a
+ed ic
+mi ka
+pe ck
+ill i
+anto ine
+ar ca
+op tic
+ma ure
+ðŁĩ¦ ðŁĩº
+cla shes
+man ly
+âĺ ģ
+al var
+and res
+me i
+el m
+ww ww
+al tered
+l te
+ê¹ Ģ
+mo jo
+for rest
+thal ai
+non t
+spee ches
+acknow ledge
+ign ite
+x factor
+ðŁ¥ Ĥ
+mead ow
+disru pt
+debu ted
+scrim mage
+pharmaceu tical
+fi dd
+found ations
+philosop her
+et al
+publi shers
+bo ys
+c ke
+ru gged
+opti mism
+re be
+phil harmon
+nar cis
+ral lies
+lu is
+go blue
+fol ded
+un acceptable
+optim al
+li sa
+pol aro
++ .
+en za
+âĿ £ï¸ı
+mon opoly
+grace ful
+dair y
+du a
+diffic ulty
+judge ment
+o si
+mer sey
+flu x
+new found
+ter ns
+dimen sional
+in vic
+al ba
+am it
+abudha bi
+alger ia
+autom obile
+the ad
+lo tion
+acceler ator
+vac ant
+iti on
+lu f
+al ic
+pl l
+bla zing
+ba z
+sen e
+ðŁij ¼
+villa ins
+direc tory
+eis en
+to ck
+broch ure
+ri pp
+hb d
+zayn malik
+nic he
+lo lol
+certific ates
+mor se
+fac up
+x ham
+un wanted
+im ports
+carne gie
+fan sign
+mo u
+r alph
+destroy er
+sw ing
+trek king
+cili ation
+pit bull
+g aps
+ho well
+defin itive
+mc le
+f ps
+et z
+bol ly
+lyn n
+gan o
+at ure
+fur suit
+co il
+na v
+but ts
+tro jans
+eu re
+en ko
+sch umer
+horri fic
+install ment
+br b
+subur bs
+a bel
+vi r
+de sh
+cun ningham
+ðŁIJ »
+span n
+sch we
+ke mp
+tr u
+ste alth
+qu es
+le w
+deli ghts
+ko ch
+hu mili
+cr iti
+il t
+sp ells
+mi ley
+car ic
+ðŁį ´
+lc fc
+substitu te
+oun g
+? !!
+af fir
+predic table
+class of
+er r
+cy press
+chand ra
+age ing
+__ __
+ther land
+don caster
+el in
+yo shi
+sail ors
+har ris
+jo anna
+niger ians
+h ers
+pla gue
+pro cra
+k no
+can ton
+busine s
+un h
+pra kash
+c in
+bow en
+co ating
+m als
+be gging
+smith son
+ponti ac
+sp ies
+dam ian
+pl ine
+und ant
+al ta
+one ss
+shame less
+da q
+bb m
+wal es
+stam pede
+ser um
+Ù Ĩ
+cataly st
+x n
+ab sc
+free zer
+ch un
+ari os
+mc cre
+fore head
+he ars
+damas cus
+tac oma
+ardu ino
+encoun ters
+stan ton
+lg b
+ab as
+" ..
+ke te
+drac ula
+ele m
+g ne
+zepp elin
+la brador
+pul p
+op tional
+or n
+russi ans
+san itation
+hil ary
+etsym ntt
+pen alties
+au st
+ig ans
+olympi an
+medic aid
+vers ace
+va pe
+re stra
+pe ep
+sexi est
+st alls
+di le
+the a
+punjab i
+pupp y
+tuesday motivation
+ðŁĵ ļ
+the flash
+roc ket
+mo dest
+chihu ahu
+on na
+k sa
+hur dles
+ca ve
+fail ures
+sp lit
+bo ho
+gur l
+disappo int
+ho ward
+nug get
+fran z
+stal ert
+kaz akh
+for getting
+sch ri
+ag ate
+am at
+eve rett
+du et
+veter inary
+juli an
+ch ills
+bra ve
+ghost busters
+lan do
+gre ets
+profit able
+d é
+ti r
+ze e
+om en
+pd x
+gray son
+har i
+fix es
+stab bing
+swim mer
+symb ols
+compli ments
+po se
+func tioning
+th nx
+gi r
+corpor ations
+bar low
+lo e
+off season
+distin ctive
+marvel ous
+nik on
+enri que
+ky u
+ja ws
+amo to
+lom bar
+travel blogger
+fa h
+ouri sm
+tri stan
+so e
+ce ase
+ðŁı ħ
+z ac
+mck enzie
+taxpay ers
+swim suit
+bl o
+les ley
+kan sas
+w ks
+ki el
+provo king
+my les
+str ing
+kangar oo
+galac tic
+fif th
+s ke
+we ir
+ll is
+mat ory
+ðŁĩ ¿
+un ci
+re productive
+roo ting
+ti des
+gad get
+.... ......
+alex ander
+bow ler
+scre w
+apo log
+eri ka
+wal ters
+shet ty
+lan e
+ban ter
+as ant
+me so
+v ain
+" ""
+us i
+fer din
+accomp lish
+man sfield
+bom bar
+collabor ating
+cla p
+it ure
+s da
+smo ky
+na k
+im person
+car la
+com ra
+bur gl
+lo co
+ti es
+in hi
+trac ey
+se is
+diss er
+rr rr
+dra y
+prote ct
+cor ona
+hun ger
+ck en
+c eli
+trou bled
+predat ors
+fic tional
+shav ed
+riche st
+metab oli
+ful ham
+gro oming
+mono chrome
+wa sting
+as co
+ast e
+ti sta
+remedi es
+ung soo
+south end
+perman ently
+bu mble
+procra stin
+ident ical
+practic ally
+ma scul
+su ke
+assu red
+val erie
+devi ant
+grizz lies
+thi er
+pur a
+ne pal
+not ts
+bil ateral
+spo il
+car mel
+cine matic
+ph l
+ni fty
+ma o
+hypo cri
+la ser
+pan try
+mathemat ical
+el isa
+coordin ation
+bel mont
+a it
+radi ant
+bo iler
+man g
+f ag
+cr c
+h ams
+br in
+â¬ĩ ï¸ı
+famil ia
+âĿ £
+sab er
+ru pert
+gg an
+rit z
+mic h
+sal ford
+le vi
+gra l
+ðŁĴ ¤
+n ino
+ce d
+business man
+ul tr
+sim ply
+compre ssion
+pa ins
+hal t
+ë°©íĥ Ħ
+landsc aping
+n f
+croo ked
+er d
+itt in
+ddle ston
+sur passed
+ino a
+da g
+bl en
+exten ding
+at ing
+al gae
+ball er
+u mar
+snoo ker
+col lu
+flo wn
+thu b
+ridic ulously
+ki sh
+op le
+di re
+as ser
+ari sto
+sc iss
+h ating
+trou ble
+syl via
+suc cul
+plo ts
+sincere ly
+al er
+laure ate
+br ack
+att n
+rif les
+me to
+collec tible
+cu omo
+conte stant
+consist ency
+ant z
+rang es
+abig ail
+de b
+mini ster
+grow ers
+an oo
+hoo ver
+dream er
+nu cle
+resear ch
+mi y
+sha hid
+ma v
+d honi
+cin i
+do j
+hin dus
+part ying
+dal i
+alon so
+inform al
+clark son
+it ton
+ki an
+cit yo
+mor i
+la sted
+as pen
+libr ary
+susp ici
+qu at
+den ial
+fol der
+ch ori
+swee ping
+eni x
+ðŁį Ĥ
+Ø Ń
+nas car
+handmade hour
+mou l
+heat wave
+em er
+exam ine
+ib n
+gr ind
+po v
+tion ist
+m bo
+she ila
+integr ate
+om es
+take away
+cer v
+con nie
+tic ket
+ce led
+bi en
+visu ally
+madagas car
+sor ry
+gu i
+park run
+tra its
+la be
+pois oning
+ॠĢ
+vi able
+bohemi an
+denti stry
+bad os
+spr outs
+mask ed
+te ddy
+ðŁĺ ·
+sa f
+sa as
+ji ang
+ti ght
+spe aker
+withdra wal
+bc n
+as signed
+class rooms
+fle ming
+ðŁĴ «
+super girl
+tot als
+table top
+e books
+horizon tal
+cra z
+flu sh
+j ard
+c dc
+er son
+ãħ ł
+green wood
+ni h
+co x
+ad a
+lit re
+go ing
+v icky
+cur ved
+lou ie
+gra ins
+hy e
+lon ge
+reme dy
+tra inee
+san jay
+super stars
+ma ser
+man u
+s age
+wh l
+ðŁĺĤ ðŁĺŃ
+ðŁijį ðŁı»
+m sd
+en z
+rab hu
+j oo
+gh u
+ac er
+e po
+resurrec tion
+justice for
+bl ended
+mo da
+avalan che
+france sco
+re spective
+g s
+ye ast
+wel ch
+devo tion
+ge tin
+athe ism
+am ic
+carol yn
+lo c
+ld nont
+ave c
+us da
+le gged
+bra very
+b lower
+cow boy
+he h
+sti ble
+buff al
+chann el
+run chat
+âĺķ ï¸ı
+ide ology
+best seller
+y oo
+pe anu
+bon ne
+fel ic
+edi son
+fr actu
+naren dra
+pp ets
+seym our
+ri viera
+he ctor
+necess arily
+bi anca
+soci eties
+the best
+w g
+sent ences
+win k
+vacc ines
+pal ooza
+jam ming
+as f
+mp us
+agre ements
+ec k
+ba c
+hon ore
+com pul
+wild cat
+im posed
+yo ga
+hud son
+can celed
+l ich
+fu zzy
+es que
+ch uk
+w vu
+se k
+fli pping
+r hon
+wi shed
+wh a
+cap ability
+len ovo
+ìĨĮëħ Ħëĭ
+vi vo
+tv d
+nor a
+sil k
+pas adena
+yo semite
+valu ation
+clo cks
+u ber
+mr c
+dar kest
+au bre
+ss o
+bell y
+wrest lers
+kill in
+lou der
+buck ley
+ge el
+ad on
+un s
+appe aling
+ðŁij ¯
+semit ism
+list ens
+fit z
+ãĥ³ ãĥ
+ny lon
+ar ty
+seem ingly
+hal a
+su ited
+et y
+she ds
+mu ffins
+ap ric
+um ents
+u ta
+jam mu
+chelse afc
+star z
+yo ko
+roo t
+clean sing
+di ar
+pione ering
+ihear tradio
+dig iti
+fin dyour
+can o
+ðŁĴ İ
+z ol
+spac ecraft
+six ers
+moi sturi
+b ile
+ti sts
+hor ton
+rang ing
+colum bi
+mete oro
+senti ment
+ep l
+foo th
+text book
+drain age
+r ly
+sc ue
+imran khan
+ðŁĴ ¸
+margar ita
+ed dy
+predic ts
+gamer gate
+advis e
+growth hacking
+love you
+ug and
+v f
+beng hazi
+s later
+ne wor
+ch el
+independence day
+p np
+cul len
+hoo dies
+num bered
+brit t
+t sa
+kl tu
+s ages
+mom o
+onep lus
+col l
+gu ts
+w ta
+mesm eri
+enh ancing
+chiro prac
+j is
+teen agers
+m one
+constell ation
+sweep stakes
+e ze
+slovak ia
+la ye
+pear ce
+wa ver
+po gba
+k ron
+sur geons
+mar x
+ti d
+gg a
+desc end
+p ours
+upri sing
+wal la
+sab bath
+bachel ore
+mack in
+k am
+peter borough
+hor a
+ðŁĮŁ ðŁĮŁ
+think big
+r j
+hy drau
+sp al
+univers it
+ðŁı ī
+mail online
+league of
+ten ants
+w ally
+lan ce
+heav ens
+dd r
+bol ts
+am ir
+i phone
+ci gar
+en du
+re i
+el abor
+r inging
+john son
+characteri stics
+sal oon
+algori thms
+tal kin
+m tn
+di ve
+region als
+ff ice
+hat i
+deviant art
+so tto
+shir o
+l ama
+k we
+f aded
+por ting
+tu mmy
+est ates
+buen os
+ðŁ¦ ģ
+beli ever
+pen etr
+dar n
+sp ite
+can opy
+fashi oni
+t illa
+pet als
+eli jah
+bra wl
+marty r
+ë°©íĥĦ ìĨĮëħĦëĭ
+mid town
+eric h
+d apper
+sm town
+me gam
+ww w
+le le
+on s
+cat fish
+fir th
+fossil friday
+ball park
+th aw
+pot ent
+illi e
+cre ep
+car p
+so ap
+gun dam
+infe c
+yy yyy
+ठ¨
+z ag
+rit t
+calcu lator
+bo ca
+ok o
+to ad
+threat en
+refin ed
+olym pic
+accompli shment
+bacter ial
+a ji
+tat um
+feli z
+she ed
+j at
+th ic
+jam al
+ðĿ ĺ
+lin a
+ðŁIJ ¯
+jo king
+yot po
+pin ch
+ak ron
+her b
+motiv ation
+li a
+ho stage
+cre ek
+gam ble
+russ ell
+patt i
+fo tos
+c pc
+bro ken
+back the
+cla ys
+u mm
+stock ton
+mat ernal
+ü r
+la kel
+cent ury
+be k
+infe cted
+ภ¡
+smack down
+man ned
+ta hoe
+sm es
+bas a
+su la
+augu sta
+. *
+rohing ya
+gre ed
+counsel or
+silhou ette
+gra vit
+cla use
+' -
+bo bc
+occa sions
+now adays
+dic tat
+be ard
+n ally
+brigh test
+kab ul
+inc india
+dhan ush
+archae ological
+che ape
+mizz ou
+d hi
+ov ski
+bax ter
+asse mble
+Ã ¢
+gi gi
+ac am
+wis ely
+haz ard
+north ampton
+âľĪ ï¸ı
+me th
+bla sting
+re unite
+mu lus
+ali zes
+t read
+mil a
+ed ward
+ko va
+pe sto
+ðŁij ¶
+vit z
+hydrau lic
+refurbi shed
+mo tel
+isab ella
+hom me
+sever ance
+uph ol
+mis erable
+f ari
+lat ter
+ef er
+crack ers
+es l
+ac io
+yy j
+in an
+ec b
+z ind
+pan as
+tru cking
+re ed
+sh aker
+burge ss
+em pire
+ag nes
+n ington
+art works
+fr s
+ti le
+bi ome
+eu n
+ch ong
+americ ana
+god father
+go blin
+i shi
+! ).
+temp ted
+gen omics
+mand ate
+ck y
+ðŁĴĻ ðŁĴĽ
+som ali
+br andy
+in ven
+spoke sperson
+pc b
+yu an
+h g
+fa z
+starwar s
+ro wan
+blue grass
+don g
+d day
+trin idad
+er ton
+ban ning
+re tention
+cu red
+tober fest
+re set
+we is
+deta ched
+behindthe scenes
+immun ity
+ph a
+bra y
+ðŁij ½
+ran cho
+ram say
+est onia
+nd tv
+] .
+cab aret
+tar o
+d v
+show cases
+plu m
+ðŁij ¸
+son oma
+pre pa
+memor ab
+e stu
+drive way
+u les
+magn us
+x r
+nn n
+much as
+en ge
+stre amed
+fore stry
+audio book
+tro y
+reck less
+kil om
+ru ler
+ra k
+proce ssion
+i ons
+po ole
+noc tur
+wh s
+farm house
+per a
+par me
+hypocri sy
+s ics
+v ant
+cas k
+holi stic
+au st
+Ð ¿
+in do
+ðŁij© âĢį
+di so
+disp atch
+ol sen
+make it
+en nis
+cent re
+ar range
+ðŁĮ ¼
+sal ted
+ea siest
+f ate
+reg atta
+mo zz
+ac an
+sin i
+g ically
+ch ops
+chick en
+work in
+ha gg
+invol ve
+wee ds
+book day
+wake up
+ky r
+michel in
+fu ss
+re juven
+vac ancies
+incar cer
+m st
+sc ents
+sovere ign
+kick er
+à §
+bo d
+âĢĶ >
+sa h
+mob il
+shrop shire
+oph one
+dress er
+mis suni
+hep burn
+i mo
+foli age
+diagno stic
+as san
+cycl ing
+guil t
+c sa
+puertor ico
+win elover
+wake field
+do ggy
+k he
+pa pp
+co g
+al lot
+cu ck
+poe tic
+mi o
+re vit
+mag ician
+ç ¥
+ant enna
+west wood
+mber g
+lux e
+oat meal
+Ø ¬
+te at
+ffe e
+sear ches
+l ly
+plu to
+el on
+let tering
+inno cence
+fa i
+ann on
+telang ana
+ma it
+neu ral
+can ni
+ar oma
+a stor
+fe x
+co cac
+mon etary
+f ent
+un sure
+' @
+indi rec
+teh ran
+isol ation
+li bs
+make up
+merce des
+ff y
+he tero
+de o
+sco m
+cur sed
+veteran sday
+franken stein
+shre ws
+de co
+ge ese
+lefto ver
+ha did
+vari able
+acade mics
+carol in
+under going
+vari ation
+na h
+ssi er
+gamer sunite
+pur suing
+emer ged
+ll ers
+control ling
+ro aring
+mete or
+vol t
+daw gs
+be aver
+is life
+bathro oms
+aci onal
+pre vent
+lake district
+in als
+y ani
+gra bbing
+sac ks
+le z
+sw ay
+k ool
+time s
+klo pp
+la de
+con cord
+resul ted
+revi ve
+recon ciliation
+ol and
+az z
+gir o
+mand arin
+de en
+nutriti onal
+is coming
+van i
+aw www
+der ived
+love your
+stop the
+shou ting
+nov ak
+ðŁĻĮ ðŁı¾
+lo af
+displa ying
+sunday with
+ma guire
+ch eri
+ðŁı Ł
+re match
+qu ic
+Ú ©
+y in
+ðŁĺ ¹
+ili ve
+z ip
+our ke
+down loads
+sw at
+missi ss
+care rs
+t ment
+proper ty
+hahahaha haha
+gi bbs
+sur rey
+ar ise
+tic ism
+sti a
+ir ling
+fro g
+co se
+bas sist
+fore ig
+lea u
+pil lows
+hol la
+eli e
+disclo sure
+peanu ts
+inte ch
+ww c
+plun ge
+trium ph
+cor i
+sli ppers
+ðŁĻı ðŁĻı
+neutr ality
+ma re
+hair y
+gang ster
+hu mming
+cust ard
+mer lin
+ale a
+s by
+dam p
+mo han
+ver bal
+j st
+gu tted
+b jor
+un finished
+ðŁĩ¯ðŁĩ µ
+un happy
+âļ« ï¸ı
+by pass
+at su
+fis cher
+sa v
+afric ans
+re use
+mid way
+demo lished
+ger rard
+her cules
+Ä Ł
+medic ines
+cl icking
+sur round
+jo ong
+wav ing
+tri bes
+wet lands
+offici el
+argu ing
+l le
+do va
+su zy
+club house
+ne gro
+ob tain
+ga o
+gl ance
+assi st
+ch os
+ãĤ ¢
+âĺ ķ
+adri d
+occur s
+st ans
+par don
+livel i
+emplo yed
+re visit
+ff xiv
+bb le
+ne aring
+min er
+ðŁĺ ¹
+giov anni
+up to
+mar vell
+mar se
+to wels
+cb n
+engine ered
+y elling
+spart an
+si ans
+ðŁĻĮ ðŁı¼
+se v
+coyo te
+sta di
+t cm
+app en
+shenan igans
+open access
+so aked
+ma squ
+le vine
+stro kes
+l k
+aparthe id
+hipho p
+char don
+may may
+ha asan
+stri pped
+fr o
+scri ption
+f ton
+h f
+pri sons
+marsh al
+ķ ãĤ
+an cho
+com promise
+classi fication
+buzz feed
+bblo ggers
+deser ving
+) /
+s way
+ob o
+camp ers
+poder nfamily
+p oured
+bri e
+squir rels
+se ize
+: #
+le k
+ti mb
+st acy
+nas daq
+repe atedly
+br at
+mi ghty
+competit or
+mah one
+de si
+o ke
+bm w
+shi e
+f cb
+cheape st
+minim alist
+par amount
+n ate
+har as
+insan ity
+lat eral
+ment ality
+mo zam
+ta pped
+yad av
+u sp
+b way
+the od
+bil t
+ra ids
+em press
+adap ted
+pat ron
+nut shell
+ag ra
+be aded
+sundaywith marsha
+vi king
+proce ed
+main tained
+thinkbig sundaywithmarsha
+sn es
+mus ica
+to wer
+ch ab
+bo k
+sm t
+insul t
+harve sting
+windo w
+ru ther
+be ige
+dec al
+indic ate
+ma iling
+ri ft
+po le
+ander son
+ch oral
+sp ride
+l ili
+ev elyn
+imrankhan pti
+.... "
+ke red
+un dp
+water falls
+se ars
+le mans
+world series
+ri el
+ani e
+app ar
+score rs
+lam p
+a than
+phys icians
+qu inoa
+refu sing
+vu itton
+unle ash
+s la
+pat i
+shou ts
+inten tions
+fo amed
+europe an
+neighbor hoods
+me er
+man son
+du h
+br at
+con es
+bow l
+kazakh stan
+ठ¿
+in appropriate
+del hi
+ketch up
+ful ton
+s ys
+consul t
+gar field
+to go
+f ml
+f led
+b ds
+facilit ate
+ree bok
+selfi e
+elev ate
+activ ate
+bi ble
+ca wx
+b ys
+cam ille
+sy ou
+sk ool
+her t
+w bc
+ple dges
+recor der
+po sh
+ac re
+so aking
+mat il
+v sco
+shoot ings
+pla r
+e con
+ðŁĻĮ ðŁı»
+rashi d
+u bi
+ðŁ¤ ¤
+sw inging
+wi pe
+rap tor
+m su
+music video
+dur ham
+at tic
+apar ty
+fe tus
+activ ation
+aa z
+motiv ate
+ðŁĴķ ðŁĴķðŁĴķ
+j al
+ठ®
+ag on
+sche er
+stal ker
+fo ster
+az zo
+tele gram
+vi gor
+s laugh
+screen shots
+entrepre neu
+kri stin
+inten tion
+ch illi
+fr action
+don a
+ge a
+tc u
+s ite
+la k
+em il
+d nt
+bor o
+wil kinson
+re cu
+ato day
+t anya
+bl anco
+cd n
+brilli antly
+g cc
+ac c
+evacu ated
+ther ine
+den ny
+cait lin
+she pard
+pou ch
+hand held
+sou theastern
+ha a
+Ã ´
+re solutions
+led ger
+sr in
+r ar
+shat tered
+chim ney
+im with
+mete or
+hand led
+ra ke
+town send
+en han
+shi py
+duc t
+tw x
+inflam matory
+war hammer
+theat rical
+gro s
+sk ar
+sco tty
+ni el
+tit o
+tin i
+conne ction
+_ .
+goldeng lobes
+sha q
+ðŁı ³ï¸ı
+hall way
+fron ts
+effec tiveness
+gla ston
+d hs
+ex pi
+to h
+c pl
+sc s
+re o
+ha g
+resemb lance
+hor an
+abu sive
+qu er
+virtu e
+cho lester
+a q
+shan e
+m ce
+carri ers
+di stress
+re wind
+Â ¡
+voo doo
+int act
+ann o
+ðŁĺ ¤
+pi led
+adi a
+ãĥ ³
+en ow
+di gs
+light ly
+goo fy
+turb ine
+governor s
+con te
+re open
+pa h
+i ve
+cra fting
+swee ps
+jo di
+an de
+zu cker
+kaw aii
+o ko
+v ai
+out line
+kri sti
+ts n
+insp o
+qu int
+fil thy
+lyn ne
+listen ers
+depar ting
+or d
+t weed
+, &
+ale k
+sel fish
+nor ther
+recogni zes
+i ps
+be s
+a ed
+w ills
+pe at
+surround ings
+mon uments
+ais le
+be cker
+la v
+quant ity
+v ah
+helicop ters
+tu cked
+alv arez
+sha pe
+o bey
+ad diti
+road side
+m ite
+bl ers
+ep age
+j au
+ignor ant
+b ins
+lu lu
+x o
+c fo
+ee eee
+apprentice ship
+shef fiel
+to i
+ho k
+faken ews
+deplo y
+aid an
+husk ers
+ãĢ İ
+west brook
+mi ster
+confi gur
+car r
+fic a
+proceed ings
+ha w
+ste ak
+mur derer
+pay day
+a jo
+p vc
+don ates
+bi af
+nom nom
+be it
+k ali
+x rp
+ahmed abad
+se mic
+che y
+x tra
+an twer
+head lining
+squ ares
+roun ded
+flu ore
+bol d
+disa sters
+am oo
+gener ic
+cran es
+brief ly
+gi g
+auster ity
+anticip ation
+for ti
+treas urer
+cann y
+ce cil
+dete cted
+check list
+ภ§
+pam ela
+bar bados
+an field
+hear ty
+tx lege
+peren ni
+arro g
+ing ram
+âĹ ı
+ty ne
+spo on
+r ation
+am ba
+m be
+cam el
+h hs
+york shire
+reflec tive
+fre aks
+to k
+ju do
+partic les
+du bs
+ban jo
+accred itation
+prover bs
+over dose
+inte gral
+gu ang
+mc s
+super car
+af b
+al vin
+ail s
+x tre
+st aging
+tw ent
+rabb its
+mar o
+inste m
+dol l
+cr ay
+sant ana
+ble ach
+mini ons
+che ap
+man t
+di vers
+catal onia
+lo is
+mat ri
+cou gar
+kay ak
+e gre
+p so
+a ia
+å ®
+char lton
+tr acked
+sc ari
+pe tt
+f wd
+x in
+gra vel
+br ic
+bigg boss
+ar den
+hu gging
+pal ms
+st v
+li mb
+the movie
+handic ap
+ri me
+z ai
+stu b
+indi a
+lithu ania
+rhy th
+p ita
+maced onia
+high ered
+brid get
+schwar z
+ske let
+hi kes
+ant arctic
+c ps
+mash up
+Ð °
+n ell
+chand ra
+he ir
+an us
+sher idan
+mi mi
+muse u
+bec ca
+an ir
+bar rie
+dioce se
+compar able
+ðŁı³ï¸ı âĢį
+yuk on
+me p
+hor mon
+mer ic
+al f
+con quered
+christ church
+ðŁĴĻ ðŁĴĻ
+hazard ous
+poo h
+cont ing
+retro spective
+par ame
+na ir
+con sor
+ho tra
+astoni shing
+cater pillar
+u man
+ti sm
+t vs
+serv ic
+croy don
+mor ales
+c g
+cu m
+te ur
+scan ada
+s all
+magno lia
+el ise
+th our
+à® ¿
+ag omez
+phel ps
+ë°©íĥĦìĨĮëħĦëĭ ¨
+wh os
+weav ing
+si sd
+pro poses
+cro ws
+pre sale
+econom ies
+bernar do
+sha hid
+air show
+mc cann
+hor ticul
+nr l
+du el
+mongo lia
+tou lou
+requi rement
+struc tured
+ed i
+o lives
+he a
+cu ter
+Ð º
+enthusi ast
+harri et
+domin ion
+sub mer
+ðŁį ĥ
+sa ab
+nes burg
+mo ff
+def ended
+bur t
+rewar ded
+gold man
+op tics
+khali d
+house holds
+buc kets
+ce cil
+che ss
+substan tial
+ef l
+oper ation
+evalu ate
+st n
+rece ssion
+l ll
+tom as
+tru ths
+ak bar
+s words
+p act
+embarra ss
+ha o
+ay urve
+scrip ture
+ny cc
+op t
+di ameter
+sc ented
+organi zers
+re lat
+ha e
+dream ers
+de se
+ðŁĮ »
+restric ted
+n ale
+r hp
+dol an
+mun ster
+ha ired
+consult ants
+jo ints
+hu mil
+d ill
+relent less
+t é
+af il
+ut ilities
+japan ese
+condem n
+pet ite
+colli de
+q f
+peach es
+cou rier
+l ore
+âĺİ ï¸ı
+reli ability
+ch uk
+ðŁĻ ĥ
+stu res
+ge ther
+ho stel
+bi er
+- _-
+â ĩ
+e ze
+ta ilo
+di ent
+blu ff
+chu ffed
+pil ip
+mon arch
+e em
+bu chan
+b ick
+op au
+ku ps
+ภ¢
+pist ons
+sp ins
+m and
+ce st
+bur ne
+v ile
+cher ries
+bec kett
+need les
+pan ch
+ë Ĥ
+haha h
+trou bles
+insi sts
+do you
+g mc
+mor tar
+deleg ate
+in n
+g anda
+sin atra
+ठ¤
+spee ding
+pu pil
+pre mises
+ali gnment
+pi kach
+as us
+j alan
+Ø µ
+lime stone
+fol kl
+parme san
+ce il
+mo y
+shawn mendes
+ac up
+hu st
+ot es
+med ina
+ma di
+gta v
+censor ship
+ar g
+swe eney
+sy kes
+col o
+foot steps
+cann ed
+adv ance
+gta online
+healthy living
+ðŁį ¾
+a ig
+p ality
+oc s
+he brew
+im minent
+berk shire
+jeremi ah
+out going
+bak er
+entr ata
+ma ids
+gro ves
+bo c
+a del
+m fw
+con science
+arm ys
+nut ella
+conte stalert
+novel ist
+la h
+ban ker
+marque z
+ðŁı ¡
+to ff
+out age
+gr p
+ðŁĺŃðŁĺŃ ðŁĺŃðŁĺŃ
+musc le
+du dley
+nvi dia
+mi di
+m uni
+ess ays
+dat ac
+car ter
+ภ£
+t ans
+i ves
+public ations
+al er
+ok wx
+il u
+cu tt
+har p
+out law
+luther an
+br ill
+bo lic
+do well
+green land
+be sties
+path i
+pay ton
+gue st
+har den
+ðŁ¤ ©
+ann ed
+evacu ation
+po ised
+mc der
+b han
+o i
+envel ope
+ci d
+ca vi
+ta pas
+book review
+grey hound
+âĻ ª
+fe ud
+lun gs
+for te
+rai der
+ff er
+oni x
+dep end
+yn wa
+rel ating
+de vs
+ðŁĴ IJ
+acqui res
+d ha
+j yo
+priv ati
+can ine
+k b
+cra b
+sar din
+imag ining
+k j
+em por
+down hill
+ne z
+ta eyeon
+nick imin
+gb p
+à µ
+w ap
+sec co
+ma shed
+ðŁĴ¥ ðŁĴ¥
+augu stine
+diss ol
+dic tator
+â ĵ
+vi per
+ed fringe
+vau x
+hard work
+book let
+no x
+chi ff
+ðŁĴ ¨
+observ ations
+xbox one
+u sher
+ke er
+lu p
+dal las
+cal gary
+ma dra
+di ous
+k bs
+wood ward
+hero ine
+lu mber
+sea world
+o ws
+mc ke
+maver ick
+gu la
+cross roads
+fan g
+s ade
+nik ol
+chee tah
+me c
+pp g
+er ick
+ðŁİ µ
+tox ic
+bj j
+viol a
+sp ire
+ch ino
+tra vis
+institu tional
+ha as
+low ry
+w ac
+ea e
+hu mid
+mp ton
+ru ck
+je w
+c ine
+zim mer
+se f
+bhar at
+fre es
+aam ir
+ðŁĴ ħ
+z inc
+wan e
+multi player
+royal wedding
+e el
+preci pit
+qu ery
+kimber ly
+isa bel
+ful fill
+ig an
+vau l
+pan e
+sc y
+dig it
+gun n
+u tah
+dog day
+fi on
+xia omi
+da c
+el ast
+cha vez
+ro blo
+g ine
+ten th
+ab h
+ke to
+hur dle
+na dia
+memorab ilia
+ha bs
+qu an
+h w
+hv ac
+pix ar
+ec cle
+kram er
+accu ses
+ðŁĴļ ðŁĴļ
+per se
+mean time
+wa hl
+atle tico
+âĢ¢âĢ¢ âĢ¢âĢ¢
+ott oman
+no vo
+k us
+conne cted
+tru sts
+d mv
+spen cer
+rahu lg
+do ve
+sto kes
+bolog na
+enthusi asts
+Ã ª
+rockstar games
+ted cruz
+du ras
+s acked
+late x
+immer sive
+cer t
+lu cin
+princi pals
+fa res
+sa ils
+far n
+am ent
+saf fron
+quent in
+check point
+fer ris
+ex cur
+ðŁijī ðŁı¼
+bai ley
+se h
+ter re
+mad am
+s band
+wan derers
+cumber batch
+yy c
+digit ally
+blackandwhite photography
+roll in
+moroc can
+ðŁĮ ħ
+din ner
+d well
+to om
+m ye
+ez ra
+cp fc
+war hol
+me er
+jon ah
+no aa
+s gate
+so on
+secu lar
+g ating
+ti o
+dri ver
+si ssy
+assan ge
+ta th
+ed mund
+bobc ats
+ra ji
+po stage
+stu ds
+m gm
+kat o
+edin burgh
+meet the
+shir t
+fa a
+mens fashion
+sp reads
+wi m
+car ts
+phoe be
+j ars
+bot swana
+Ù Ĥ
+ed war
+sk ar
+ri ve
+gu sty
+c tv
+ferdin and
+su therland
+nickimin aj
+k v
+si us
+bee ch
+re z
+desi res
+on ial
+camp o
+quar ry
+lor raine
+gil more
+ig gy
+µ ï¸ı
+ho pping
+avi z
+ðŁĮ º
+uni sex
+dedic ate
+att itudes
+ste er
+jun kie
+rail way
+y b
+whi sper
+key an
+k us
+ju g
+di x
+a ins
+sum mon
+ov ich
+sy ed
+her ald
+ma ison
+me ded
+wild flower
+main land
+ri sky
+ru kh
+over looked
+ki c
+destro ys
+nam an
+ki p
+z ano
+champion sleague
+ban dit
+quin cy
+smi le
+cal vin
+open ings
+ta pp
+ol ulu
+spec tro
+accred ited
+ap k
+pra ised
+bar nett
+pol len
+premi ered
+selen agomez
+tou red
+screen ings
+uu u
+mis o
+en se
+adam lambert
+guel ph
+har yana
+hu tto
+le ar
+l tc
+po ached
+brex it
+æ Ŀ
+tt c
+pa vement
+mon gers
+ro e
+ad ers
+ling ton
+particip ant
+ca red
+ga il
+y ates
+lan tic
+dash board
+jo o
+feli pe
+ssi onist
+bu m
+s end
+a eri
+thu gs
+luci fer
+a he
+dete ctor
+fil ly
+gas oline
+ham per
+hump day
+the ta
+the band
+fore casts
+o hhh
+lo bb
+hol l
+cp u
+az u
+ad ar
+hai ley
+bu b
+car t
+quo ted
+an archy
+pan cre
+twit art
+al den
+st ash
+the less
+or ni
+belie bers
+mor mon
+partic le
+avi ation
+⬠Ĩ
+webcam toy
+sad dened
+cru is
+ham let
+n ct
+roll ins
+marque e
+saw yer
+reli ance
+a ura
+di ec
+soo thing
+sig nings
+ak is
+Ã ³
+at kins
+aer op
+ðŁĮ ¿
+y ab
+sh ari
+con nol
+du bbed
+manufac ture
+convin cing
+feelthe bern
+ra u
+pu lit
+on ec
+gem stone
+ur ging
+bag u
+ga h
+aci ds
+fi anc
+zodi ac
+sn oop
+her rera
+initi ated
+ven ge
+profess ors
+pro di
+stron ger
+e mission
+bb a
+hal le
+ta pp
+haw an
+wh im
+compe ted
+myr tle
+ir port
+cold play
+ach e
+ske p
+m son
+ss ic
+calli graphy
+swim mers
+me y
+pp c
+thri ft
+po c
+re places
+commu ter
+âģ¦ âģ¦@
+go ers
+lo gue
+para dig
+bas kets
+sensiti vity
+joh an
+atl antis
+& &
+suit case
+anxi ous
+l h
+str i
+gal loway
+stre ad
+war den
+gr ounded
+ffici ency
+li feat
+reli c
+disgu ise
+island ers
+f cofficial
+classical music
+b mc
+en field
+bi que
+oak ley
+bat man
+sla ying
+ner ves
+mul tit
+calci um
+projec tor
+scott sdale
+ant ino
+gri ps
+kim mel
+des mond
+prote stors
+hi atus
+metaboli sm
+conclu ded
+press er
+ti pping
+sli de
+e to
+hun ting
+aus open
+ri k
+pp ery
+innov ators
+pitch ers
+ag ger
+fun gi
+z ad
+proli fic
+rockn roll
+bl ames
+ct ar
+stam ford
+q ad
+mozz arella
+insan ely
+den ver
+ph ouse
+nom ad
+ï ¿
+s ris
+pro du
+hen ley
+pag an
+am trak
+ru bi
+in cl
+tu tor
+sco tia
+wo es
+sing apo
+fun nel
+turn bull
+know ledge
+gri mm
+real madrid
+we are
+missi les
+con sol
+emo jis
+sne ak
+smi ths
+ru iz
+br ou
+i el
+ha ver
+ðŁĮ ļ
+kin gof
+basil ica
+circul ation
+prin ters
+ta pping
+ri dley
+dra gged
+ha j
+writ er
+fundament als
+personal ities
+me tre
+stereo types
+bur le
+best of
+n ffc
+ha th
+mini stries
+a ali
+trac ing
+pav ed
+ł ï¸ı
+g ic
+insp ire
+tu g
+ha re
+repe ated
+ex pon
+lol li
+rho de
+pre cin
+install ations
+instag ram
+az ar
+i es
+sole ly
+du kes
+mission ary
+van guard
+fursuit friday
+on d
+pol ari
+ma st
+har an
+jos é
+jack ed
+ec oun
+al ities
+ne ph
+ra vel
+moder ated
+sco w
+s fb
+uru guay
+as o
+ni g
+au du
+p ints
+lat ina
+ben z
+m itting
+char ted
+mat ology
+cit ro
+biop ic
+ðŁij Ń
+djo kovic
+fox y
+agu il
+so to
+an ada
+sin king
+sc rap
+hair s
+bethan y
+fact friday
+ðŁIJ IJ
+unlea shed
+) (
+contra dic
+ram on
+coast line
+y ong
+sn sd
+li gan
+p ome
+mit age
+ge tt
+wat i
+ri sk
+so aring
+bru sh
+f pl
+av an
+å Ĩ
+lar son
+sh ear
+mul til
+blu r
+multi media
+chun ky
+par i
+n ani
+weir d
+cholester ol
+char les
+dream ed
+tan ning
+puzz les
+fr am
+hand ball
+ch ag
+beli ze
+al u
+bang s
+Ñ Ħ
+detec tives
+mc g
+ish q
+bo thered
+saf c
+mp ing
+ten eri
+g ays
+sail or
+an gi
+mul ticul
+gue ssed
+ros é
+high ways
+bro om
+chatt anoo
+- '
+see ker
+on ed
+at f
+lu c
+> <
+bar i
+per cep
+jewel ry
+as ph
+sor row
+sl ing
+mam moth
+jac kie
+ë §
+wilt shire
+sa o
+can cell
+im paired
+tor ial
+bre ed
+guy en
+jud ice
+tit le
+pro spective
+applic ants
+ðŁį Ĭ
+epis cop
+e id
+b yo
+stock ings
+ðŁĴĥ ðŁĴĥ
+ll p
+sna g
+keep it
+l ough
+ol son
+matur ity
+!! !"
+cop ter
+i sha
+bl i
+wil mington
+tr youts
+th ai
+ðŁ¥ ³
+pe bble
+kra ft
+f p
+Â º
+ssi vely
+li vin
+contest ants
+tex tures
+jo an
+h dr
+film festival
+prov ence
+wi do
+op end
+c si
+sto wn
+cro ati
+ad just
+host ile
+analy sts
+il an
+cu ppa
+bru m
+newfound land
+good win
+me tt
+mall orca
+plu gs
+bu k
+bb hutto
+wrest le
+sa ire
+sho pped
+for za
+le head
+vi vo
+ba st
+ro xy
+reg is
+hard working
+hon olulu
+desp air
+young sters
+ni g
+impro mp
+roll tide
+de emed
+tre ason
+ru shed
+for ged
+ff f
+pikach u
+bri ggs
+do it
+ac cent
+la us
+gla ze
+compet ent
+a ho
+photo g
+mid field
+le go
+har vard
+min orities
+re illy
+slic ed
+once upon
+initi ally
+financi ally
+landscape photography
+har dro
+qu o
+mm ers
+par kinson
+smu gg
+read iness
+bru tally
+glou cester
+mp ed
+bbhutto zardari
+mur der
+ye d
+dat aviz
+sr t
+dow ning
+bi ans
+m ü
+fle ck
+fli pped
+s ly
+brilli ance
+ri m
+k um
+bubb a
+ko i
+knit ted
+sor g
+ma is
+ðŁĮ ²
+ti ss
+su stain
+sen su
+ak han
+zi est
+exam ines
+chardon nay
+user name
+short list
+re bs
+on o
+dar ing
+hard wood
+che que
+righte ous
+light ening
+dir k
+shra dd
+du ra
+down stairs
+sh al
+ami gos
+ru ff
+s law
+ri es
+red nation
+man us
+ðŁĩ§ ðŁĩ·
+distin ction
+u bun
+dur an
+mi gra
+thi ans
+la ver
+domest ic
+k x
+jaz zy
+justi fy
+belong ing
+insul ation
+color stv
+drun ken
+chann eling
+qu and
+xi ii
+enligh ten
+kan o
+fati ma
+teen choice
+terri fied
+p ba
+as ley
+met museum
+dun e
+pack er
+ki o
+ðŁĴľ ðŁĴľ
+bo iler
+fas cism
+ar mored
+back grounds
+in mates
+embarra ssed
+defin es
+th d
+we go
+silic one
+lo on
+el ding
+bor rowed
+he mp
+ak sh
+kaw asaki
+br y
+de af
+kill er
+dispo sal
+ðŁĩ °
+glaston bury
+un covered
+o xide
+po ff
+d ant
+k j
+ku ro
+dri zzle
+peop les
+fe e
+pro pri
+dd lovato
+pi ggy
+ot is
+aller gies
+u bis
+pengu in
+ser a
+vi z
+prosp erous
+ici des
+tornad oes
+sene gal
+web cast
+sto red
+enchan ted
+bb cone
+bay area
+entrepreneu rial
+rednation rising
+experim enting
+ang an
+lot to
+they re
+por e
+er p
+seren e
+east wood
+bro kers
+bar ge
+stal lion
+timber lake
+tailo red
+dy stop
+b ate
+lat ors
+di xit
+bran son
+dynam o
+ky lie
+shame ful
+bt wn
+spring time
+mix ture
+s ounded
+lu ton
+dad es
+mal a
+op ra
+en ic
+rahulg andhi
+se wer
+~~ ~~
+ky u
+nor theastern
+ca er
+bc u
+nir vana
+kitch ens
+ous y
+al m
+river dale
+hid den
+fl int
+sp d
+pat rons
+katy perry
+au gh
+exhib itions
+sm c
+shu ts
+at ore
+da in
+some thing
+ber th
+bo g
+por ter
+gen to
+con cussion
+ang lic
+ro we
+gr illing
+scar lett
+master ing
+mor nin
+comm ented
+si me
+si zing
+christ y
+ce os
+st m
+at ry
+tari ffs
+vac ation
+pre judice
+p su
+paren tal
+far age
+can a
+cap com
+koso vo
+you re
+men stru
+stal in
+grape fruit
+br an
+che sa
+dav en
+exc el
+!! )
+๠Į
+distribu tor
+ce a
+bride sma
+millenni al
+wa in
+ob serving
+mis ery
+plan etary
+expo sing
+bra ised
+comp ton
+don gha
+q l
+spring steen
+th ul
+syl ve
+cab o
+pal ad
+niel sen
+gaz ing
+ba ja
+r oud
+orchi ds
+johan nesburg
+se man
+d ji
+oper ative
+affe ction
+eclec tic
+at c
+mut ant
+aw x
+nic e
+mel bourne
+indu lg
+tu lip
+dias pora
+wel p
+big gie
+mississ auga
+retri ever
+or an
+tam my
+c ta
+hipp o
+seas oned
+ger mans
+eng v
+marvell ous
+im f
+rela ys
+mon tan
+maur iti
+me ister
+as surance
+reig ning
+su fficient
+han e
+no thing
+pos se
+nav y
+in love
+brigh ton
+en qu
+ch ung
+sweat y
+es c
+cal ed
+man s
+nicar agua
+sl ices
+mo cha
+washington post
+bb n
+dam ned
+grow ing
+en burg
+lo an
+me s
+wh oops
+believ ers
+spi el
+vo daf
+l at
+s led
+cricke ter
+brown e
+golf ers
+bar ra
+wat chers
+lu igi
+sw amy
+mom s
+pit ched
+san tor
+cr s
+si re
+sc amp
+bo de
+ste war
+jon ny
+ent ity
+pac qui
+mind ful
+min india
+bear ded
+temp t
+scorpi on
+eat on
+authori zed
+ar to
+s vp
+op athy
+cch ini
+house music
+disney world
+âĢĶ @
+pro pose
+di y
+expen se
+ten g
+pupp ets
+sm el
+d aca
+per ry
+fin n
+boo sting
+lefto vers
+cou gs
+satell ites
+man y
+az e
+g ong
+fi e
+metho do
+fer ries
+ðŁ¤Ķ ð٤Ķ
+explore rs
+load er
+attrac ted
+il ton
+godd amn
+pi azza
+doc tr
+sav ing
+paragra ph
+visu alization
+may ors
+work flow
+ack les
+ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ
+ठ¸
+twer k
+clu t
+lo ver
+te ases
+si an
+o te
+deter ior
+accor d
+l fw
+swar ovski
+nat al
+tra ps
+k ina
+analy ze
+laye red
+bever ages
+un it
+ran som
+pe shaw
+dest ined
+astro logy
+si pping
+miley cyrus
+cam ino
+marshmal low
+bli ss
+out back
+fa q
+int oler
+humil ity
+po ppin
+hallo ween
+mon tene
+op hy
+nu n
+tattoo ed
+a as
+ðŁĮ ³
+dale y
+qual ity
+du sa
+fisher men
+swi f
+ter rac
+st au
+le in
+trol ling
+ship ment
+garden er
+march madness
+head band
+gr t
+bur nett
+w and
+!!!! !!!!!
+gh e
+du x
+hu d
+war ner
+ðŁĩ ¦
+ex ile
+rescu e
+rat a
+d han
+duc ati
+dro wn
+bl ends
+spi e
+alli gator
+simul taneously
+broo ke
+u ke
+k har
+comm union
+ri ka
+ford fc
+chin atown
+you rown
+me y
+can al
+syste matic
+de pri
+ox ford
+an il
+w ut
+equ ation
+be z
+fle ur
+the good
+lang ley
+ad ity
+ed ith
+al fie
+о ÑĤ
+en cry
+br ill
+ex emp
+ce sar
+mb ling
+ab ri
+sc icom
+j ing
+school ing
+mi ka
+mechan isms
+impromp tu
+rhe a
+moo re
+crime a
+be sto
+wri ght
+el ders
+ro ds
+kam al
+folkl ore
+be et
+mini on
+reli eve
+thr o
+team usa
+pas cal
+made with
+boli via
+itt i
+free bies
+desi red
+best selling
+l iness
+la den
+ke ane
+mi sts
+hipp ie
+atta chment
+@ /
+se w
+flan agan
+âĿĹ ï¸ı
+supre mac
+stl cards
+si as
+q u
+rh ys
+ste ep
+val leys
+v w
+pav ing
+disp at
+al ison
+por te
+id u
+new sc
+soc ket
+mo s
+co star
+re vo
+prote ins
+stanley cup
+m cal
+ear ring
+se cs
+mc lean
+cap ric
+nick elo
+ad en
+v c
+shou se
+adap tive
+maxi mize
+entertain er
+pro se
+gri ffi
+six teen
+lam ar
+mi rage
+saudi arabia
+awe ather
+ru st
+in filtr
+fashion week
+ðŁĺĬðŁĺĬ ðŁĺĬ
+selec tive
+bubb le
+a den
+fen nel
+deci sive
+m ta
+mock ing
+mb les
+st amp
+mu le
+bernar do
+gr in
+po tt
+j ingle
+vet tel
+colom bian
+cam o
+motivation monday
+ba han
+p ly
+dh ary
+k ami
+x men
+sleep er
+gar a
+my sti
+confi dential
+conflic ts
+p neu
+ce s
+insur tech
+clean se
+me rely
+va is
+tu x
+the great
+shar on
+ma j
+hol a
+eco systems
+aj ay
+aa j
+hu sh
+har mon
+backto school
+wiki leaks
+reflec ted
+ðŁĺ ĵ
+commemor ating
+ac et
+buck ingham
+messi ah
+tu ous
+hor net
+to be
+d q
+he ine
+mi g
+pl ate
+nichol son
+sp ie
+cumber land
+nor mal
+pho bia
+happy halloween
+city fc
+mc el
+gilli an
+ke to
+lu de
+de mise
+su ga
+str ate
+mcgr ath
+visit scotland
+foo led
+cb r
+gc se
+col ori
+po td
+missuni verse
+fin ances
+ma poli
+for ks
+Ø ´
+cann on
+medic inal
+ðŁĹ ĵ
+kh o
+wre ck
+pan to
+bag el
+gu ll
+syndic ate
+ic y
+pr c
+ki en
+zi ka
+ti sh
+pe ta
+c co
+li za
+ch ut
+ex traction
+el g
+gl i
+fu eled
+pos it
+respec tively
+leice ster
+br ink
+vulner ability
+im ported
+e sha
+ðŁ¦ ħ
+r ural
+re ll
+gam ing
+atlan tic
+aband on
+no ah
+re solved
+pro state
+aller gic
+ps d
+âĺ ¹
+dun geon
+fang irl
+illumin ated
+m hs
+white sox
+d ently
+ck o
+endor se
+over ly
+dazz ling
+prior iti
+night life
+ut il
+be have
+flam en
+east bound
+ðŁĴ Ł
+ilove you
+gov uk
+mozam bique
+alle gi
+dr i
+testim onial
+ath s
+ì§ Ģ
+mm y
+shab by
+pro secco
+friend ships
+cal am
+dam ages
+off set
+jura ssic
+jun o
+arre ll
+ðŁĴ ©
+interven tions
+dare devil
+car ver
+run away
+ran e
+truste es
+ha ute
+dep ths
+ðŁİ Ń
+me in
+sacrific es
+con cier
+ne sting
+i zzy
+me tam
+ilove my
+ur ine
+du lu
+mal hotra
+ve ins
+night ly
+co at
+an di
+he witt
+lon el
+ci ble
+wr ite
+jen nie
+sant ac
+ĸ ï¸ı
+str ato
+singapo re
+sop rano
+kri sten
+cheer ful
+flee twood
+fa iri
+m eli
+wa st
+tur nt
+sfor sale
+sc rolling
+angel ina
+ren dition
+jeric ho
+nick y
+or b
+fla vo
+patri ot
+ash eville
+sick ness
+re fund
+aggre ssion
+b pl
+ãĥ ĥ
+elu sive
+thi story
+hang er
+bu ffs
+vil las
+at kinson
+sp h
+ja it
+decl ined
+wo k
+supre macy
+oo tball
+ey ang
+ðŁİ ĵ
+s ford
+ath i
+consu me
+road ster
+e so
+u pro
+reci pe
+au f
+uc i
+ar on
+oo oh
+cs go
+re ich
+mc d
+min ute
+ladi es
+pun k
+rut gers
+mee k
+ariz on
+ta j
+land lord
+de gra
+autu mn
+lyn x
+us f
+b hi
+fairy tale
+dongha e
+bet sy
+explo ded
+chen nai
+op a
+pro tag
+br ant
+ðŁĵ °:
+g f
+pal li
+ðŁı¼ âĢįâĻĢï¸ı
+su t
+ill ini
+colum nist
+shir tless
+de centr
+sear ched
+ec or
+bu ggy
+s ack
+ðŁĺĤ ðŁĺŃ
+de t
+ther i
+or naments
+bring back
+to v
+quarter finals
+ic he
+con stra
+gi er
+buchan an
+vi x
+kay aking
+mu stread
+swal low
+mel b
+sc af
+op al
+may oral
+har at
+ðŁ¦ ĭ
+schedu les
+id f
+ha gue
+ro z
+a ah
+d mc
+du plic
+ca che
+orph an
+frac ture
+rec on
+ch av
+bun nies
+al ain
+mustaf a
+ðŁİ Ļ
+vac ations
+dynam ite
+tex ted
+broad caster
+ðŁĴ £
+ste amed
+rock er
+di etary
+luxury travel
+inaugur ated
+sa wards
+vaugh n
+lincoln shire
+click ed
+kra ja
+f anc
+remo ves
+layo ffs
+mc far
+bre eds
+win nie
+jon ghyun
+incen tive
+vari ations
+pat ton
+atur day
+persist ent
+pr un
+pi ers
+dal es
+æ ĸ
+breast feeding
+r ance
+ta wa
+Ĥ âĸ
+mur doch
+cap tive
+thi stle
+nic a
+commod ity
+cou ldnt
+board walk
+graci ous
+practiti oners
+n gc
+scru m
+ner o
+camoufla ge
+col on
+he i
+phys icist
+saturday morning
+ten er
+si won
+colum ns
+bru ne
+y vr
+ba ir
+reti res
+hal am
+cab er
+shaz am
+min u
+cas cade
+milk shake
+gri d
+d ren
+vin cent
+so dium
+plat ter
+cheer leader
+chen ko
+y ak
+elimin ated
+ty po
+y man
+re think
+âĿ Ĺ
+ts ville
+bernardo kath
+ex tr
+ðŁĺģ ðŁĺģðŁĺģ
+ta o
+re per
+mo ths
+em powered
+c iting
+transpor ted
+mon ks
+san at
+cle ars
+bachelore tte
+camp bell
+racha el
+har le
+hand ler
+climb s
+inter ference
+rele ase
+sh and
+r bs
+hr h
+ãģ ª
+val le
+r é
+sli me
+w akes
+chu bby
+slo an
+el ves
+ath en
+attor neys
+micro scope
+ston er
+sc aling
+o be
+c out
+se man
+mid week
+bal sam
+ðŁĺį âĿ¤
+ti ful
+v ish
+lo tta
+ri pping
+re mn
+ti re
+le ap
+ha vent
+la by
+hi mach
+whisp ers
+we in
+ðŁİ ¸
+wild flowers
+se le
+u cc
+li ability
+az ine
+sw ings
+k ya
+ta ir
+re main
+e do
+flo ps
+poc ket
+grand ad
+exam iner
+gr is
+ffe ct
+ðŁijĬ ðŁı»
+stud ded
+heart beat
+de acon
+firm ly
+infec tious
+ste f
+out lines
+le asing
+cla ws
+sen se
+tab s
+hoo t
+mo sul
+spa wn
+co a
+hog warts
+ve in
+alban ia
+manu el
+b ino
+vaux hall
+scot land
+go bucks
+mat ty
+phy sio
+tor ino
+const able
+investig ated
+s lower
+mistak en
+bay er
+wild fires
+vo ic
+x on
+time to
+chas sis
+bar ric
+pi on
+bald head
+woo k
+regi str
+dra fts
+b hs
+li gue
+l ick
+staf fordshire
+baf ta
+dar ry
+je anne
+ven ding
+cor p
+⼠³ï¸ı
+kid dos
+fen way
+ca o
+west bound
+ðŁĺ Ļ
+dv r
+quick er
+bla h
+goo die
+ðŁĴĭ ðŁĴĭ
+vo x
+esp er
+fac ade
+cor relation
+red bull
+rou p
+decl ining
+chi ve
+mc gee
+tur o
+in der
+f eller
+fu g
+il ysm
+mar di
+peshaw ar
+ki eran
+ine ma
+meat balls
+pe ck
+depre ssing
+sen sing
+gi z
+dd ington
+spring watch
+ro aming
+yellow stone
+horse shoe
+am man
+week day
+ol or
+ðŁ¥ °
+boo sts
+spr int
+scar ves
+je e
+bee tro
+cl an
+all the
+ìĦ ¸ë
+enlighten ment
+ado be
+re generation
+? @
+cont ag
+yach ts
+to u
+mor a
+en voy
+r ani
+go li
+dhanush kraja
+wood working
+streng ths
+se di
+disc s
+ar ina
+sc on
+lit e
+ano ther
+ðŁ¥ Ĭ
+ye men
+gu ern
+sav vy
+lo yed
+biom ed
+heart break
+comra des
+milli e
+pat ch
+un f
+jar vis
+bl aming
+commemor ation
+ge y
+å ¥
+cardio vascular
+alig ned
+docu ment
+. ?
+aesthe tics
+em u
+the irs
+le h
+ps ic
+si f
+pl ateau
+ex pend
+domin ating
+rob es
+mauriti us
+excep tionally
+hom er
+discover ies
+bra un
+ten nant
+insul in
+ðŁİ ®
+car bs
+te as
+? !"
+zi e
+franco is
+brow sing
+th ol
+cla rence
+hel per
+ob tained
+cas sie
+le es
+! ,
+pome gran
+hu bs
+presti ge
+] [
+mach er
+bott led
+pun ch
+pi pe
+o ch
+gall ons
+deliver ies
+u ra
+un day
+mon de
+depic ts
+re gency
+outra geous
+khal ed
+car o
+he arti
+za g
+develop mental
+over coming
+stati stical
+flavo red
+for ds
+cre atives
+lau rence
+di as
+sun screen
+in ked
+pre acher
+n ul
+impac ting
+auti stic
+âļ Ķï¸ı
+o ss
+pel icans
+cele ste
+v b
+ru mp
+mc gra
+fair fax
+hu mor
+bbc news
+row ling
+cal der
+seam less
+ag ne
+p ti
+mix ed
+t shirts
+mer ci
+b tob
+women instem
+genealo gy
+pre ven
+l our
+cra dle
+gi use
+Ð ¾
+chron o
+fair ness
+chocol ate
+tor y
+as da
+pre scott
+stret ched
+al man
+u il
+re charge
+in tre
+ob st
+hosp ital
+hay ward
+teneri fe
+fried man
+vap ing
+confe ssions
+ye ah
+bal li
+luck now
+cor pse
+sculp tor
+amp ton
+t pp
+indic ates
+sur plus
+tru man
+ðĿ Ļ
+sin ha
+in vo
+sovere ign
+ke v
+establi shing
+engra ved
+assu ming
+ðŁı ģ
+sou za
+fab i
+ton ed
+oun ge
+del oit
+dow ney
+no ble
+om or
+car tridge
+ðŁı IJ
+u hur
+hol loway
+succe sses
+r sa
+âĦ ¢
+ma zz
+tw d
+disc ourse
+. <
+y at
+satis fy
+com pri
+ठ¹
+graph ite
+disser tation
+ar ter
+í Ķ
+b ally
+zom bi
+ly ons
+a ic
+u bc
+pra da
+e il
+da x
+cla i
+grand daughter
+extravag anza
+chall enge
+ðŁ¤ ŀ
+po ver
+primar ily
+dad dy
+man a
+bi kers
+inqui ries
+da un
+fel ine
+gener ative
+he f
+benef iting
+lind sey
+pol ka
+demonstr ated
+al le
+rand y
+o su
+low key
+weir dest
+red bull
+our y
+n ous
+wood stock
+cre denti
+nic er
+g ado
+aly ss
+ap h
+prepa redness
+station ary
+incorpor ated
+dy er
+sarato ga
+cele sti
+: "
+antibio tics
+or gs
+inde fin
+ap ron
+и Ð
+fif teen
+no f
+ðŁĶ Ŀ
+ph x
+te ga
+m z
+organiz ational
+on air
+band ung
+pleas ures
+mor i
+secre tari
+rac coon
+ca shi
+pil ates
+k on
+geof frey
+la o
+kam p
+depart ments
+back packing
+an am
+Ã «
+crack down
+aun ty
+on do
+li zzie
+ph ers
+cu n
+ðŁĩ ±
+k pop
+pu t
+inten tional
+connol ly
+bar clays
+hs fb
+swin don
+u ku
+s ally
+a int
+âľ ħ
+pen ang
+up lifting
+epile psy
+inter ro
+bun gal
+go ku
+blue berries
+ठ¦
+u ssia
+sil ky
+mou red
+i stic
+bri efs
+me ats
+go b
+ch aser
+state wide
+pra sad
+gl itch
+ar in
+ban ff
+memb er
+ðŁĺŃ âĿ¤ï¸ı
+lo ving
+hall a
+ภ¡
+smo kers
+yak u
+scicom m
+physi o
+sw ol
+lem ons
+gel ato
+ch ool
+capit als
+ki stan
+ti ghts
+spi kes
+trav ellers
+ik lan
+commissi oning
+ar ine
+emabiggest fans
+empha sis
+front line
+pad dock
+destruc tive
+ba ha
+l inger
+je wish
+shet land
+mc gin
+mon key
+ko z
+s one
+raj ini
+te h
+y en
+c vs
+masqu er
+gir ly
+we sle
+was nt
+bro dy
+termin ator
+gil le
+mag gi
+bir die
+jeopar dy
+cu bic
+vm ware
+intric ate
+an up
+to pia
+east on
+sab res
+investig ates
+bu sting
+bil ingual
+valent ino
+in format
+fer re
+advent ur
+hydr ate
+for sy
+az iz
+san to
+e de
+whist ler
+continu ously
+d ham
+un used
+ji had
+addic tive
+vi dy
+do b
+i do
+fi ed
+ni versary
+n one
+fu er
+ðŁĺį ðŁĺĺ
+coven ant
+prin table
+immac ulate
+o em
+cl t
+serv ants
+consu med
+un released
+sc um
+pack aged
+me re
+ìĦ¸ë ¸
+to by
+ta f
+spo ons
+me al
+f ball
+fair field
+jan et
+silver stone
+dart mouth
+follow me
+voy ager
+kom bat
+anni ver
+ene w
+mag dal
+ho ve
+sa th
+grizz ly
+car di
+gart ner
+sand y
+kan ye
+post ure
+po ign
+im pulse
+radio logy
+horiz ons
+si am
+aish war
+= =>
+no che
+tr is
+el yn
+com me
+du i
+ce c
+councill ors
+cudd ling
+creep ing
+loc ke
+manag es
+trans ferred
+ne cks
+di er
+dan o
+v ick
+lun ches
+d he
+en sures
+cri ss
+ul ster
+bann on
+cont enders
+sp am
+sweet ness
+med al
+hon duras
+arc tic
+ultra sound
+in fr
+disco vers
+ei ffel
+ca sters
+ru ben
+du st
+awe ed
+atri um
+lest we
+se ared
+ðŁĵº :
+ty ne
+ex changes
+little mix
+l le
+astron auts
+hersh ey
+work day
+kno b
+so v
+re signs
+today show
+der man
+an th
+af c
+ta ster
+sw oo
+sa eed
+per ing
+narrow ly
+rn li
+best buy
+panas onic
+obst acle
+farmer s
+ðŁİ Ļ
+pa wan
+ki est
+ang ers
+absur d
+oh my
+sin o
+pist achi
+sp ice
+giu li
+prime time
+ko w
+k ens
+ex agger
+! ?!
+u ba
+midd les
+ju dd
+e jec
+slam med
+pen sions
+of a
+re create
+b hp
+xx l
+liver pool
+thre sh
+pur ity
+ni eu
+hol ics
+wr ath
+ra do
+gli o
+am ma
+dile mma
+cr u
+lets go
+.... @
+âĿ ĵ
+sugge sting
+tru mps
+hor us
+f v
+ic om
+refer ring
+predic tive
+tar ts
+ge tte
+so ck
+glo ssy
+pin ky
+al ec
+thy me
+ou ra
+thero ad
+pe tr
+cr am
+p fi
+dv n
+me ier
+incen tives
+tun nels
+mobi l
+rec ap
+extra s
+upri ght
+rev amp
+per severance
+, -
+ot p
+mir ror
+ar wx
+ger ry
+ma her
+g or
+hom epage
+am is
+ag ra
+made le
+best friend
+sirius xm
+bun dles
+admir ing
+t dsb
+ðŁį ģ
+ch as
+slow ing
+ro h
+wall papers
+â̦ /
+tek ken
+gang s
+tal a
+lind say
+shou l
+line backer
+tool kit
+ur anium
+caly p
+ab rams
+mat thi
+ðŁı ¿
+hon ourable
+da yo
+ver sail
+tan k
+st c
+fr itz
+spl end
+pat ag
+anno yed
+on day
+devast ated
+chattanoo ga
+national ism
+mas sey
+jen n
+tail or
+dev gn
+org ans
+zu cchini
+on fox
+sat ire
+wex ford
+dis grace
+no to
+vol ta
+âĿ¤ï¸ıâĿ¤ï¸ı âĿ¤ï¸ıâĿ¤ï¸ı
+à ¶
+home owners
+poin ter
+m cr
+au sten
+day sto
+mo ons
+pal ma
+gra zing
+e so
+influen cers
+shahid kapoor
+compli ant
+measure ments
+develop s
+y d
+par l
+p vt
+rand olph
+tor tured
+ger ald
+eli as
+deepi kap
+war mup
+hick ory
+g ap
+co ffin
+am our
+re neg
+moun ting
+seven s
+ig le
+hi er
+dec ad
+tri ght
+esc apes
+wer ner
+t fl
+ful filled
+ni ger
+sour dough
+re aper
+choo ses
+spin ner
+week nd
+fil tered
+sh uk
+kat i
+old ham
+open source
+kh anna
+at elier
+conne c
+opho bic
+gla s
+complic ations
+ar son
+counc ils
+sm ol
+as sy
+lur king
+ling ui
+han ks
+e in
+Ù ħ
+ru gs
+n guyen
+nou veau
+men ace
+le v
+alad din
+ru ining
+round about
+k m
+con or
+shoo ps
+may day
+traum atic
+prab has
+ka iser
+k ita
+rou ter
+pe dro
+re tar
+stun ner
+spani sh
+distur bed
+acade my
+e learning
+wit ty
+sen g
+fer al
+av y
+sta b
+ke aton
+ur du
+ko to
+hu i
+coo ke
+ari an
+the personal
+u ma
+se ap
+a sting
+rhetor ic
+hand writing
+munici pality
+consor tium
+ðŁIJ Ł
+glasgo w
+ra ya
+eli za
+polym er
+bro th
+prac ti
+correspon dent
+addic ts
+gay le
+ail ing
+o fe
+p li
+hear tw
+st itch
+sight ings
+prie sts
+sam o
+slo th
+good wood
+roc co
+sab c
+summ it
+l ace
+pres ley
+itt en
+cin cy
+thepersonal network
+s week
+pe gas
+af con
+regi stry
+ci m
+le th
+dic ap
+cand ice
+flu ent
+sm ack
+pede stri
+al oud
+car ac
+priyan kach
+p gh
+ir ons
+dol ce
+lat via
+dece ased
+thero ck
+cla p
+cen e
+fo am
+morris sey
+gre t
+essenti ally
+com cast
+be agle
+argu es
+ing ed
+- â̦
+sa g
+ha san
+ðŁĻ Ĩ
+ðŁį °
+nh ra
+kann ada
+indic ators
+on er
+bri xton
+at as
+screen play
+sor ority
+sha heed
+he em
+class mates
+tain ment
+es i
+breast cancer
+zucker berg
+aur or
+en cia
+ref ers
+kae per
+vor tex
+com part
+lym ph
+photograph ing
+ste ff
+rest ling
+par sley
+mom ento
+th man
+lac king
+du tt
+ocu lus
+fin o
+fren zy
+ra sc
+der n
+dis missed
+noo k
+met gala
+sh ill
+rapha el
+maver icks
+exhib its
+eag erly
+c pa
+amen ities
+. âłĢ
+exo dus
+ern st
+lit a
+deal t
+womens march
+i ain
+score board
+campe ones
+c en
+ti ki
+garri son
+fidel ity
+bra g
+road map
+psy chop
+lo e
+ble u
+ðŁijĬ ðŁı¼
+sau vi
+spr inger
+temp tation
+ru dolph
+ac ura
+wic z
+parach ute
+stro l
+len ny
+zi k
+dom s
+nb af
+al pac
+vivi an
+ro ve
+pre et
+perpe tu
+sna ke
+air soft
+infl atable
+prin ces
+ati e
+ffe y
+pati ent
+m ire
+chel le
+sl ack
+groo vy
+# :
+up loading
+!!!!!!!! !!!!!!!!
+siem ens
+provi sion
+v fx
+need y
+f ats
+to poli
+bhu tto
+sa thletics
+alu ms
+t winning
+south western
+adop ting
+last night
+man ne
+la ga
+tw ell
+ac ia
+-- --
+eye wear
+hur ley
+fle e
+sa ch
+pe cker
+cost ly
+is k
+cr ates
+polic y
+ero sion
+in go
+wer k
+ðŁIJ į
+torto ise
+therap ies
+inter net
+chihuahu a
+ri ps
+fre i
+ed or
+tai ji
+t fc
+do d
+demp sey
+christ in
+chen g
+hi ps
+gra eme
+com passionate
+cavali ers
+histor ic
+soul ful
+crimin al
+ja c
+vin ci
+expi red
+sur at
+turi smo
+k ona
+se aweed
+ber ts
+le ica
+expre ssing
+a al
+wor t
+break fast
+her ring
+am used
+rhu barb
+mar tian
+cospla yer
+y ash
+stri al
+ra ul
+refer ral
+dw ts
+j w
+ad ler
+cur tains
+gu r
+val ence
+tyr one
+sw fc
+coach ed
+re born
+diabe tic
+cho ke
+nor folk
+investig ative
+ðŁĴ¯ ðŁĴ¯
+z id
+v mas
+phi e
+objec tives
+âľ ĭ
+over due
+di vers
+mat su
+ðŁİŁ ï¸ı
+casu alties
+ภ§
+al k
+stand ardi
+re alist
+arti facts
+pand or
+ke x
+in vin
+( !)
+ine y
+par aly
+mr t
+fay e
+the voice
+on ga
+de ed
+skin ner
+az wx
+speci men
+priyankach opra
+nu evo
+bar kley
+toulou se
+resu mes
+football ers
+cit i
+fe tch
+è re
+lestwe forget
+ðŁĻ ĭ
+ch unk
+dri fting
+manipul ation
+equ als
+pu tt
+ky ungsoo
+âĿ¤ï¸ı #
+ela stic
+par ano
+fo y
+do ping
+cin cy
+ss ler
+interrup ted
+al ay
+ado res
+ame thy
+con voy
+ãĢ ı
+Ĭ ãģ
+black list
+gener als
+sa chin
+bru shed
+oun ces
+non stop
+illi ams
+bt sarmy
+u av
+ru ff
+bur ma
+bi k
+defen ce
+schul tz
+bo asts
+lonel iness
+go re
+trans forms
+alum na
+@ @
+ra ppers
+ne hru
+car o
+himalay an
+wearab les
+ge h
+pepper mint
+re development
+flam ingo
+cos by
+big baldhead
+ag ri
+bare foot
+sco pes
+re gram
+gh ana
+ðŁİ «
+i heart
+sa die
+carri e
+microbi al
+ku ala
+sk ater
+quer que
+âĻ ©
+gen res
+reas oning
+ch ased
+as o
+sli pped
+en can
+vam os
+ker s
+ad verse
+mo il
+commod ities
+with you
+sil ent
+hy pe
+an de
+am ination
+whi spe
+lit z
+âļ½ï¸ı âļ½ï¸ı
+ri ff
+pp y
+lam bs
+gan esh
+ab sent
+regu lator
+marse ille
+en roll
+par cel
+wa p
+by rd
+ðŁĩ Ń
+tu ber
+country music
+par l
+contro llers
+responsi bilities
+we y
+ch ate
+montene gro
+chic o
+mil an
+l ms
+tra inees
+appropri ately
+un certain
+popp ies
+ed sheeran
+nutr itious
+gar o
+deut sch
+awe some
+ãĥ ¼
+comfor tably
+land marks
+et i
+re usable
+daniel le
+ro sal
+co les
+just ic
+c cs
+f anny
+ni m
+mc u
+clin ch
+at ene
+mer ge
+im db
+ang lo
+uc cino
+pan ini
+an not
+bur berry
+feat ure
+predic ting
+fashioni sta
+s ask
+imag inary
+mm o
+south sudan
+spe ar
+hu bble
+jo inthe
+coyo tes
+sli go
+ko dak
+sit com
+polaro id
+roo ted
+corru p
+ðŁĻĮ ðŁĻĮ
+bris ban
+at z
+ah l
+re my
+tal ent
+aval on
+ra da
+pau line
+locom otive
+go ons
+ne mo
+maser ati
+ic u
+stu tt
+histor ically
+sm b
+pres by
+avo id
+so oners
+rhine stone
+w ad
+ri sing
+tro t
+mo des
+reg ent
+optimi ze
+re ece
+sm u
+ver ti
+newyork city
+cor tez
+ra c
+in case
+sin c
+fiel ding
+e tta
+tiff any
+al monds
+sad dle
+k rat
+mat ter
+g low
+star ving
+gl o
+cra ppy
+sl ur
+st d
+monit ors
+recei pt
+maymay entrata
+mc il
+un is
+rain bows
+cal dwell
+pacqui ao
+j op
+a fe
+hoo k
+es sen
+wiz ard
+medi an
+fla ws
+com s
+âĿ Ħ
+ing h
+ha ynes
+anton io
+tem plates
+ou ter
+na w
+cardi gan
+bel grade
+ðŁĴ ī
+hom o
+a ise
+ro pes
+no ve
+what you
+tri gge
+concep tion
+ad ukone
+na di
+fri ars
+sw er
+adju sted
+hot line
+san ity
+kau r
+down loading
+c gi
+ten or
+eth nic
+app alach
+ภ¸
+pa g
+gol ds
+on set
+investig ator
+car tel
+peace fully
+jarre tt
+cat alan
+poli o
+n um
+fru stration
+dhar ma
+my life
+âľĮ ðŁı»
+aber deen
+mu sa
+bin der
+spark ly
+fle eing
+instin ct
+co ping
+domin ance
+ill ers
+er a
+u conn
+lo oms
+living ston
+gal i
+he s
+c ma
+bel a
+se ley
+mon k
+la ch
+mar x
+Â ´
+m erica
+woman in
+es sex
+ra ina
+jim i
+nep tune
+z ack
+chine se
+mart ins
+chand elier
+her n
+with us
+ear l
+asph alt
+modu les
+st p
+ul la
+psychi atric
+mile age
+captiv ating
+si der
+men to
+mor t
+tran ce
+tal bot
+ab by
+ì ĥ
+âľĮ ðŁı¼
+j ak
+daw n
+turn up
+scre wed
+fe ds
+blue print
+ðŁĴĸ ðŁĴĸ
+har sh
+er os
+insom nia
+ban kers
+ta emin
+mis conduct
+hu mber
+gi di
+edu ardo
+con a
+musc ular
+consu ming
+ra sh
+don nie
+di pped
+col lie
+samu el
+melt down
+ðŁĺįðŁĺį ðŁĺį
+me z
+exam ining
+schwar tz
+pri stine
+ðŁIJ Ŀ
+ve it
+ful filling
+an esthe
+gue sses
+dra ft
+som me
+soli d
+pati onal
+ho ped
+evolu tionary
+all er
+enter tained
+sli ps
+lud wig
+conclu des
+sen sible
+bon net
+cra ze
+tra s
+haz ards
+const antine
+ed ics
+star trek
+to c
+occu pational
+in cheon
+deepikap adukone
+pizz as
+new comer
+de part
+oppre ssion
+ebon y
+foss ils
+tro jan
+el en
+ste aks
+k hou
+positi oning
+ug by
+red cross
+ak h
+dol ce
+us mnt
+pp en
+dil ig
+ma vs
+call er
+cost ello
+⼠Ħ
+dy n
+thing s
+rhin os
+a xi
+sar kar
+con vocation
+att ers
+ss ss
+fun gus
+eu gen
+russ o
+squ at
+w sb
+eli on
+william sburg
+s off
+defici ency
+be arer
+o kin
+key stone
+t wain
+cal ming
+break able
+wa res
+horser acing
+com bs
+bun ting
+u it
+t land
+ðŁĴĻðŁĴĻ ðŁĴĻ
+ga stron
+sab ot
+ick ers
+commissi oners
+sen ate
+ii ot
+ath ena
+nit rogen
+an tony
+ero tic
+di alo
+mis sou
+hypo cr
+âľ Ī
+kaeper nick
+can v
+d roo
+clevel and
+o sh
+mon sta
+stefan o
+^ )
+sh ul
+po ison
+ha e
+commerci als
+ma ul
+nit ro
+co worker
+alo e
+vap or
+t ents
+russi an
+qu id
+question able
+mid get
+po ker
+girl friends
+sin the
+erit rea
+ten ure
+depos its
+buc keyes
+spot ter
+theod ore
+trin ity
+joaqu in
+u cci
+follow the
+caf c
+mp a
+ðŁIJ »
+plo tting
+dom ino
+ta ek
+sion ally
+dicap rio
+pa p
+car mel
+ig er
+bt cc
+beth le
+www bigbaldhead
+foo die
+bagh dad
+mason ry
+off ended
+à ·
+ภģ
+sc ro
+vers es
+ori ent
+ar ches
+pi yu
+know your
+gre e
+ta kers
+gu ard
+dish on
+bucket list
+bha fc
+war dly
+ðŁİīðŁİ Ĭ
+leigh ton
+pe w
+stra y
+assaul ted
+in hal
+ly fe
+amar keting
+l x
+kat z
+ubun tu
+me o
+carto onist
+turno ver
+mi z
+dis like
+mul len
+mo f
+bl and
+hi des
+emer ges
+chori zo
+truste e
+ma hog
+lan sing
+paralym pic
+fa int
+fa una
+ch al
+sn ar
+cat h
+bent on
+cast illo
+sli ppery
+apric ot
+oec d
+bar o
+l z
+he ming
+clow ns
+co workers
+peru vian
+commu ters
+y ell
+ðŁļ ´
+under ing
+v j
+tt p
+fli pk
+w ana
+soc ent
+Ĥâĸ Ĥâĸ
+ठĤ
+oo sa
+jag ger
+di sm
+e less
+d ham
+cali f
+a official
+ec lip
+harro gate
+gra pp
+com rade
+n tr
+concentr ate
+thi ghs
+bit coin
+bel arus
+ë ĵ
+end uring
+now watching
+industri al
+pi p
+ar on
+ar at
+Â ®
+whit by
+oooo ooo
+sa ree
+tic als
+mis leading
+yo on
+year s
+sle igh
+roman ian
+sciss ors
+vam pires
+ac up
+ab ba
+th weeksary
+cent ri
+fl ye
+u o
+c bi
+bu ena
+sin d
+mar ino
+bur r
+re building
+ठ²
+anniver saire
+ac ca
+ðŁĴĢ ðŁĴĢ
+gett ing
+tu lips
+wolf pack
+âľį ï¸ı
+more than
+ta kin
+ð٤ĺ ðŁı»
+u be
+mon ic
+dou bts
+mo wer
+co balt
+don ne
+specul ation
+argu ably
+kak u
+htt ps
+prosecu tion
+din ah
+stam atic
+disclo sed
+bever ly
+fl wx
+cra bs
+extraordin aire
+war mest
+imper i
+o logists
+trac es
+par c
+lake side
+am r
+ter i
+hour ly
+domin ation
+ar row
+shrews bury
+ance stry
+wr angler
+trigge red
+pen sac
+roo ster
+survi ves
+a on
+bo ko
+val or
+love is
+la g
+pe y
+fo cal
+out laws
+bl anc
+artic ho
+wit s
+marsh all
+die go
+support small
+u ca
+sa h
+je et
+syn ago
+gover ning
+ðŁĴ ¬
+sal ads
+cre ate
+miri am
+cen sored
+ami de
+no u
+z eta
+allegi ance
+* )
+bl m
+ric an
+pa stors
+oly mpus
+blo c
+whir l
+star ry
+pr one
+y k
+p ne
+congratul ating
+be v
+so ber
+love island
+sa ir
+an ing
+tutor ials
+q e
+lun d
+in ist
+cle ver
+taxpay er
+ali z
+wren ch
+dd ling
+cap ri
+h pa
+ðŁı» âĢįâĻĤï¸ı
+na j
+o j
+futuri stic
+jelly fish
+ðŁĶ¥ðŁĶ¥ ðŁĶ¥ðŁĶ¥
+cel ery
+plan k
+fil a
+ne me
+un healthy
+lec tions
+ðŁ§ ¡
+rit chie
+n ws
+mi kha
+wonder woman
+âĢ İ
+hip stamatic
+ka g
+ðŁĴľðŁĴľ ðŁĴľ
+poul try
+mo w
+wor ds
+lo ff
+ðŁ¤£ ðŁ¤£
+relat able
+re mixes
+keny atta
+ke m
+re signed
+fo d
+stra igh
+j lo
+hu tch
+box ers
+colle en
+mag s
+instruc tional
+ko l
+attrac ts
+pra g
+account ant
+go ggles
+br u
+th ole
+mar row
+leu ke
+oc to
+pon ds
+bubb ly
+he ist
+ìĹ ij
+im p
+a har
+ha unt
+hall mark
+psy ch
+kkkk kkkk
+col umb
+jump suit
+cost co
+si delines
+ag gies
+over turned
+ni b
+key chain
+fu k
+f af
+mi am
+assist ants
+cy cled
+ri der
+dam mit
+red wings
+mag es
+kin s
+ì Ĥ
+ho d
+son t
+carol ine
+" '
+cu le
+bra id
+fel ony
+ar ities
+ruther ford
+depic tion
+isab elle
+ro ach
+k day
+fifth harmony
+em y
+li gam
+bari sta
+albu querque
+gro ss
+ðŁį º
+oo ks
+ðŁij ¼
+dun can
+try in
+jag s
+g ould
+li tho
+âģ £
+а Ð
+sam my
+tun g
+cas ser
+apo lo
+aaaa a
+man g
+as ics
+sh en
+p ye
+tur bul
+ss p
+saint sfc
+on lin
+n anny
+he ster
+do z
+ภĶ
+th read
+ren ts
+kh and
+ðŁĴª ðŁı½
+un conditional
+rob son
+car re
+ph on
+sacrific ed
+Â £
+auto s
+par ker
+oc a
+log in
+kee gan
+hard cover
+dough nuts
+ðŁĮ İ
+spit fire
+refresh ments
+saskat oon
+commod ore
+j f
+rub ber
+halam adrid
+child care
+stra da
+io m
+ri k
+dak ar
+ther mom
+cro pped
+gar u
+ali k
+ven i
+i ft
+si ka
+ritu als
+z ul
+e ch
+Â ©
+su dan
+l land
+i me
+do cker
+ì ¤
+fe ared
+fa o
+wal ter
+no g
+mutu als
+l h
+ali gn
+mon ia
+concep tart
+ðŁĻı ðŁı¼
+sco e
+compet ence
+sw ine
+ly me
+laun ch
+green er
+abstract art
+inqu is
+gran ada
+ga elic
+flu ff
+d backs
+grave yard
+ba be
+acade mic
+adventur ous
+joh ann
+~ !
+bi bi
+| #
+pl ings
+gett y
+as b
+âĿ¤ï¸ı @
+staf f
+religi ons
+bang or
+world bookday
+me gh
+de vin
+ash ore
+meri dian
+gi thub
+qui z
+all stars
+be stest
+ir resi
+ack er
+do te
+war rington
+pol ly
+newor leans
+cr ou
+wi gs
+che y
+smithson ian
+la sag
+de tour
+bor is
+stra ps
+mari ah
+inten tionally
+ko h
+ðŁį ¸
+ssi an
+mar issa
+cor al
+episcop al
+casu alty
+tom o
+supply chain
+sam p
+on go
+ro o
+cavi ar
+p fw
+clau dio
+buff alo
+s ations
+mat ty
+snap back
+l ds
+al arms
+mat te
+âĺ Ķï¸ı
+conditi oner
+d ors
+he x
+fi zz
+a stri
+sus sex
+secur ity
+qa eda
+all star
+cocac ola
+as one
+cl icks
+sc ans
+mu te
+he avier
+ðŁİ §
+âĺ ŀ
+lv l
+book boost
+youtu be
+fla shes
+f jor
+c su
+explo de
+do dge
+cair n
+gonz ales
+th ill
+pel le
+hart ley
+renew able
+re tin
+e stre
+costar ica
+shipy ard
+nc fc
+pri ya
+a ghan
+an ath
+plu gin
+co rey
+re bound
+or u
+kat rin
+hor mone
+gi m
+mahin dra
+s sus
+park land
+har per
+fanta stic
+infer no
+ep ilo
+wrest ling
+fe ct
+c it
+ac oun
+to ssed
+monu mental
+char tered
+bu st
+pe tra
+âĮ ļ
+wildflower hour
+sweat ers
+* .
+bl er
+ate ch
+go wan
+demo graphic
+bra l
+suici de
+renov ations
+vu el
+sin ister
+ar mani
+miso gy
+ph arrell
+nap s
+un iting
+crusad ers
+cor gi
+insu red
+than i
+no or
+g q
+d ada
+bicy cles
+snu ggle
+sch an
+ten berg
+ss al
+fe mme
+bo il
+½ ï¸ı
+re ap
+occur ring
+hus sein
+divi d
+sto ke
+sh alom
+na ia
+o lic
+frustr ating
+Ù ĩ
+ig s
+gro ver
+scen arios
+n ds
+bru tality
+med alli
+bu on
+sas s
+skate boarding
+ony x
+lor ry
+ny u
+gau tam
+mm ings
+gu g
+end i
+lo thian
+comm ando
+chal k
+ph ora
+asse ssing
+ti gh
+crun chy
+ad ay
+is l
+ci ara
+pilgri ms
+kam al
+p to
+brit anni
+t ani
+sm c
+l ure
+app store
+ab y
+golf ing
+cl c
+fa u
+an as
+shu tting
+regul ated
+carn age
+scow boys
+all enge
+c ma
+humbold t
+rel le
+ku mb
+her i
+refin ery
+sound check
+d wayne
+bos nia
+i sp
+the alth
+anni v
+relev ance
+my a
+bag gage
+dre ad
+s bc
+th ed
+bu h
+hi jab
+lo id
+ke w
+c te
+respec t
+lovel ies
+cu bes
+celebr ate
+dir t
+sav ers
+_ ,
+gar ment
+pulit zer
+mas jid
+beat port
+al arts
+encry ption
+s ner
+ple ads
+found ry
+sym metry
+ru mi
+birth place
+scallo ps
+supp le
+pivo tal
+t ati
+no de
+so d
+pro xim
+tr ics
+col dest
+bren t
+mand u
+cla ir
+e ach
+and alu
+hi ddleston
+ðŁIJ º
+mel ts
+v ance
+pin n
+se ments
+scre ened
+sa chs
+o bl
+ic ha
+âĺĺ ï¸ı
+school ers
+heal ed
+lo gged
+ð٤ĺ ðŁı¼
+ic us
+bore dom
+b ish
+b ffs
+tal king
+sure sh
+hoo kem
+de on
+de fl
+ei leen
+ðŁį ķ
+women intech
+ri sotto
+rang er
+adverti se
+ภģà¸
+tel ly
+la go
+dart moor
+d ong
+sk ates
+lo go
+un ner
+mail box
+ma sala
+lo oooo
+amethy st
+che wing
+c bb
+australi ans
+rc mp
+game art
+# ...
+kor n
+extre mism
+fruit ful
+anci ent
+pu bg
+pol ite
+wh it
+mur als
+m gr
+line man
+dav ao
+ste ms
+ten nis
+av age
+tu pac
+gigan tic
+hs bc
+auto biography
+up the
+ี à¹Ī
+re gal
+fig uring
+ku l
+mis sy
+hoo p
+gra s
+for ums
+back lash
+abduc ted
+p nw
+min ic
+bu tt
+bott oms
+at on
+ven g
+ðŁĮ ı
+del aney
+prab hu
+fan club
+over haul
+health ye
+sy no
+aa f
+ren amed
+kim i
+un cle
+man city
+se u
+qu anti
+este em
+um in
+en zo
+mel vin
+under go
+j har
+far ah
+coast ers
+humph rey
+mh z
+children s
+^ .
+d hi
+disrup tive
+integr ating
+r nb
+over sized
+a ide
+ne au
+docu mentation
+ðŁijĢ ðŁijĢ
+pal o
+hear th
+ri yad
+pun ctu
+abc news
+secu res
+boy band
+bir ch
+ju co
+tra ff
+legislat ors
+bay a
+ãĤ ¯
+no ises
+collec ts
+s warm
+k ner
+bi shops
+stur geon
+snapp ing
+mo l
+fre aky
+chair person
+tro p
+lyn ch
+car cin
+art sy
+e sto
+cha i
+fl ur
+inv ali
+sau sages
+im el
+j or
+fun fact
+wit ter
+puni shed
+ac ons
+h ya
+re versi
+em c
+dif fu
+z x
+sp aw
+cla d
+d mit
+hol land
+fre sco
+pay roll
+ab undant
+stu ffing
+mor o
+c ny
+boy cott
+wend y
+ele ven
+pro voc
+pil ot
+tr x
+be ad
+climate action
+ri on
+assi e
+ì ĸ
+o sm
+islam ic
+ho ar
+good reads
+al ici
+afterno ons
+spoke sman
+jo lie
+it as
+masc ara
+âĻ© âĻ«
+pre vail
+beetro ot
+lu jah
+k li
+dod ger
+Â »
+ru le
+l n
+scre am
+ho bart
+col bert
+r tc
+er m
+pat ro
+quo ting
+s live
+que st
+non fiction
+semin ary
+prosecu tors
+ve st
+express way
+g ge
+nau tical
+et f
+ðŁİīðŁİ Ĭ
+dur ation
+cha ired
+the film
+fab io
+she h
+can o
+ðŁĴª ðŁı»
+with draw
+! :)
+cor pus
+phen om
+yel p
+la wn
+ent om
+snapp er
+but te
+pin ball
+pro xy
+libr e
+alle vi
+n ada
+gabri el
+fo wl
+eure ka
+daph ne
+tu nes
+pun ched
+wh ore
+jo g
+ren tial
+man ners
+o pe
+wh ufc
+gu th
+revol t
+sne aker
+philharmon ic
+ho ste
+sovereign ty
+ðŁĻıðŁĻı ðŁĻı
+fish ing
+sci art
+fe ta
+i pp
+dump ing
+kel own
+gir i
+dig its
+sal u
+san jay
+twee ters
+sp as
+col chester
+sc ab
+ma dd
+๠Ħà¸
+Ä ĩ
+ged don
+march for
+do p
+maure en
+un plugged
+di do
+fashion blogger
+up a
+mex ic
+tar y
+pol ye
+jame son
+v t
+grin der
+mad dy
+consult ancy
+¬ ë
+leagueof legends
+ac cents
+um ni
+jane iro
+tu ss
+h ens
+ampli fier
+to shi
+pret tier
+pre vents
+new town
+red wood
+vant age
+ball ard
+ar tof
+a she
+a sion
+lac ey
+ap at
+gro ve
+ภĦ
+rw and
+real tors
+tra itor
+bed ding
+ö r
+zi on
+fla shing
+cam pan
+boom er
+secretari at
+ab ol
+liti gation
+cont amination
+se dly
+shred ded
+in for
+do herty
+bench mark
+ro che
+skate board
+sho vel
+i zz
+to pper
+o ster
+laby rin
+autu m
+k ong
+hum mus
+vi z
+tech news
+kla us
+am using
+socialmedi amarketing
+i des
+cast ell
+ste e
+underestim ate
+cal ab
+pa ign
+b illing
+unanim ously
+g mb
+fly fishing
+hath away
+commerci al
+colour ing
+skul ls
+pivo t
+te p
+tb c
+motor way
+x press
+construc tive
+pu k
+under lying
+kir sten
+mani ac
+cha o
+se ma
+chiff on
+ðŁijĮ ðŁı»
+ver ona
+kom o
+stan doff
+wi ped
+c ated
+bla ir
+wor kin
+m sc
+bethle hem
+swi pe
+unexpe c
+pe es
+pe tri
+orig ami
+ðŁij ħ
+mex ico
+flav or
+ru dd
+cannab is
+mar u
+ri ddle
+wor shi
+sil on
+sch at
+ap se
+tang er
+bi ous
+e er
+questi oned
+o zar
+dan k
+angle sey
+char an
+bak u
+compe ten
+re pri
+bat ter
+sa xon
+cal ves
+leng ths
+$ $$
+âŀ ¡ï¸ı
+immer sion
+ga unt
+car ry
+cy to
+b anda
+shu tt
+experi ence
+el gin
+mous se
+ta z
+ê µ
+in correct
+en z
+b ham
+mor on
+so ver
+ar un
+ti pped
+la ble
+de arly
+bau tista
+í Ļ
+mor tal
+woo p
+dt la
+sho cks
+dav os
+ðŁĵ Ŀ
+swim wear
+her man
+ðŁijĩ ðŁijĩ
+z ir
+neglec ted
+grac ed
+campu ses
+av s
+ar ora
+swach hb
+live pd
+ac cra
+enqui ries
+shoo ters
+kur t
+vancou ver
+brad ley
+gar da
+g ü
+ol la
+attrac ting
+up ton
+ne win
+lu mia
+furn ace
+ev ers
+e on
+sw a
+roo kies
+a oc
+v ss
+bris ket
+tor ch
+yo da
+heart land
+tac o
+ph ony
+food bank
+ab bey
+bab ylon
+u y
+gre ate
+expre sses
+d andy
+sc apes
+survi vor
+ron d
+e ci
+ha vin
+ab el
+chil dish
+tor que
+wav y
+ur self
+kanye west
+year of
+ale stine
+o brien
+al fon
+sk ag
+kore an
+anchor age
+val eri
+de w
+ðŁİ ¨
+land slide
+car ole
+christ en
+go phers
+af i
+priyan ka
+q q
+power of
+it te
+pc so
+tw ol
+pr y
+intellec tu
+guer rero
+pi les
+wish list
+w ren
+time table
+ë ı
+prodi gy
+gibb ons
+. /
+ne ur
+anz ac
+mur ray
+vie st
+pla ster
+la ir
+art gallery
+inter continental
+g br
+bell ator
+nam joon
+mam mals
+am el
+y aw
+saras ota
+cam ar
+bud ding
+sum mari
+aco sta
+la sh
+ey ou
+post graduate
+instruc tors
+ti g
+const ant
+were wolf
+ic os
+cla s
+glen n
+bud ge
+ðŁĻ Ĥ
+er ta
+sta ins
+persecu tion
+cumb ri
+o ch
+syner gy
+hu ang
+scand in
+mid terms
+comment ator
+regar ded
+perpe tual
+bo iling
+al p
+lan ge
+sch le
+fac eli
+twee ta
+ri dden
+ok toberfest
+charlotte sville
+ik lan
+jo u
+ch atham
+b sc
+ðŁį ¦
+stra uss
+mel low
+xx xx
+happy hour
+re actor
+ww er
+distr action
+at orial
+ðŁĴª ðŁı¼
+twin peaks
+fay ette
+a or
+ko k
+bro om
+sy fy
+ou se
+am ag
+Ø ·
+ubis oft
+lu lu
+hall mark
+stu art
+it ya
+si deline
+venge ance
+re lu
+sex ism
+boun cing
+un ites
+gu stav
+te ssa
+stu mp
+pro clamation
+ima x
+divid end
+col by
+ðŁį İ
+play wright
+un safe
+co smo
+ðŁĩ²ðŁĩ ½
+cup board
+constitu ents
+ang lia
+ram page
+ðŁĺįðŁĺį ðŁĺįðŁĺįðŁĺį
+than ked
+take aways
+shro ff
+de bat
+kh ur
+conduc ts
+format s
+à ©
+port age
+graph ers
+u ten
+pre m
+mo ines
+condem ns
+s ous
+l ps
+f cs
+deal ership
+leuke mia
+bure au
+ski d
+guardi ola
+ca ster
+thir d
+avoi ded
+en cyclo
+c sr
+vi xx
+analy zing
+she ar
+dulu th
+shap iro
+chan ting
+stre sses
+as be
+mil itia
+ãĥ ª
+col lin
+arsen e
+sure sh
+teach ings
+yi xing
+sh ill
+nu des
+sv u
+clear water
+war ped
+pro life
+artist son
+it u
+versail les
+galax y
+ax el
+spring st
+cal a
+hu hu
+sc u
+commit ments
+exe ter
+poign ant
+mo tion
+conserv atory
+row dy
+rec alled
+mu sk
+emb elli
+so the
+âĺ Ģ
+sto pper
+sch ild
+to pe
+el mo
+zi el
+j om
+barn sley
+snow den
+on tour
+jour ney
+hills borough
+par ole
+w ts
+mo ving
+ag ility
+tiv o
+ff ers
+kindle unlimited
+g wen
+ann an
+ah mad
+tex tured
+hepat itis
+dra m
+insi ders
+tis sues
+ãĥ Ħ
+fc barcelona
+cr atic
+na acp
+pe can
+f gm
+custom ize
+concer t
+g sm
+pe g
+p one
+justin trudeau
+super cars
+happy holidays
+bu lar
+ado x
+lap tops
+digital health
+destin ation
+gradu ally
+áĥ ¦
+popp y
+ss l
+inhi bit
+star light
+of fro
+glo omy
+x per
+hal der
+im plants
+le to
+hass el
+a as
+un told
+en ci
+liber ia
+or an
+con tests
+il ah
+sma g
+sc out
+mari anne
+cr yo
+schedu ling
+lo s
+kan e
+stutt gart
+ne se
+law rence
+da in
+pho tom
+car ou
+ภ£
+g wy
+national dogday
+roa sting
+band camp
+kentu cky
+stret ches
+ke rel
+ca she
+ãĤ ¸
+sta x
+tran si
+dog gie
+at ric
+hal le
+ci vic
+brow ning
+lein ster
+cat day
+high land
+joy ous
+in cumb
+or lando
+ro mo
+col ton
+del ta
+car ab
+ro tc
+aster oid
+goose bumps
+mo logy
+yo ko
+an ds
+tomor rows
+red carpet
+sm p
+ca sio
+ðŁ¤£ðŁ¤£ ðŁ¤£
+se au
+rejec tion
+rot ating
+bi partisan
+th un
+mat i
+bon i
+ol l
+ener gye
+do it
+l j
+mother hood
+lou ise
+neck laces
+el ite
+ni x
+l cs
+en v
+gl u
+le sh
+cran k
+su sie
+m clau
+so tu
+crow ley
+rat ri
+use d
+bre ton
+alfre do
+ye o
+travel pics
+ti pp
+elli son
+sax ophone
+me red
+heu ghan
+ta ine
+f es
+vi ro
+suppo sedly
+i as
+dige stive
+y le
+li zzy
+wildlife photography
+bri anna
+west field
+ra ined
+am her
+ðŁĺĦ ðŁĺĦ
+distribu te
+bott om
+pre serving
+oil and
+craf ty
+de scen
+col ling
+shakespeare sunday
+r wc
+ang led
+ci an
+t ations
+mon tage
+me yers
+france sca
+ðŁĮ ·
+wi ggins
+san ford
+volunte er
+car ra
+bar k
+vari ed
+pl in
+am u
+kap il
+rock ers
+qu ind
+br ane
+in mate
+ent al
+impro vis
+michi gan
+re tweeting
+progre ssing
+mercedes benz
+smo ker
+physi ology
+dor ado
+watt pad
+h wa
+sr bachchan
+w ga
+vol atility
+hi re
+ac ap
+wn ba
+hein z
+stit ches
+kidnapp ing
+bur ys
+lim b
+f itters
+thumb nail
+ton e
+mir and
+desi rable
+ad dison
+tar an
+tamil nadu
+spec tator
+soci ology
+amit shah
+remo tely
+âĻ ¦
+ham id
+r ds
+g lee
+smooth ly
+sch ro
+er c
+lali ga
+he als
+us f
+ni shi
+d hu
+un il
+h le
+tro mb
+bhu tan
+pilip inas
+se ung
+whit man
+te y
+min ce
+snow boarding
+re au
+k ker
+av o
+zach ary
+ran veer
+ti k
+gover n
+qu al
+beck y
+anthropo logy
+att en
+grocer ies
+de bit
+war p
+sil icon
+hawa ii
+ðŁĴ ħ
+pomegran ate
+pe er
+orang es
+people schoice
+end ure
+ðŁĴĽ ðŁĴĽ
+ãĤ¹ ãĥ
+ac ial
+a haha
+stu k
+imper ial
+bl ond
+pow der
+kno ts
+vin ce
+wood lands
+den a
+watch in
+mat cha
+ma hat
+galax ies
+middles brough
+k ö
+stre e
+resc ues
+wal do
+lero y
+desp ic
+real ities
+tm nt
+ha q
+un o
+pe c
+bolly wood
+blin ds
+design thinking
+he ms
+and hra
+ab sen
+fan s
+ste ch
+shire hour
+bla ine
+shak ti
+pu rely
+ðŁı ı
+tra fal
+ke ynes
+gr ate
+to bias
+spon taneous
+satur ated
+caval ry
+pri sc
+ðŁĺ ij
+wh t
+pas si
+~~ ~
+vir at
+patt inson
+la o
+weir do
+sym pathy
+ju da
+occa sionally
+cred ited
+stat u
+es co
+hil ly
+esc ape
+dischar ge
+se er
+may nard
+sud bury
+z lat
+or al
+we er
+encoun tered
+sm elling
+over sight
+ê ¸
+that cher
+mack ay
+you can
+fre ep
+freed oms
+prophe cy
+ho e
+ishq ba
+dra ke
+qu its
+pel led
+tur k
+o vi
+wesle yan
+new music
+leg g
+ch eng
+h illi
+ay y
+pan ties
+ad versity
+ad jac
+vaccin ation
+ju ke
+ga c
+exce ed
+time sof
+sta ining
+ep cot
+v ital
+up ward
+bethe sda
+apar k
+ma hi
+camp fire
+enchan ting
+rha pso
+h z
+na ver
+fa x
+vali dation
+ac ad
+ny r
+as ym
+coordin ated
+depar ted
+all ery
+var ies
+spr ite
+chap lin
+ss occer
+s wat
+bre t
+relu ct
+tunes app
+super star
+reminis cing
+o co
+home grown
+dough nut
+un canny
+la pd
+thyro id
+! âĿ¤ï¸ı
+botan ic
+bre s
+sp ade
+i ste
+echo es
+du lil
+bur sting
+qui ero
+ðŁij İ
+loy ola
+amuse ment
+ha ils
+sleep y
+burgl ary
+âľ ı
+ro gue
+cot land
+mo ors
+low er
+wic ked
+ðŁĶ Ĭ
+compet iti
+argent ine
+yvon ne
+karti keyan
+ili ary
+gat sby
+precin ct
+six ty
+na ji
+cam s
+practiti oner
+ðŁĺ³ ðŁĺ³
+pu ne
+neg li
+juli en
+inv aded
+cali br
+cla m
+duba i
+mu k
+lan tic
+produc t
+fe dex
+ï¸ı :
+eu ra
+dari us
+s ling
+virtual reality
+home stead
+ðŁı³ï¸ıâĢį ðŁĮĪ
+pac ed
+in ha
+pul mon
+la zy
+premi ering
+ma stered
+in he
+con gregation
+ba jo
+sport ing
+new jersey
+hor ny
+lma oo
+leng thy
+du t
+yo gh
+swe aring
+philosoph ical
+pap ua
+in ski
+know les
+dy ke
+âĢ ²
+to ken
+mc guire
+ri ot
+probab ility
+mc con
+gro s
+su mat
+c ite
+da a
+on da
+mad dow
+che w
+board games
+spar ked
+re claimed
+ad hd
+ny se
+imwith her
+equ inox
+boo ths
+balsam ic
+ha zy
+dor chester
+ag os
+se aw
+moder ator
+seri ea
+ander sen
+pilgri m
+âŃIJ âŃIJ
+itch en
+hal li
+x ton
+nathan iel
+mun ition
+celesti al
+ga f
+zo om
+mark le
+pen thouse
+cal e
+s fa
+bar king
+tu cket
+em ery
+cal orie
+li que
+ad ar
+mc nam
+tor tilla
+wood pecker
+mo town
+bad ger
+ayr shire
+scram ble
+dd ay
+cra ziest
+per rie
+cho co
+cast e
+i ot
+wre cked
+selec ting
+uss r
+gra ft
+pun t
+lab ou
+ir st
+ba ek
+Û Į
+su ki
+que u
+ach at
+te ster
+aug mented
+wc vb
+sin ks
+ðŁĵ »
+ra ke
+inter ne
+be cause
+belle vue
+une arth
+light en
+ðŁĺ £
+turn around
+labe led
+unemp loyed
+twitter kurds
+le ia
+h ye
+great er
+ðŁIJ İ
+tim ed
+i red
+e tt
+limit ations
+cab e
+s out
+bee ch
+anni hil
+re trac
+yo ona
+ang er
+den nis
+supp lying
+di z
+" (
+sc ur
+gun man
+su ho
+sauvi gnon
+ภ¥
+wi ley
+land on
+choreo graphy
+pre historic
+ðŁı ĥ
+var gas
+assess ments
+pinn acle
+di i
+chamber lain
+ì Ī
+v p
+present ers
+deut sche
+sun shine
+sal utes
+r one
+bu siest
+- .-
+motor ists
+hemi sphere
+al wx
+ps p
+ow a
+den ying
+cho c
+gu tier
+han uk
+mus kete
+jait ley
+se wage
+t ame
+thin kers
+shi m
+se quo
+pap ar
+middle east
+k wa
+ke g
+patag onia
+no y
+bar ça
+take off
+he a
+à ¬
+n sc
+g dc
+ðŁij Ī
+mou stache
+mel ania
+thr a
+â¬Ĩ ï¸ı
+pier ced
+ze us
+fon ts
+ber a
+it iner
+q atar
+contr ary
+ire land
+i fy
+ou los
+commun al
+fin s
+un paid
+pa a
+ðŁijĩ ðŁı»
+ri os
+ou p
+f iller
+cafe teria
+ภŃ
+kas i
+cali ber
+z ulu
+v sco
+ts ford
+dragon fly
+smo kin
+pi st
+psycho logist
+diplom at
+we bs
+buc cane
+à® ¾
+motiv ational
+du ne
+ba e
+c fs
+with out
+er on
+i ac
+ate e
+pen sion
+fra zier
+en sis
+sk is
+par ting
+ger y
+territ ories
+nach os
+eni ght
+ever lasting
+msd honi
+tel e
+sp un
+po di
+sab ah
+environ mentally
+ce ase
+beau mont
+mar ta
+kel vin
+ho ff
+sun il
+n da
+co b
+sh ale
+ree dus
+un boxing
+u bio
+re opened
+n all
+capsu les
+mar r
+himalay as
+swee ter
+ja z
+f mr
+twee ter
+dha ka
+na u
+de mi
+d fs
+ta urus
+fad ing
+it utes
+ci p
+over flow
+jef frey
+don ny
+car tunesapp
+ðŁį ij
+prefe cture
+danc ed
+c pt
+ple asing
+ital k
+earth quakes
+ul ation
+hi o
+ãĢ ĭ
+ant an
+nutri ent
+de ere
+selec ts
+enrich ment
+r iti
+tram pol
+bl amed
+j ia
+contribu tors
+chesa peake
+pi geons
+tribun al
+mad uro
+w su
+ilo ve
+effici ently
+dar cy
+war ms
+ar ra
+ec u
+ho wer
+strugg led
+rajini kanth
+ðŁĺ¢ ðŁĺ¢
+hou sing
+str at
+eli x
+disp ro
+raf fic
+thi erry
+na sty
+c fb
+staf fing
+al ma
+back ers
+hen son
+sky walker
+reale state
+roo s
+ness y
+chan ce
+cair ns
+c ci
+pe dal
+ly ft
+cross word
+wait er
+only in
+kru ger
+k ir
+alej andro
+car tier
+car rera
+re paired
+ou at
+un clear
+un breakable
+today in
+qu eries
+jo dy
+gen ital
+win ner
+to l
+kelown a
+fascin ated
+ãĥ ¬
+sris ri
+squ ared
+spr ung
+negoti ate
+priv ately
+av en
+>> >>>
+g ical
+gav in
+chester field
+zu mba
+or r
+nat alia
+impeach ment
+mn l
+car at
+criti que
+credi ble
+trac y
+tan i
+musi k
+jig saw
+gam bia
+tol kien
+fe u
+as per
+sav ory
+fo xx
+f itt
+mar lon
+l rt
+v ell
+p br
+imprison ed
+i om
+chu l
+wind shield
+kay e
+ba a
+chor d
+s art
+al gon
+minister ial
+nat geo
+la zio
+nor ms
+ðŁijį ðŁijį
+lic king
+fut bol
+un sung
+dalla scowboys
+sh red
+distur b
+dev ine
+be ards
+ch f
+b day
+ro sso
+ig or
+ay i
+si ren
+k air
+sti les
+ro f
+mag nets
+un cover
+mou se
+bang ing
+si ghted
+spe ople
+impac t
+row land
+kir a
+environ ment
+love the
+p sis
+mish ra
+gl endale
+ca jun
+o che
+de ception
+sex ist
+stra ws
+s ga
+buff er
+apost le
+sp l
+pop up
+ðŁļ Ĺ
+r g
+up er
+ball in
+i dy
+occa sional
+national park
+ðŁı Ĭ
+u an
+innov ation
+ภ«
+te aparty
+re tte
+counter fe
+b ha
+rec s
+ig en
+ðŁĮ IJ
+humming bird
+cu r
+ha ven
+la zar
+pue blo
+: :
+zi onist
+op ath
+inver ness
+promo ter
+carto on
+cabine ts
+mahog any
+surve ying
+r ational
+feel ing
+testi fy
+so w
+oc on
+ภ¢
+ne el
+mar is
+sol itary
+che mo
+rad cliffe
+sim ons
+ros ary
+new er
+jo die
+re tali
+pra wn
+pad dy
+hen ge
+k ala
+im plant
+at y
+bren twood
+par adox
+ene z
+re designed
+p our
+wy d
+al de
+௠ģ
+sol d
+biomed ical
+๠Ĥ
+tt tt
+mat teo
+ys er
+new ton
+de bun
+ner dy
+loo l
+wo on
+elisa beth
+ec c
+wh i
+ach o
+salv age
+sal aries
+qu ity
+navig ating
+oph thal
+con soles
+re built
+o pec
+ast ers
+sho red
+set list
+kathr yn
+rhy mes
+re visiting
+ash ish
+li ft
+re post
+sole il
+âı ±
+weal th
+sa at
+we c
+king james
+flipk art
+field work
+se gu
+mo dal
+bu b
+are rs
+ðŁį Ĵ
+clo oney
+pad dington
+necess ity
+guth rie
+pen te
+li mo
+jo sie
+ar tin
+en c
+l hs
+betra yal
+info graphics
+i er
+mo a
+hear ings
+bon jour
+sym bolic
+ag ro
+wed ges
+krist ina
+wild flower
+athle tic
+photograph y
+pe sh
+ca hill
+chi lean
+gou l
+fi oren
+ðŁij ¶
+z il
+sk im
+bad oo
+deli a
+tre ble
+n cc
+ðŁĩ¦ ðŁĩ
+a house
+bul lock
+sol itude
+ا٠Ĩ
+can cers
+futureof work
+hu tch
+water shed
+war mongers
+sp illed
+colom bo
+mo th
+associ ations
+weigh ed
+global goals
+not just
+christ i
+tor g
+swe ating
+man eu
+clu sters
+â̼ï¸ı â̼ï¸ı
+ta ped
+ul y
+tru sting
+yu suf
+te in
+ra b
+, ,,,
+sin ai
+audi ble
+explic it
+cro wns
+sch iz
+at least
+ðŁĹ £
+de bra
+je suit
+ene gger
+z hen
+one sie
+i it
+ss f
+gur gaon
+chak ra
+bear cats
+k ran
+k awa
+reque sting
+han over
+g end
+sor os
+mer cy
+lovel y
+do omed
+tim my
+ku z
+ul l
+ab ram
+sa ison
+ãĥ «
+clean ers
+re mo
+circu its
+bar red
+o th
+mo ist
+madele ine
+gall o
+u j
+per mits
+hea viest
+car ols
+az te
+gior gio
+flo ats
+decl aring
+us rc
+min at
+craf ts
+pri ma
+conven i
+nickelo deon
+danc ing
+ceremon ial
+blo gg
+tw p
+anglic an
+she k
+k nick
+( ((
+hubb ard
+harve y
+hit man
+fen g
+we some
+for za
+s word
+op us
+bro m
+gi bility
+z al
+m unch
+dance hall
+gre edy
+hd mi
+re birth
+ðŁĺĭ ðŁĺĭ
+s world
+figur ine
+com post
+k f
+engra ving
+gior no
+st ana
+k man
+ham ster
+compos ers
+aj e
+func tionality
+pol k
+is ons
+air planes
+te se
+hor rors
+musc at
+gi ven
+sp ence
+ðŁĩ¸ ðŁĩ
+eli ot
+ach illes
+fre ck
+crypto currencies
+sou ther
+hal o
+bor neo
+polit ic
+hahahaha h
+up state
+si ena
+obsc ure
+hau sen
+lloy d
+happy friday
+motor bike
+bon a
+americ as
+hol s
+- (
+spor ty
+un aware
+reven ues
+christop her
+bank sy
+av an
+ev apor
+com press
+eyel iner
+to dos
+buff y
+renewable energy
+ly rical
+ar chan
+rapi st
+fair trade
+lma ooo
+beat z
+pro active
+la pse
+ir ical
+revers al
+po de
+mcin tyre
+mac au
+ãĥ ķãĤ
+nash grier
+f sa
+g all
+çĶ Ł
+perpe tr
+il ya
+configur ation
+% ;
+str ange
+rac i
+ภĩ
+pic kups
+kov sky
+mam mal
+w ps
+g able
+compar ative
+z h
+save our
+da vey
+on etsy
+mu ssels
+mis er
+cri stina
+electr on
+cra ve
+lo ren
+precipit ation
+m z
+ðŁį «
+vin cen
+snow board
+no ida
+ah n
+marin ated
+g tr
+town hall
+min is
+bethe l
+adv an
+su ra
+shi el
+fur ry
+ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤ
+lyn d
+so il
+sc ence
+sen eca
+shar jah
+dick ens
+credenti als
+av ar
+per k
+requ iring
+pre fer
+j ian
+de ca
+r ach
+ing for
+del e
+be ep
+ðŁĴ »
+cis ely
+hu ddle
+green sboro
+haw king
+ho ax
+hang ar
+ç ľ
+mis o
+lo vin
+gre ta
+ab ad
+logi e
+at an
+snow flake
+mahe sh
+fear the
+al kal
+bobb lehead
+ba hn
+ju dged
+fu tu
+feli x
+ðŁį ĵ
+pi ke
+der iv
+notic es
+au er
+dis super
+or da
+wi pes
+am ino
+stri kers
+foo tb
+dram as
+pun ching
+score less
+heming way
+bi h
+bal lad
+chat ter
+am mo
+kle in
+fabric ation
+kari m
+z end
+hi sto
+vol ta
+rock y
+marke ter
+xtre me
+sequ encing
+paradig m
+cle ats
+boom ing
+âģł âģł
+block ade
+promp ts
+yogh urt
+pur pose
+nu r
+regu late
+nois y
+ing rid
+bird watching
+bar tender
+Ù ĥ
+wor dof
+cha otic
+shor ty
+el dest
+z app
+onceupon atime
+fl yo
+rit os
+mike quind
+ðŁIJ ´
+regi stering
+. ]
+ad ol
+gg gg
+pur ge
+kid lit
+ar bor
+val ves
+synago gue
+o th
+unanim ous
+veri fication
+dar rell
+ãģ Ħ
+vander bilt
+tape stry
+pro sper
+did dy
+dra fting
+de cep
+marqu is
+st int
+michael jackson
+pee led
+men us
+bb b
+sc are
+ema il
+wri gley
+it is
+f ell
+some thin
+bar ra
+ed gar
+di pping
+pu ddle
+sla de
+lear ner
+jal en
+ðŁ§ IJ
+the daily
+mikequind azzi
+ju x
+iq bal
+mckin ney
+ra iser
+ef an
+dr one
+cat o
+pic ket
+cro we
+l att
+uk o
+giuse ppe
+hin i
+synthe si
+ponti fex
+song writing
+to d
+swit ches
+din ners
+h q
+gabri elle
+pensac ola
+cir cle
+expo ses
+ev s
+riyad h
+pro men
+o ck
+sa j
+cit ation
+brew co
+jo si
+ep aper
+dri f
+point less
+tang led
+cri pp
+line ups
+fairi es
+daz e
+mour n
+bla dder
+sal z
+bur undi
+book mark
+the people
+sub sequ
+princi pal
+sk er
+court ney
+a oki
+rac ers
+ad m
+mom a
+critical role
+hou n
+shed ding
+sa ka
+ace ous
+mck ay
+hus bands
+Â ½
+me da
+accu sations
+ro sel
+nc is
+witne ssing
+or ama
+go ds
+hil ton
+el man
+ÃŃ n
+meg ap
+cra ven
+announ cer
+crit eri
+sheffiel dissuper
+milit ant
+consu l
+hoo ded
+aby ss
+b x
+ma dam
+lo cu
+mary am
+manic ure
+grat is
+ac tresses
+ros ario
+this dayin
+king ly
+gn ome
+cel ine
+r ous
+he el
+lil ac
+vish al
+ab h
+thor ns
+s ls
+ne al
+construc ting
+be ren
+s lang
+ma ins
+far ra
+sar ko
+pai ge
+gu iller
+l ala
+ice berg
+nou n
+plann ers
+u mmm
+ou ses
+ill ary
+ma an
+box ing
+zi pper
+srin agar
+migu el
+o str
+mp o
+responsi bly
+lan terns
+appli ance
+x b
+gren ade
+neglec t
+dy sle
+ham mock
+ne ctar
+wit cher
+r gv
+di ence
+ser bian
+seed ed
+cru z
+bi sh
+sp he
+e q
+sky rim
+alge bra
+phil ately
+bungal ow
+ge off
+y ves
+demand ed
+consider ations
+the vamp
+pawan kalyan
+co ded
+grit ty
+erup tion
+se infeld
+uni denti
+ëĭ Ī
+wor m
+ac us
+se ung
+dun g
+ro land
+su d
+di visions
+ab lanc
+shor test
+j f
+p oun
+plant based
+be to
+tough er
+mc o
+don et
+mark us
+v fl
+ðŁı ł
+open ing
+co ward
+caber net
+o xi
+burle sque
+sand ra
+su mo
+consi st
+tho t
+cay man
+motor ola
+gutier rez
+d slr
+y w
+no bel
+nov ice
+moms demand
+grun ge
+sp or
+d cc
+pre sses
+sli st
+allot ment
+voc ational
+ft c
+pu ja
+lo ven
+utt arak
+tan dem
+sh ep
+come dians
+anat om
+cant wait
+healthye ating
+west side
+mar gins
+chi ang
+asbe stos
+stupi dity
+proble matic
+fit bit
+: $
+ceil ings
+shu a
+protec tions
+bio tic
+beng ali
+re sts
+bien nale
+tim o
+cul min
+e minent
+affe ction
+unbeliev ably
+individu ally
+canvas sing
+wh itt
+nov asco
+chin son
+h pe
+go w
+gloucester shire
+pa o
+thresh old
+chev ron
+s ine
+we ther
+pp ie
+aqu ino
+antwer p
+âĸ ¬
+po on
+inst af
+equ ine
+cinemato graphy
+nbaf inals
+vali ant
+kil kenny
+te rence
+syste mic
+sr l
+p ound
+made ira
+pl ough
+tre cht
+mat ed
+mp d
+ransom ware
+ph in
+li qui
+bb ce
+boom er
+i standwith
+con ju
+r te
+nar a
+foo lish
+da shing
+vier nes
+br ite
+da u
+juni per
+ai da
+you now
+ra zer
+de i
+repe ating
+comfor ting
+adjac ent
+e to
+ca sted
+chat ur
+mu er
+syn th
+san itary
+mac le
+independ ent
+law ful
+e erie
+h or
+ðŁĴ Ń
+am rit
+vel o
+station ery
+mu f
+may may
+contempl ating
+elabor ate
+gre gor
+dri es
+ac col
+ภļ
+schwarz enegger
+ill nesses
+day break
+follow back
+collu sion
+electr onic
+jo vi
+hiro shima
+ta w
+hom ec
+mic ah
+qu itting
+fro sting
+ben fica
+hel i
+s ical
+pic cad
+corpor ate
+ment orship
+you are
+sing er
+shi va
+ru ne
+ing er
+ri um
+play able
+doo p
+wil low
+ter re
+ni p
+at d
+war bler
+profession ally
+er ase
+proce ed
+pedestri ans
+mis chief
+ben ding
+alas kan
+c kett
+mo p
+dd les
+shut ter
+ge ared
+atene o
+ma deline
+g ations
+o sha
+der ick
+sw ild
+an gry
+pat ents
+hun k
+decre ased
+fr y
+ðŁĴĸðŁĴĸ ðŁĴĸ
+sal on
+quant ities
+d ario
+ni gel
+ku ma
+jen n
+happ ye
+xx x
+rex perience
+pro s
+au sch
+rele ssly
+ham burger
+fuku shima
+er ne
+stat ec
+ren d
+may field
+j one
+lef ty
+bern stein
+sm il
+gener ates
+fore station
+band its
+ta yo
+r ca
+ac ci
+rodri go
+kn app
+elo vers
+vege tation
+u ral
+le ft
+ħ ï¸ı
+worl dre
+sur i
+embar k
+w son
+ba you
+mu ller
+mo vers
+ðŁķ º
+presby ter
+l f
+cre e
+bat b
+sal am
+demonstr ations
+an ec
+n pc
+it ics
+to graphy
+re inst
+thur st
+tal e
+off ences
+smart city
+bro tha
+ofthe year
+in valuable
+ear n
+ðŁijı ðŁı½
+kre mlin
+gra dy
+town fc
+guern sey
+ma ha
+contag ious
+dre x
+be en
+( £
+nati vity
+k tm
+somer halder
+comp ounds
+íķ ĺ
+" â̦
+af g
+ott news
+h ound
+fire fly
+cil an
+donet sk
+volunte ered
+ak ira
+è ª
+sing ul
+st h
+dro wned
+mand o
+he ir
+ðŁİīðŁİ Ī
+tax is
+y uki
+vel d
+k ans
+el k
+ran ts
+hash tag
+t eng
+ro g
+a at
+gru b
+e ber
+in india
+colo ssus
+sig ni
+so ever
+mile stones
+der o
+differen tial
+phu ket
+master mind
+an gh
+mel ani
+bro ker
+actor vijay
+stun ned
+continu ity
+af fl
+vo cal
+perenni al
+fianc é
+in complete
+hun ts
+re issue
+domin ates
+tur meric
+ro am
+ri on
+bag ged
+nas sau
+fu t
+x ox
+national trust
+jo ye
+san o
+hearth stone
+dis respect
+le es
+h se
+siber ian
+offe e
+re stock
+wolf gang
+re gan
+plan o
+un wind
+re par
+mil le
+] ,
+skul l
+fat ally
+concep tual
+ðŁĮ ²
+f é
+ber to
+b ms
+u a
+mag na
+notre dame
+le te
+la undering
+heartw arming
+buffe tt
+go at
+pe abo
+wind mill
+v ac
+continu ally
+az alea
+mem brane
+can cels
+make yourown
+athe red
+p to
+tor pe
+ðŁĺ ł
+ðŁĴ §
+sc ares
+le aking
+z et
+pix els
+ac i
+kh il
+marath i
+ðŁĻı ðŁı½
+u la
+tam u
+chandi garh
+z agre
+aa b
+pronoun ced
+aubre y
+sand er
+pun ta
+har low
+ic elan
+celebr atory
+so t
+unci ation
+stru ly
+mc dowell
+deepi ka
+remin ders
+my stical
+ct c
+chat ted
+s ica
+bar gains
+ch hat
+ru bin
+m net
+oiland gas
+pel ican
+o at
+mor ality
+k our
+i h
+nu clear
+gc u
+ric her
+vene zia
+m ma
+le ith
+ac company
+rich mond
+sports net
+ba ahu
+smu ggling
+mm i
+ðŁĩ®ðŁĩ ª
+twi sts
+sahi b
+.... .
+amb itions
+il lo
+histor ical
+fo rec
+show biz
+pon ies
+chas ers
+remo del
+will ing
+prince sses
+am ple
+cushi ons
+ac les
+lot r
+da ch
+an the
+in corporate
+new bury
+ki ri
+fried rich
+ab v
+ball ers
+alber t
+ðŁij Ń
+let i
+nan op
+ci de
+anal o
+n sf
+)) ))
+griffi ths
+valen ci
+ro ano
+fun run
+babys itting
+ca day
+ent re
+u ck
+slu g
+tic al
+the sims
+ro ar
+car ney
+g am
+sto we
+fi d
+bun ny
+sham rock
+pe cu
+mol ina
+go cougs
+con tributes
+transform ation
+mo y
+v aj
+sever y
+antioxid ants
+thir teen
+sight seeing
+l j
+reversi ble
+odd ly
+hoo kah
+nou vel
+hal al
+fe i
+stab les
+mul t
+ho pped
+bra ids
+inter change
+ghana ian
+ww ww
+eth no
+con junction
+ago v
+ye ti
+earth and
+ts p
+con serve
+heir loom
+metaph or
+woo f
+tor io
+self less
+n wa
+em ilia
+yl ene
+y xe
+gi ar
+moder ating
+pro bz
+b fi
+ne er
+du mmy
+hanuk kah
+we bber
+k v
+eye brow
+dag ger
+su mp
+ra ges
+ork ney
+tb o
+hal sey
+assign ments
+tr onic
+scri b
+co on
+an war
+# âĢİ
+jal ape
+flori da
+qu aid
+haw keyes
+âĻ¡ âĻ¡
+street car
+ro g
+dat lantic
+gran ola
+un changed
+expect ation
+Ù ĩ
+mar lin
+gu mmy
+ðŁĻı ðŁı¾
+awareness month
+oil painting
+mu th
+per ch
+jun to
+villa gers
+mor g
+che ated
+web comic
+the future
+d ps
+la kings
+men tioning
+vo or
+ident ities
+accor d
+mc gu
+l pga
+rum our
+massi vely
+m pls
+heal y
+d ate
+sp oli
+re visited
+on t
+al and
+scru tiny
+lakel and
+bl ending
+< /
+an kara
+jami edor
+metab olic
+f ences
+ann y
+å ħ
+semic on
+oo tt
+space ship
+wack y
+le ta
+ap ac
+she e
+in herit
+do res
+ðŁĩ¨ðŁĩ ¦
+gent e
+tw ick
+ri ms
+gal ve
+de ville
+king fisher
+scorpi o
+ow l
+al ar
+vari an
+ðŁĹ ĵ
+vene tian
+star dust
+then orth
+q ing
+har rington
+consul ate
+spectac le
+ho bbs
+tur ks
+gre er
+mat ing
+ðŁİ Ģ
+ðŁĮ Ģ
+direc ts
+í ĭ
+pompe o
+vo iced
+la os
+tz u
+pro me
+pri sm
+mer c
+fortun ately
+bc fc
+mcdon nell
+not sorry
+smi led
+t ba
+for war
+mid term
+dar by
+we instein
+up grading
+wol ff
+bron co
+cab ello
+ðŁ¥ ĩ
+fi able
+shar pe
+bat tered
+sat o
+myth ical
+instap ic
+pre pped
+eni um
+e spo
+di aper
+explan ations
+who pping
+ragn ar
+pe el
+antibio tic
+l acks
+harri son
+li sm
+au l
+qu ail
+martin a
+sent encing
+sc ams
+di di
+tr onics
+ãħł ãħł
+go ff
+za in
+param ore
+cha ined
+clin ton
+li ff
+cott ages
+em on
+reve rend
+consu mer
+ce an
+t any
+lum pur
+e bay
+sto ol
+ðŁĺ» ðŁĺ»
+ta pro
+h ath
+modern art
+just ine
+prover b
+app y
+tra x
+mani fest
+am bu
+nai k
+pe pp
+r sd
+mer chants
+kitch ener
+shi fted
+li zz
+âĺħâĺħ âĺħâĺħ
+âĢĶâĢĶâĢĶâĢĶ âĢĶâĢĶâĢĶâĢĶ
+uto pia
+tom o
+ou ted
+com ers
+chiroprac tic
+book club
+cin dy
+pro hibition
+se uss
+ë¯ ¼
+thin kin
+rr rr
+go fund
+t ack
+om b
+catastro phic
+ling u
+guild ford
+bo td
+ॠĭ
+plan ter
+^ ^
+win k
+kath mandu
+sto ppers
+smooth ies
+re efs
+hin d
+bell amy
+Ħ ë
+waste water
+vo or
+nat l
+! ]
+re el
+y ap
+scoo by
+work space
+corin thians
+bl un
+obli gation
+g bbo
+dy son
+cra vings
+ell ington
+dap l
+wre xham
+earthand clouds
+uk runchat
+positi oned
+kal b
+four square
+jo ck
+im pending
+even ing
+ath y
+pro claimed
+c ites
+ann apolis
+san i
+mar th
+ir l
+accom mo
+ka a
+fin a
+y aa
+di sper
+ec ar
+bha k
+will y
+ðŁĺĢ ðŁĺĢ
+mcder mott
+mo j
+gener ational
+u said
+train ing
+lon ely
+lo res
+impe cc
+âĢ IJ
+beav ers
+ma ki
+he b
+aap l
+å ı
+wolver hampton
+leader board
+me u
+c fa
+easter n
+hu r
+civil war
+ou rage
+hor ned
+le high
+awar ds
+evi dent
+gi gab
+r ous
+ma del
+ro byn
+ur gently
+k ors
+en as
+heis man
+bam bam
+fab ian
+f om
+evalu ating
+assemb ly
+out sourcing
+hun tsville
+ðŁĶ ª
+justi fied
+cashi er
+sp aper
+buc keye
+analy tical
+illumin ati
+au tho
+o j
+sha de
+geel ong
+wh ey
+he aton
+terri bly
+ele k
+un charted
+sd live
+moto cross
+her mes
+dar shan
+dar lington
+cash mere
+gri pping
+cilan tro
+pun ish
+... :
+ðŁĴ Ħ
+inst ance
+der i
+lo bal
+muk her
+sp ar
+thin ker
+fre mont
+com piled
+color ado
+vig ne
+sm d
+whe ad
+villa ge
+le ek
+formula e
+ta res
+persist ence
+?? ????
+ped ago
+he z
+alzheim ers
+vul ture
+off ence
+is great
+suff ra
+kick in
+h mmmm
+broad way
+ï¸ı @
+art i
+alli son
+endor ses
+ry u
+lolli pop
+soy bean
+kend all
+cer a
+inv ade
+( ðŁĵ·:
+conver ter
+car pets
+ho bo
+fr it
+pe ac
+es qu
+ern an
+ou f
+an il
+di ffer
+ch ing
+bre cht
+sp g
+daven port
+stra va
+sever n
+n gos
+stor ians
+fe te
+parame dic
+j hb
+al amo
+sne aking
+gold coast
+roof s
+isi l
+depic ted
+projec tions
+nu mb
+o ss
+ep i
+glu cose
+zid ane
+infin iti
+íĺ Ħ
+ran som
+ton ics
+fal k
+g ler
+ou tw
+re ss
+week ly
+the on
+n ole
+ðŁĩªðŁĩ º
+vol ley
+sum mar
+neg ativity
+sam son
+ye w
+aus votes
+ju l
+ju dy
+f art
+pra yed
+pal ate
+multicul tural
+double header
+cycl ones
+pier re
+ãģ ¨
+âĺ łï¸ı
+rt w
+conver ting
+wir ral
+l ari
+ir relevant
+austin mahone
+an che
+ya an
+sd f
+$ .
+explo ding
+ulti mate
+prof ici
+gofund me
+cell ence
+ep stein
+bul lied
+sep tic
+à® ¤
+lu mber
+cu ff
+vsco cam
+pl or
+ภ¥
+se ok
+ro to
+venezu elan
+sor ta
+spir ited
+daniel padilla
+team sisd
+radio active
+icelan dic
+ðŁĴ ¤
+ver e
+accommo date
+shi pp
+ot ter
+ol ina
+e go
+su la
+san antonio
+de as
+simil arities
+âļ ¾
+y om
+bro ward
+å °
+can cun
+veri fy
+on te
+candle light
+ìł ķ
+inf ants
+az am
+ðŁĺ °
+le ven
+un stable
+bloom ington
+x ford
+con tour
+y p
+innov ator
+histor ies
+po y
+lolo lol
+ex pires
+cat alo
+bill boards
+an ab
+el ic
+novasco tia
+fa ire
+ìĿ ´
+rock well
+gr ille
+az tec
+joh or
+ur struly
+fi ren
+dun lop
+id le
+port man
+jo es
+tx hsfb
+hol m
+cham ele
+under world
+lo ss
+ti em
+therap ists
+past ure
+pa ste
+ing now
+vul can
+ra gon
+lar kin
+o shi
+ho co
+child hood
+umb rel
+success or
+kath y
+iz en
+° ï¸ı
+share holders
+ol ga
+ai b
+he ap
+fl aming
+ro u
+air tel
+rat t
+z ane
+vo w
+thor ough
+sn ag
+par th
+un conscious
+ve y
+new release
+gh ee
+croati an
+facilit ating
+swan son
+astor ia
+to logy
+master y
+ðŁ¤ ij
+bil bao
+trou pe
+the ori
+chey enne
+ro tt
+shore line
+gra sso
+master chef
++ )
+vi x
+ellen show
+as g
+an ak
+ku ya
+safar ilive
+debu ting
+blu m
+list ener
+v ins
+book shelf
+smart cities
+makeyourown lane
+; ;
+ðŁIJ ¯
+ri zz
+on ward
+bull dog
+bear ish
+vir uses
+fri gh
+lin den
+we iser
+sn t
+gon a
+dre sden
+fl anders
+cu k
+wheel ing
+ba u
+atu esday
+surf ers
+swi ft
+mc call
+arbitr ation
+aw d
+mon c
+b ine
+at x
+re fr
+mi ro
+po sey
+n are
+rit ter
+âģ ¦
+play book
+blow out
+sports manship
+s oooooo
+malay alam
+gri ms
+bur bank
+infin ity
+sar gent
+oit nb
+joseph ine
+ski pping
+par kin
+excur sion
+semin ars
+jo har
+par tridge
+post game
+ll ll
+blan che
+temp ting
+m na
+lu ka
+is ers
+to ffee
+bar ron
+he mmings
+sa e
+go hawks
+cu pid
+li mbs
+con se
+un common
+z ada
+head shot
+so ils
+pione er
+mam ma
+sem itic
+pan dey
+jamiedor nan
+spl its
+vel a
+son i
+ra ff
+t mobile
+âŀ ĸ
+pra wns
+lit er
+enjo yment
+egg plant
+tu b
+cultur al
+us ic
+suspici on
+sy cam
+summ ed
+ma du
+ho ck
+up wards
+eye ing
+ri ve
+assas sins
+âĤ ¬
+out fy
+chi ves
+t ner
+la is
+por ridge
+sad dest
+w cc
+vick i
+sna ils
+biz italk
+mill an
+ðŁĮ į
+sam oa
+j ing
+mi key
+gu j
+chel ms
+eli gibility
+arma da
+thro p
+surger ies
+ãĤ ¿
+mo hawk
+ex its
+me m
+is lington
+c me
+land fill
+kait lyn
+ðŁİ ¼
+combin ations
+tomorrow land
+ver b
+cor a
+pre cisely
+na om
+ðŁĨ ķ
+shr ink
+sof tly
+merce de
+mand el
+poo dle
+ball erina
+sop h
+jux ta
+y at
+ary an
+hesit ate
+lo wered
+gu lar
+dungeon sand
+ron an
+my ri
+sp f
+men opau
+gra sp
+pa thi
+fe asi
+fla w
+shi story
+ste ward
+gg le
+fay re
+cli que
+credi bility
+yo g
+sec tion
+mu sko
+se ville
+no tt
+cal m
+mate o
+indic ted
+fi ba
+by l
+lin o
+u kin
+!! #
+enig ma
+siri us
+bu sc
+ðŁį Ĭ
+mac kerel
+psal ms
+a at
+tomorrow spaper
+ðŁĺ ĸ
+p fc
+........ ...
+shre k
+mul let
+o sh
+danger ously
+immen sely
+am ur
+ðŁį Ĥ
+pro por
+sy a
+london marathon
+abo ve
+obli gatory
+pro v
+ra cha
+alex is
+pri mary
+sh h
+ether net
+d stv
+cou gar
+un lucky
+ni l
+steak house
+mel a
+fc bayern
+cause way
+ca therine
+fluore scent
+nx t
+to kyo
+au sp
+releg ation
+qui zz
+shored itch
+proud tobe
+promo s
+inter acting
+home brew
+da esh
+w pg
+stead ily
+provin ces
+bal lots
+i ah
+al to
+< <<
+you u
+ri ley
+prefe rence
+tra verse
+incen se
+am munition
+ho dges
+# @
+hail state
+tart an
+witch craft
+vent ilation
+liber tarian
+! â̦
+ow es
+% !
+ong chang
+bru shing
+le ic
+fi ber
+under attack
+down load
+ex pir
+hy o
+pompe y
+mc bride
+y ag
+stre e
+com bat
+ten ding
+ai ra
+gug gen
+ab ra
+in na
+fli ps
+aw al
+m ach
+dol lar
+inspir ations
+z um
+o du
+it ty
+video game
+aqu aman
+har u
+bel fast
+je b
+but ch
+us gs
+calcu lus
+go yal
+mor gen
+x finity
+stand up
+contrac ep
+sab re
+na be
+in secure
+gener ously
+epit ome
+l w
+t ca
+narr atives
+don nell
+pand as
+ber gh
+tu t
+ker al
+fel icity
+br ampton
+quinte t
+nom ore
+ðŁĶ ij
+lo i
+alham dulil
+ðŁĶ¥ ðŁĶĹ
+ston er
+shaw l
+clin ical
+bren dan
+gon e
+fla wed
+tri ppy
+j g
+al location
+po aching
+ve vo
+mo cks
+lef tist
+bon uses
+condem ned
+abil ity
+st ating
+microbi ome
+bio logist
+for you
+wahl berg
+ss or
+ift ar
+w ul
+ÑĦ оÑĤ
+pom er
+me me
+ver te
+tre ll
+tra it
+in let
+hormon es
+deliber ately
+vill ar
+battle ship
+p bl
+tw enti
+ho kies
+dal ail
+say a
+may fair
+han s
+die ts
+⾨ ⾨
+od in
+hot spur
+pap i
+k ana
+k amp
+fin na
+flo tus
+ti ans
+unic orns
+tribe ca
+chang ers
+fore ground
+out a
+inv aders
+gett ys
+tomorrowspaper stoday
+mac millan
+hand written
+w fp
+u de
+state of
+base d
+âĺģ ï¸ı
+cas m
+psy ched
+histor ians
+fol d
+d da
+ag grav
+p ans
+green way
+au sv
+ðŁĺ ¶
+shradd ha
+inde x
+be sti
+zim mer
+t ness
+eye shadow
+ot te
+go ts
+distribu ting
+pro min
+yo l
+ace a
+tram rahim
+hoo per
+supre me
+jam min
+intu itive
+quali fications
+sli m
+sid di
+jay ne
+tri pping
+g tx
+pun s
+e manuel
+om g
+mid summer
+in to
+succul ent
+ri en
+new mexico
+o or
+hoo king
+in f
+ðŁ¤ Ŀ
+flir ting
+na hi
+g friend
+t ps
+hel ix
+z s
+on ie
+ct f
+kri s
+irresi stible
+fla p
+ðŁijıðŁı» ðŁijıðŁı»
+us wnt
+ru d
+ram ps
+pin oy
+ot w
+lol z
+low ering
+favor ite
+t mc
+phra ses
+her mi
+aver aging
+em br
+ben o
+estu ary
+sle eve
+ribb ons
+ta sh
+ภ¹
+x f
+aw gs
+sun ited
+brew eries
+anir ud
+pun ches
+ol die
+ip ads
+wi fey
+land lords
+d ji
+gun ner
+íķ ´
+tex an
+ex op
+cas sandra
+s off
+ðŁļ «
+igh ton
+bak ers
+awareness week
+v all
+ear p
+bts bbmas
+apologi zes
+âļĵ ï¸ı
+was ps
+states man
+snat ch
+watch dog
+ra fi
+after party
+spi ke
+j er
+peri ph
+r nc
+mu ll
+le en
+shi es
+li eu
+urstruly mahesh
+mer ton
+de sai
+shi f
+ðŁĮ ±
+pe dic
+gos ling
+arrang ing
+ww g
+gen y
+you uu
+netfli x
+e ttes
+k wi
+bernar dino
+am iga
+Ø ¨
+kashmir i
+t ings
+emer itus
+de cat
+ab domin
+dc i
+pha ses
+d jan
+be am
+op ry
+i shed
+the ellenshow
+the st
+habit ats
+to ons
+mclau ghlin
+ri pper
+micro biology
+tal aga
+clu eless
+ss u
+cro che
+bro mance
+longe vity
+zagre b
+prev ented
+tra ve
+spo ilt
+darry l
+migra ine
+al cat
+dd dd
+vi v
+ser pent
+mat tel
+jam a
+con quest
+î Ħ
+sam sung
+presbyter ian
+ket ch
+fire fox
+mo tif
+le c
+cho pping
+cher no
+j ann
+ðŁIJ °
+pro lon
+wake up
+conver gence
+mersey side
+heart broken
+lo oming
+hal lucin
+mai ze
+commun ism
+mo h
+twitter storians
+serge y
+res eller
+favor able
+ed gy
+re iter
+mal aga
+live me
+ka hn
+pul sion
+big g
+kim kardashian
+ati o
+tyr anny
+ru ption
+q ant
+pro ven
+by z
+pu shaw
+kri stin
+e er
+tar dis
+ri z
+awak en
+mi ko
+un documented
+path finder
+indirec t
+resemb les
+h ler
+conce aled
+scand al
+re im
+d nb
+cr itters
+attend ant
+apprentice ships
+aa u
+scre amed
+l su
+fa h
+har bour
+ed d
+bat sman
+li ss
+mi sha
+spani el
+it f
+advan cement
+fa c
+close up
+cecil ia
+medi c
+narcis si
+lav ish
+gi ac
+ma ys
+le it
+wine wednesday
+pushaw ard
+let to
+curren ts
+bug atti
+out ine
+w j
+un do
+ler osis
+devo tional
+ðŁij «
+on na
+fais al
+sa una
+himach al
+am ii
+à® ®
+di zzy
+screen writing
+ph x
+sp n
+ick i
+ag irl
+fi shes
+wb z
+pi m
+bo ar
+ac id
+! ..
+rocke feller
+n ga
+dra stically
+simpli fy
+dru mming
+autum nal
+gur mee
+lor de
+jo ann
+give up
+b our
+am ura
+der land
+sim pler
+wat son
+tri dent
+concor dia
+bel lum
+bre k
+dum plings
+vi on
+dungeonsand dragons
+sp ri
+ascen sion
+wil datlantic
+u st
+rob ins
+legi on
+insi st
+jar o
+gue ss
+so b
+bigh it
+pool side
+negoti ating
+mc gill
+bil d
+techn icians
+miti gation
+ajay devgn
+b to
+ant en
+cosmo politan
+ðŁĺĬðŁĺĬ ðŁĺĬðŁĺĬ
+patri oti
+temp er
+promen ade
+nav ajo
+nam m
+wrink les
+dc fc
+le ach
+bru nette
+r f
+cout inho
+al ti
+tradition ally
+op tome
+na z
+accord ingly
+rec ard
+de ets
+sw ell
+po sure
+whit ening
+strang er
+illi on
+here ford
+u wu
+ro bber
+cotsw olds
+cl en
+gor ge
+nam aste
+re lish
+gri ff
+adren aline
+bla sio
+val e
+ê ²
+toler ate
+rail minindia
+jen sen
+ho ven
+el lu
+ob sole
+eisen hower
+unidenti fied
+than niversary
+body guard
+Ø ¯
+i dge
+sch al
+stock port
+sn i
+re taining
+po po
+pix ie
+oli thic
+ki er
+ha jj
+sa z
+cor bin
+!!!! !!!!!!
+v it
+me gat
+de h
+circu it
+af fleck
+theore tical
+hope less
+u ab
+slu mp
+b ice
+jam med
+let stalk
+can i
+side ways
+labyrin th
+re fs
+ha hn
+jare d
+ðŁį ¹
+jam bo
+ph yl
+enhan cement
+c tr
+ful lest
+se ye
+do ba
+cho ic
+yo s
+cb j
+andr é
+re watch
+pri ma
+doctr ine
+for gets
+u hm
+ar ound
+u le
+art lovers
+shi raz
+har th
+ex tor
+Å ¡
+unexpec tedly
+eli us
+y x
+em my
+se ac
+ðŁijĩðŁijĩ ðŁijĩ
+correc ted
+com bu
+wom anc
+cou gh
+what son
+publi shes
+divers ity
+back bone
+lock down
+mesmeri zing
+nor te
+ma b
+desig ner
+í ģ
+ra gh
+mole cules
+get outside
+the beatles
+semicon duc
+nach o
+lun es
+ham mers
+sul tan
+o on
+fe ren
+att ach
+ar qu
+uttarak hand
+s ash
+; -
+tre ad
+i ko
+ar thur
+scandin avian
+r ation
+ga el
+charge able
+fish y
+v ma
+hand bags
+char a
+ay ne
+de fam
+sett lers
+qad ri
+pal ais
+in wx
+apocaly ptic
+poo ja
+a es
+at ories
+proof ing
+n lp
+ts la
+v ina
+li do
+dee phouse
+informat ics
+v v
+pp ings
+di ss
+Ã ¯
+uhur u
+st ony
+betra yed
+b aff
+my ra
+as pen
+allow ance
+tam ara
+ci f
+cor bett
+ser ge
+di go
+ambi gu
+pain ters
+p cr
+p ca
+nom s
+lo ft
+ve e
+opend ata
+ðŁIJ ±
+alex andre
+identi fies
+fantasy football
+re production
+brom ley
+ware agle
+mm er
+p ss
+cu es
+ay at
+hut chinson
+sar ac
+jack man
+ira h
+ap ink
+col s
+aussi es
+ex ecs
+day ton
+ðŁĻ Ĩ
+im v
+har am
+chuck le
+authent icity
+ar do
+incub ator
+ภª
+photo shopped
+embrac ed
+fight for
+gor man
+zz zz
+schol astic
+cri sps
+te apo
+mid night
+ga ine
+col lier
+s ate
+de tte
+å Ń
+imag ine
+i ff
+tw ili
+i fication
+teat ro
+nor ma
+es ur
+emergen cies
+rise up
+r inger
+hass le
+cait lyn
+tranqu il
+vers a
+se b
+over look
+gin i
+bo go
+se re
+may ne
+henri k
+contamin ated
+rhapso dy
+pro portion
+wildatlantic way
+âģ© .
+organis ers
+tran e
+stand ard
+sper m
+laun cher
+ric ci
+her ts
+paper work
+showcas ed
+mer yl
+pen a
+p imp
+disa strous
+^. ^
+phar a
+x is
+fron tal
+sw irl
+sp ills
+swag ger
+smart watch
+sizz ling
+savi our
+cat ar
+bb cr
+refurbi shment
+dr is
+citro en
+absor b
+patrioti sm
+il leg
+chro mo
+fresh ers
+ru s
+lim iting
+ef ish
+down ed
+man dir
+hazel nut
+p all
+mac on
+disappear ing
+quali fies
+bo on
+bar racks
+am ine
+gen dere
+ðŁļ ĺ
+j es
+ãĥ Ń
+qu ito
+middle weight
+sch au
+quad ru
+aci ones
+limit less
+ðŁijĮ ðŁı½
+ch man
+ar av
+regulat ors
+it up
+batter sea
+mil ford
+g z
+tic king
+gh ou
+cru shes
+tu tu
+dread ful
+fam ine
+for change
+dalail ama
+ðŁĴ į
+whit aker
+hash mi
+h us
+vo d
+bet te
+aa ah
+iso o
+ðŁ¥ Ī
+ha ar
+la ine
+b v
+all day
+spr out
+indie games
+free bie
+gree ks
+but ler
+ill in
+ha al
+ware ness
+si ma
+public health
+gam a
+wa a
+oun g
+goo oo
+okin awa
+off enders
+im pose
+ho c
+young ster
+story teller
+sc ap
+figh ter
++ ,
+whit es
+music monday
+re za
+go ducks
+bri a
+mi um
+cas per
+cru mbs
+a ad
+marti alarts
+ch p
+ri gged
+tn g
+harve sted
+sa k
+do jo
+mill wall
+b nw
+oc d
+histor yof
+t mr
+si rens
+fan ci
+caregi vers
+vir a
+son i
+recur ring
+acknowle dged
+ðŁı Ł
+oph ile
+bu cky
+stre ssing
+roo k
+di gger
+vi val
+san do
+fle et
+si ers
+sel caday
+refre shed
+anti fa
+a que
+po lo
+disappear ance
+de mb
+âĮļ ï¸ı
+ren ted
+ber ger
+g mb
+cu la
+ss al
+goo dy
+u hh
+marcel o
+w anna
+soft ware
+shop small
+turt le
+tom as
+fri sco
+ðŁĺį ðŁĴķ
+jim enez
+c su
+day z
+an do
+wyn ne
+choreo grapher
+cerv ical
+trail blazers
+ed g
+zend aya
+travel blog
+el s
+whole some
+co g
+lab out
+ar ney
+del le
+su isse
+ma si
+ine se
+om be
+fi ddle
+re claim
+pa u
+wat cher
+sla in
+ber ty
+opti mum
+el ites
+min is
+tur key
+patro ls
+ger ard
+au reli
+wild ly
+wal tz
+br gy
+w ob
+cre st
++ ++
+ve z
+fro sted
+davi do
+the x
+param edics
+p into
+han k
+du pont
+ur g
+fo stering
+micro poetry
+spec tre
+---- >
+ne uro
+fri da
+music al
+galve ston
+e ffic
+sc ape
+pal azzo
+th all
+pro visional
+p js
+au re
+ðŁĶ ľ
+mam amoo
+kit ties
+cre e
+wa k
+lo ool
+lu pus
+cn blue
+Ã º
+ðŁİ ¬
+rac ed
+tro se
+om as
+stri de
+co ors
+⤠µï¸ı
+in comparable
+cy ril
+broad er
+arec lipse
+ðŁį Ķ
+inter val
+ti ru
+co working
+w aco
+a ham
+a bee
+flouri sh
+the times
+ol ini
+kick boxing
+lu cer
+at la
+as un
+casser ole
+mi aw
+lobb ying
+jan ice
+cir que
+re flex
+le ary
+sanat omy
+tem pest
+se mb
+mur dering
+us av
+ro bo
+on et
+p cc
+nati ves
+life of
+sa ha
+ruth less
+rel ates
+appeti zer
+pye ongchang
+nor d
+er u
+a thing
+ug ly
+pl ying
+bran ce
+organ ise
+kend ra
+dat o
+chees es
+par ma
+burn out
+a stra
+pre toria
+adjust ment
+uk u
+sl o
+li ken
+fav ors
+cli ve
+be ets
+snow donia
+go tv
+sy n
+open house
+pan i
+portra yed
+sl ated
+me cca
+ren al
+supportsmall streamers
+staf fs
+da o
+bi ker
+vik tor
+tit us
+admi red
+ðŁĵ ±
+hurric an
+he ats
+gl ory
+photo genic
+mer i
+de por
+burn ham
+or angu
+dj ing
+impre ssionism
+ign ition
+ca i
+w ynn
+de pe
+cove ted
+colla gen
+sau s
+or nam
+administr ators
+ss on
+nh politics
+hahahaha hahahaha
+aspir ations
+r gb
+swol len
+so we
+sc r
+diver gent
+hou ghton
+han oi
+d ory
+ni ki
+land ry
+b cci
+ðŁijĮ ðŁijĮ
+is mail
+tri pod
+her d
+bhat t
+dress age
+tab by
+ingu ish
+hur on
+à³ į
+Ã ł
+to das
+evangel ical
+chor ds
+st john
+slo ppy
+marty r
+face book
+ali ght
+sen sei
+kath niel
+r ites
+zi one
+u o
+revel ations
+weight lifting
+pan o
+nc wx
+ac ton
+à® ķ
+Ø ²
+som a
+ภĹ
+respec ting
+mar che
+fore man
+be tty
+ki k
+shi bu
+po on
+argy le
+k swx
+et z
+mar bella
+brac kets
+stand by
+fire side
+defi ance
+v ex
+britanni a
+in habit
+appo int
+piyu sh
+le ash
+sci ento
+fla sk
+sen na
+> :
+at roc
+sand erson
+id lib
+dhan ush
+ðŁĺ Ļ
+en thr
+hit ch
+de dly
+al ley
+dor k
+mon do
+cudd ly
+mis sin
+ye sss
+night ing
+j pn
+w ary
+ump ire
+ma z
+ê ³
+bab s
+ĭ ãģ
+stan ford
+posse ssed
+exce eded
+ðŁĶ ¶
+wall art
+tra p
+j il
+hi bis
+sp ying
+scri be
+khali l
+trans lator
+lu mb
+di zed
+ch c
+super vision
+shut ter
+ja g
+_ *
+yester days
+ms f
+hi hi
+gonz aga
+gille spie
+vive k
+ec static
+this morning
+ch us
+ed es
+ston ed
+be es
+ðŁĩ¹ ðŁĩ
+tur in
+ho ver
+at rics
+ster n
+sam heughan
+auti sm
+mi ya
+eye witness
+writ ings
+travel tips
+chut ney
+px rtg
+keny ans
+my stic
+k rit
+/ $
+red head
+world ly
+am us
+op la
+le ve
+gab bana
+se en
+o clock
+gang a
+keen an
+sc ent
+ol dies
+go green
+corner stone
+comp ly
+con cours
+ðŁİ¶ ðŁİ¶
+ha an
+con fis
+aw son
+cle op
+î Ģ
+su zu
+sau té
+al gar
+subscri ber
+este emed
+ãĤ¤ ãĥ
+worth while
+mel rose
+flo ck
+bri ghtly
+viol inist
+p ere
+sli pping
+and co
+si gh
+ha van
+cu lo
+m sa
+fibro sis
+matil da
+ra fting
+aw ard
+ë ª
+mm mm
+ge aux
+ste iner
+sin n
+help ers
+beet les
+ai mee
+tai wan
+pistachi o
+mac beth
+m zan
+descend ants
+on sale
+in r
+il m
+grou se
+sa ig
+mo w
+bi gre
+adjust ments
+tu la
+mathe w
+transl ates
+mu h
+bol lah
+ðŁĴĽ ðŁĴĻ
+amo res
+ab outs
+bomb shell
+bla ster
+x avi
+s ns
+k roger
+ga ther
+erad ic
+daf t
+chem o
+ben ches
+ðŁĩ© ðŁĩ
+ut v
+our a
+n ko
+gator ade
+biaf ra
+ok state
+im danielpadilla
+dom ains
+open ingday
+kid do
+do i
+ric e
+day care
+mac millan
+ba thurst
+cheer leading
+ðŁ¦ ģ
+cash back
+k won
+hob bies
+exem pl
+ries ling
+âļ ª
+ag les
+ny s
+every thing
+nav is
+ad di
+magne sium
+faceli ft
+ark ham
+grand es
+extre mist
+don at
+vit ality
+pump kin
+be tta
+sl td
+arti san
+li by
+pe aked
+ah hhhh
+mary am
+assi m
+un sc
+ment e
+al aya
+low ers
+ar as
+gri ev
+le ip
+gr ati
+cri ses
+spr ints
+exe cute
+w to
+ms d
+mag ical
+re viewer
+spark les
+juke box
+ðŁĺĤ âĿ¤ï¸ı
+pay back
+licen ses
+dun kin
+bel t
+lake wood
+h ateful
+bud gets
+rev amped
+ph erson
+ky iv
+went worth
+ro sen
+cru ise
+gi ggle
+def star
+assassin scre
+ym outh
+win kle
+w fc
+band wagon
+b kk
+w iring
+kear ney
+south side
+pe tit
+! ðŁĺį
+nor dic
+mir za
+mu gabe
+v l
+scon es
+k tv
+sand al
+du c
+m alls
+ðŁĴŀ ðŁĴŀ
+it c
+al ay
+im pair
+un rest
+flo ss
+c é
+ab ou
+var ying
+muse o
+ser ver
+di ya
+hibis cus
+ero y
+mer ritt
+fin dom
+f pp
+un usually
+go tt
+conting ent
+ali aa
+ball on
+jo l
+hi ked
+zy me
+ay r
+ag n
+ga z
+perio dic
+spar ty
+practi sing
+lin ton
+tal is
+cy pri
+womanin biz
+radio disney
+ðŁĮ ¼
+jump ers
+endo cr
+ðŁļ¨ ðŁļ¨
+and on
+shar apo
+mi er
+ma sonic
+fac tories
+vi en
+bb ers
+ìĽ IJ
+hol d
+ke bab
+be ak
+approach ed
+ac milan
+mun ro
+ko sher
+excell ency
+negoti ation
+walt disneyworld
+cr ouch
+te asing
+suppre ssion
+en ya
+b ce
+transformation tuesday
+cal lie
+vis was
+p gat
+ic ted
+end ings
+esc u
+recru ited
+it fc
+collabor ations
+g ino
+snu ck
+ausch witz
+i fc
+x ii
+ke sha
+ger vais
+clo ak
+x l
+sa ad
+prob ation
+pre cau
+mac in
+anasta si
+le k
+e azy
+daysof code
+mariah carey
+yo g
+stit ched
+boy friends
+sh ar
+ph ile
+ag u
+twin kle
+phi shing
+week ender
+ic ton
+gurmee tramrahim
+al ton
+l eness
+all an
+pen ultimate
+kry stal
+go u
+lan de
+dis mant
+ab using
+nor se
+pat erson
+ed mun
+ap an
+xi umin
+sk el
+cat walk
+re act
+wal led
+t angle
+br yn
+ve to
+super moon
+cas ablanc
+appreci ates
+ski d
+bo th
+catal ina
+ele ague
+cyber monday
+cau tious
+ðŁ¤ ĵ
+nov o
+hamp ton
+ha ye
+jose f
+var an
+lo bos
+roano ke
+orph ans
+tt in
+squ ads
+ishqba aaz
+black panther
+e tu
+k sh
+cru mble
+cess na
+reli eved
+scul ly
+pollin ators
+explore canada
+ki es
+kam loops
+kir an
+pri mal
+sett lements
+hot spot
+brain storming
+ce dric
+bi ennial
+sh ant
+âĻ¡âĻ¡ âĻ¡
+do on
+hear n
+walk way
+fe m
+ve al
+deport ation
+tox ins
+elimin ating
+descen ding
+by the
+bla sphe
+ha sta
+comple ment
+as cent
+ri ga
+provo st
+âĸ ª
+wee ping
+anti semitism
+employe e
+unearth ed
+pin o
+natali e
+bla d
+ang ola
+lock heed
+in ian
+ag r
+ni ster
+im pala
+m ke
+fan atic
+âĺħ âĺħ
+ðŁij ¸
+lu ch
+simpli fied
+gall ery
+econom ic
+cy borg
+con i
+sel ma
+in ception
+ko ala
+dv ds
+cre sted
+m mor
+visi ble
+n sd
+ðŁĻĮ ðŁı½
+w under
+refriger ator
+re opening
+e era
+carou sel
+as p
+balli stic
+victor y
+mo tive
+tre y
+sharapo va
+si i
+mon ter
+int end
+west chester
+sp e
+cy mb
+vi dal
+ll ama
+uni v
+fin er
+crafts manship
+jazz fest
+b ch
+ag gio
+n cc
+lamb da
+tranqu ility
+cis co
+ba den
+so bbing
+of i
+go ta
+ru mored
+war med
+ore an
+ac ton
+mar ci
+gh ani
+âľ ĵ
+as sorted
+pembro ke
+pen elope
+da f
+at ty
+aim o
+pretz el
+carni val
+than os
+ko chi
+mer sal
+ham radio
+ar twit
+cas c
+guer rilla
+kush ner
+k app
+al ise
+todd lers
+steward ship
+o tti
+ter ri
+tem pe
+rest less
+vit o
+zay ed
+rsp b
+pi on
+hi ppo
+haw thorne
+in as
+am ily
+nut cracker
+lo p
+d ali
+tro pic
+ðŁ¤ ł
+ul o
+jare dle
+py rene
+pale o
+usa ir
+m ould
+it ated
+gene tically
+biom ass
+ðŁĩ³ðŁĩ ±
+do dd
+practic ed
+monarch s
+un manned
+m buhari
+am al
+photo gra
+ko ol
+bren don
+ju ices
+cu re
+world bank
+poin ters
+ðŁĴ Ŀ
+tur f
+le ds
+bor ussia
+bapti sm
+warwick shire
+moun ts
+gay o
+be gg
+co pied
+asi ans
+k g
+moder nist
+gi d
+front man
+concentr ated
+y t
+sc avenger
+iron ically
+adi c
+ps n
+ðŁ¥ ī
+cultur ally
+yu v
+mac arthur
+fertili zer
+be withyou
+ri gor
+min ors
+z oning
+âĸ ł
+ri r
+adole scent
+vin ny
+ren g
+sand stone
+gu et
+we sth
+ple dged
+lac ed
+sp ide
+v ai
+ty coon
+seiz ure
+du p
+appalach ian
+ro k
+cathol ics
+sey chel
+posse ss
+la ger
+jo di
+cham p
+stra s
+d ina
+cent uri
+cal der
+blur ay
+ðŁĩ¨ðŁĩ ³
+mo do
+an nette
+youtu bers
+chap s
+ang ling
+label ing
+a qui
+pk wy
+ly le
+bi sexual
+lit ur
+dug out
+li bby
+grey sanatomy
+sub stances
+august us
+rall ying
+fi del
+ing ue
+äº º
+hallmark channel
+tooth brush
+m á
+adi rond
+ag gi
+ðŁĵį :
+cru sade
+tax ation
+k z
+i ver
+dou bling
+room ie
+wa b
+en rolled
+az on
+a ju
+grand children
+as df
+ðŁ¥ º
+mat ic
+ough ton
+utili ze
+ðŁĴ £
+pon der
+rais in
+dys function
+co bain
+butter nut
+e man
+su red
+dri an
+and friends
+with the
+on omy
+heine ken
+bri dal
+leader ship
+pyram ids
+deutsch land
+jo cel
+bo wel
+y qr
+horse power
+be acon
+ing eni
+gra dient
+fer mented
+mo om
+thing y
+pot assi
+wrist band
+bor d
+bo died
+ðŁĺŃ ðŁĺį
+ma pp
+ka u
+cyber punk
+ph ish
+loo king
+co ates
+ap ur
+am ie
+uk labour
+at in
+g la
+adop table
+shel by
+v illi
+ri ya
+m ingly
+cli mber
+bumble bee
+ðŁĺ ¸
+c sd
+âĿ ¥
+hospit alized
+c ki
+hat er
+ch r
+re tina
+it a
+fan base
+beat rice
+gwy ne
+go ss
+fo s
+favor ited
+swachhb harat
+mal ade
+mon mouth
+" [
+si van
+sh hh
+command ing
+sains burys
+wee d
+g man
+ss w
+rep tile
+iv y
+tro pics
+roll ers
+over cast
+ex position
+masquer ade
+man crush
+wa ist
+spr inter
+sle et
+le vin
+j pg
+_ (
+o pel
+explo it
+ap a
+po we
+wrec king
+jong in
+or b
+er ick
+bo sco
+pra ising
+ber tr
+to wing
+in security
+ku t
+resto cked
+rr p
+prescri bed
+trafal gar
+per t
+g ases
+app rais
+g har
+music als
+âĸ¬ âĸ¬
+mc fad
+ag ony
+conditi on
+equi p
+shi k
+atra vel
+ðŁĩ¿ ðŁĩ¦
+ke h
+abduc tion
+pe oria
+wil kins
+g ms
+as d
+ev i
+ðŁĴĹ ðŁĴĹðŁĴĹ
+u z
+mo c
+halle lujah
+guad alu
+lou vre
+dra wing
+go ve
+ph ant
+fri e
+web dev
+program mer
+z able
+games com
+clari fy
+li th
+kin ky
+âĿ £
+labour doorstep
+son ata
+ju ris
+mai den
+vi adu
+buch arest
+conditi oned
+capit alist
+u de
+ps b
+sp ca
+lul la
+footh ills
+kay o
+bon d
+wom b
+roun der
+ce sar
+bur sts
+ap ra
+sw oon
+sab rin
+fra grant
+cle arer
+ku brick
+cli max
+jour no
+ag le
+ðŁı½ âĢįâĻĢï¸ı
+poo ch
+hal e
+sol it
+sal mon
+organis ms
+bron son
+art en
+hodg son
+alo ve
+vent ure
+bb i
+ae a
+ðŁIJ ¢
+ld n
+d nr
+o zone
+el las
+man ny
+azz ur
+un beat
+tru ffles
+th ong
+ma ñ
+las ers
+ley e
+gettys burg
+back packs
+or is
+ma ison
+craw ling
+la bra
+cl ing
+dra gging
+ste al
+dou bt
+de van
+ck ers
+agent sof
+photo bomb
+elon musk
+abo y
+dist ances
+story line
+sp i
+nor than
+europe ans
+wh ale
+ser pent
+ðŁļ ²
+fi or
+tr it
+ox o
+awar ding
+class mate
+su fc
+smar test
+rich es
+pr k
+big foot
+ar mb
+bi polar
+dw elling
+om ars
+k wan
+gri me
+m eng
+freder ick
+navar ro
+sorry notsorry
+jaredle to
+pa ve
+sl ack
+barn sley
+att ar
+evic tion
+accumul ation
+o ir
+cat chy
+wel ter
+vik as
+has see
+nik ita
+mo yes
+mathe ws
+shi v
+gat wick
+pro filing
+compan ions
+mar rake
+an tics
+ðŁĻĮðŁĻĮ ðŁĻĮ
+se se
+bo i
+bart lett
+poison ous
+ab uses
+ym m
+kam pala
+guggen heim
+imv kohli
+dol om
+bre e
+thro ttle
+gare th
+fitz patrick
+un ya
+par ad
+mar got
+j nr
+we a
+potassi um
+p nc
+disgu ised
+cra sh
+ren ergy
+ill ic
+coup led
+ni els
+ci ones
+æĹ ¥
+im ent
+despic able
+d ye
+what cha
+conne ctions
+paralym pics
+gaunt let
+wait rose
+suici dal
+star ship
+vap or
+st ou
+law maker
+coo led
+si mo
+then o
+offro ad
+ja den
+bas que
+vick y
+lu kaku
+centr o
+tri sh
+strate gist
+medic ations
+hor st
+b fc
+gra il
+sharp ly
+ad itya
+tom b
+kau fman
+tri pad
+sam ba
+pastor al
+brit ney
+sag an
+hill side
+mas ons
+sar a
+z one
+x u
+to tes
+rob bie
+app en
+mon tag
+der o
+short film
+charis matic
+tat ors
+ki ba
+and ri
+al arming
+split ting
+ic ar
+th ug
+scari est
+sylve ster
+an an
+u trecht
+a difference
+me ade
+bu ster
+air strikes
+cu ffs
+account ants
+ðŁĺ¡ ðŁĺ¡
+new t
+bo tt
+issu ing
+cl ancy
+wwen etwork
+kyu hyun
+rese mble
+pajam as
+sin k
+kin ney
+sul ph
+or k
+li es
+la gh
+or ton
+ra hul
+d sc
+we will
+re am
+collo qui
+shar ia
+hec tic
+sar casm
+land er
+tm z
+endor f
+ro z
+ham mered
+fri s
+w adi
+pope francis
+he it
+flash light
+un born
+op es
+hol iness
+ðŁIJ ¦
+nach t
+im sa
+gr acing
+bj p
+ver ts
+c sc
+home owner
+a que
+bigo try
+anni e
+bag h
+âĿ¤ï¸ı ðŁĺį
+car i
+thom p
+dispo sable
+cardio logy
+pat ented
+hh hhhh
+ld r
+stephen son
+cro res
+fan ning
+cli mat
+ðŁijį ðŁijįðŁijį
+ðŁijį ðŁı¼
+aer on
+piccad illy
+bank rupt
+sil via
+emplo y
+don ny
+commen ting
+screen writer
+io ta
+ce an
+anc ers
+tu an
+street wear
+ठ¯
+sk ine
+esp a
+asi f
+os ce
+she ppard
+more cam
+bott le
+der s
+orac le
+google play
+aver aged
+edmon ton
+steph an
+sister hood
+cru sted
+stag gering
+methodo logy
+congress woman
+c abo
+tri ggers
+mil ky
+gli de
+tooth paste
+room mates
+nu ff
+gu am
+sprink les
+alternati ve
+wat fordfc
+uof t
+hal ey
+cont acted
+bun dy
+pro stitu
+gh ar
+pre ston
+on site
+hil ar
+g ts
+c att
+hamp stead
+? ?!
+ðŁĩ§ ðŁĩ
+bbc qt
+aless andro
+resi st
+ma idan
+t ko
+shad ing
+pin up
+gal lo
+sin u
+at ec
+fun k
+ac lu
+stri des
+rhy me
+wet land
+bbc springwatch
+t ins
+wild card
+st our
+flamen co
+pau la
+onto logy
+gang sta
+am ade
+ãĤ «
+t bs
+skelet al
+run ner
+jard in
+harri er
+hun ted
+z hen
+believein film
+de mean
+au diti
+re start
+chon dri
+âĿ¤ï¸ı ðŁĴĻ
+mcla ren
+ga b
+sh um
+au sa
+lewi sham
+y pg
+k jv
+fur nished
+dor o
+bon ded
+mor ty
+lat itude
+_ )
+lo va
+water ways
+vin ai
+shor th
+drun k
+c ay
+ay ana
+kap lan
+capp uccino
+spr o
+life boat
+has bro
+spol ice
+tor on
+do ing
+dam n
+sh ree
+foun tains
+ent ation
+mar u
+boar der
+to pless
+j ada
+chan ning
+ul ls
+en closure
+gib son
+fractu red
+brit ton
+Ã ¶
+t ous
+por th
+dra f
+tra iling
+mar gate
+eli fe
+down ward
+lin n
+gla des
+girl power
+ak rish
+u ki
+ron da
+ts c
+appreci ationday
+vis ing
+lo om
+ðŁį ³
+mex ican
+ar gos
+y ya
+jad ine
+south port
+d end
+si sta
+rede em
+men g
+bra xton
+antioxid ant
+s key
+mp g
+fin ding
+vibr ation
+ce u
+kh art
+di mini
+cl ine
+shel ly
+hin es
+ī ï¸ı
+to pical
+no ver
+ma xx
+prim itive
+illustr ate
+b ounds
+tren ton
+join tly
+breed ers
+u chi
+wakeup america
+b ada
+ðŁĹ £ï¸ı
+gu acam
+sp heres
+pere gr
+youth ful
+lo lo
+bir min
+t ly
+jeremy corbyn
+defe cts
+co sm
+a rent
+v aa
+bag els
+medi ac
+cori ander
+ic ago
+g haz
+ab bas
+re model
+struc turing
+pu m
+out law
+ad ani
+r bc
+gul ls
+n li
+confu se
+ðŁijĩ ðŁı¼
+vil a
+mcnam ara
+correc tions
+mug hal
+ser i
+re gain
+ss b
+lea ve
+haha hah
+gran de
+di stressed
+re chargeable
+ho a
+hou sed
+sti l
+attribu ted
+opath ic
+di ps
+pri t
+head phone
+conclu de
+pil o
+he t
+ut sa
+nit in
+je m
+sni ppet
+tutor ing
+op er
+sun k
+en sla
+cha u
+ac orn
+quinte ss
+ran kin
+affili ated
+our lives
+cl int
+se ater
+isa ac
+ba shing
+sme ar
+nur se
+doo dling
+" ;
+sa ku
+atroc ities
+im am
+g fs
+viol ating
+comm end
+brad shaw
+er ville
+b illed
+b be
+thul hu
+i phones
+moo se
+di os
+re w
+me thane
+strang ely
+whis ky
+ti ghtly
+spiel berg
+radi us
+notic ing
+wi f
+ig nati
+i fa
+ap is
+w ali
+ha itian
+bu shes
+y z
+v l
+ex ited
+asse l
+tru ec
+dom en
+ash er
+in king
+newyear seve
+hend ricks
+bat i
+ìĿ´ ì
+rich ter
+mon santo
+con line
+agre at
+ðŁ¤ ¯
+master pieces
+ar n
+rough s
+cle ve
+se v
+fashi ons
+to ya
+sh ail
+cop eland
+aqu ari
+dec als
+are you
+y aya
+a str
+fon t
+ml m
+ar ca
+pp or
+pol lock
+xper ia
+conserv ation
+chain saw
+ag gie
+?! ?!?
+si le
+sh on
+ìĹ IJ
+note books
+marque tte
+de us
+bb led
+spic er
+mc cabe
+nor wich
+modi fication
+boo sted
+stru m
+sales man
+bang le
+nis san
+hez bollah
+brea sts
+a af
+anth us
+sk er
+ow ed
+her os
+gi fs
+fo sters
+eat ers
+du es
+_ /
+lymph oma
+sf am
+me gal
+afri di
+ag ic
+p amp
+jeal ousy
+ðŁijĮ ðŁı¼
+calcul ate
+napp ing
+g ale
+ðŁ¦ Ħ
+lub bock
+assu med
+ren ting
+íĥ ľ
+subur b
+ãĤ ·
+tech nic
+u cla
+in front
+gar net
+ster oids
+stri ving
+ho war
+mo ver
+le ton
+bull do
+is in
+ci ao
+sn z
+fore front
+d ams
+mid wife
+ma wards
+cla pton
+we in
+subsi dies
+spr oud
+rother ham
+phan tom
+ar ach
+spi el
+rac ket
+sel amat
+no on
+l bc
+enti ally
+ðŁĴ ¸
+sil ve
+m oud
+kine tic
+y asi
+ðŁİ ©
+o ol
+mi ku
+i za
+fer a
+flo ren
+barber shop
+groo t
+z est
+ne ars
+stan is
+z and
+police man
+juris dic
+form ations
+appar atus
+sp d
+arti fact
+to sc
+motiv ating
+womanc rush
+re dro
+diagno stics
+ra za
+out fitters
+el xn
+dod gy
+ry n
+sh d
+ortho don
+ol de
+jay anti
+bal ances
+quic kest
+can ton
+friday reads
+! *
+na a
+a ak
+ðŁĶ ·
+behavi ors
+rasp berries
+ä »
+polit ical
+cam il
+å ľ
+di k
+ast ounding
+lie be
+novel ty
+tur moil
+sul ly
+spring break
+hon ouring
+cc g
+ðŁı Ĵ
+my little
+ky c
+pro ms
+ðŁķ Ĭ
+Ã ¨
+bi ge
+av ril
+ðŁĩµðŁĩ °
+mari on
+as ants
+sur ya
+oc tag
+luf than
+ac ron
+fayette ville
+ti que
+love s
+en ca
+de kalb
+ta ver
+de vote
+aux iliary
+joh annes
+tread mill
+ay an
+qu r
+donald son
+cher yl
+" ....
+s ven
+kir sty
+gun ners
+ra dish
+o ahu
+v sky
+i ble
+con course
+b ps
+elo qu
+ash ford
+te bow
+roblo x
+ma da
+dri ving
+th day
+spro ject
+m ms
+band ed
+. !!
+libr arians
+flan nel
+intoler ance
+her al
+ç µ
+neme sis
+list a
+tar ak
+cry pt
+star plus
+vish nu
+sc ale
+cr is
+% ),
+j illian
+regg ae
+pegas us
+ol in
+ip ment
+man ic
+l fc
+godd ard
+ite am
+parl our
+anch ors
+lee minho
+talla hassee
+ant it
+d ho
+kid ney
+y ash
+batt led
+az ad
+gar is
+faul kner
+sni ff
+papar azzi
+ed m
+phy llis
+con tested
+aa ay
+se ca
+k ton
+vel ve
+rain ier
+for um
+tam pab
+ho sp
+trac tors
+ox fordshire
+no tion
+guang zhou
+ðŁĺ ¯
+ref ill
+wednesday motivation
+sli der
+mukher jee
+pr att
+fon taine
+alph on
+af ar
+ts i
+pest icides
+fi ends
+mo cking
+bra w
+tran sat
+do ses
+co res
+hom ophobia
+docu menting
+zlat an
+con doms
+s é
+sun set
+kun st
+ton ga
+ภª
+v ation
+sp ray
+chow der
+ra ps
+palla dium
+nor wood
+music history
+hoo ker
+si si
+osp rey
+ph ys
+conce ded
+bob cat
+ar mad
+ze it
+Ù Ħ
+ðŁĺģ ðŁĺģ
+mer idi
+ðŁĩ· ðŁĩº
+corn wall
+! ),
+touch downs
+ze it
+chal et
+mm m
+al che
+gor illa
+fo ss
+ati ku
+lumin ous
+ivan ka
+be ek
+sta res
+sw iss
+âĿ¤âĿ¤ âĿ¤âĿ¤
+scru bs
+me ath
+gusta v
+jo gging
+confe tti
+as os
+ers fc
+breit bart
+applic able
+autho red
+ya ho
+h in
+displac ement
+j v
+ðŁĮ¹ ðŁĮ¹
+ot c
+non profits
+diec ast
+gu sto
+inte stin
+c ages
+me en
+lu kas
+moon ey
+ðŁĺ ·
+very day
+tor ah
+is sion
+wa c
+lever aging
+ish able
+cu se
+le wood
+may an
+turn table
+ju ice
+tru sty
+tu p
+eti quette
+supervis ors
+stu n
+gu zman
+confe ren
+ric o
+fe ast
+back ward
+pol aris
+mic he
+jo g
+h ing
+field house
+vel ing
+sho cker
+esc ence
+ठ¾
+vi be
+anasta sia
+mar ched
+kill ing
+Ķ ë
+fe tt
+exop lan
+... (
+snow day
+lo h
+ir ani
+la khs
+del a
+po caly
+boom ers
+dictat orship
+ac er
+tur keys
+quarter final
+muskete ers
+ðŁĴĽ ðŁĴļ
+sf x
+museum week
+sc ala
+ri sis
+( ðŁĵ·
+ãĢ Ĥ
+z ies
+bo eh
+hu es
+lu sci
+dol a
+impeach trump
+roo d
+don caster
+tor re
+hero es
+fo yer
+tar i
+blur red
+ke w
+frank ly
+dro id
+ap al
+Ð ¼
+y af
+bre t
+par agu
+cac ao
+ðŁĻĮ ðŁı¾
+ru e
+head aches
+shaw ty
+char ley
+pal er
+go wns
+correc tional
+ðŁĺ© ðŁĺ©
+breaking bad
+ol ing
+da p
+endeav our
+cit adel
+tra d
+incumb ent
+medit ate
+foo ted
+ðŁĴ µ
+shab bat
+dayof the
+wil lem
+gal way
+to red
+marri age
+f illion
+sleeve less
+aud itor
+jin young
+invin cible
+kad una
+a and
+volcan oes
+mon eti
+indie gogo
+buccane ers
+ðŁijī ðŁı½
+ãĢ Ĥ
+lay ton
+cuck oo
+hu mber
+buzz er
+Ï ī
+to re
+stra ins
+sto m
+pa ine
+s we
+du ff
+z ou
+si mi
+li pp
+ur n
+se agu
+ðŁĶ ®
+sun dae
+hi c
+ðŁĺ ¨
+bull pen
+u per
+flyo ver
+al dridge
+glo bes
+ali es
+ken zie
+ge es
+y cle
+sp lin
+mag enta
+j ha
+bal u
+gh orn
+ti pper
+wick er
+taste of
+con clave
+ch ale
+inv asi
+cat er
+dio xide
+me gab
+win n
+at p
+transform ative
+nest led
+hi g
+bri dging
+lil ies
+chee red
+bad dest
+sc rolls
+real is
+dipl o
+ðŁĶ «
+conce ssion
+prefe rences
+explo des
+er gon
+introduc tory
+ine au
+ch af
+som es
+land rover
+spir ation
+sex y
+sco recard
+illustr ates
+soul mate
+wi en
+inter disciplinary
+fore casting
+ent ities
+glu ed
+en lar
+cur t
+percep tions
+boot leg
+mi re
+asho k
+v az
+hor ne
+cal le
+ac ulture
+ther oy
+night time
+oc al
+character design
+ar mist
+ðŁĺı ðŁĺı
+yah oo
+ac eae
+to se
+even to
+sou t
+nay anth
+wh om
+v are
+ri gging
+gen us
+hi ve
+com mands
+sti e
+day a
+ethan ol
+en f
+hi fi
+flu ence
+cle mson
+re invent
+thermom eter
+humor ous
+emer ging
+aci ón
+ðŁĺĺ ðŁĺį
+s ity
+haw ke
+accompan ying
+t ility
+ðŁĺ ª
+re cess
+protag onist
+l ery
+dun dal
+int l
+britt any
+q bs
+off the
+marri ages
+how to
+viol ated
+adel aide
+wit t
+lanc er
+pak v
+hu me
+st ade
+bra gging
+ou tright
+ad c
+super st
+real time
+cu res
+garden ers
+ero ck
+dale jr
+ver o
+bar tol
+mo ti
+mc fly
+v pn
+st ink
+over rated
+guer ra
+e tis
+ath ome
+twd family
+th ab
+tn x
+rafa el
+family travel
+x ley
+sat anic
+equ ations
+ru dy
+wal dorf
+stan i
+tu be
+meas les
+zimmer man
+obli gations
+i ously
+bow ser
+trans former
+sho ppe
+shak en
+gh ouse
+to d
+ke tball
+share holder
+mar ca
+kp mg
+ak an
+given chy
+coast al
+au th
+roller coaster
+mar ches
+coordin ate
+cine ma
+apprentic es
+par lor
+mit o
+men on
+consider able
+bar re
+glo ss
+enh ances
+jaz eera
+fal mouth
+thra sh
+stat en
+k zn
+eng el
+samanth ap
+flo ppy
+sal om
+ðŁıĨ ðŁıĨ
+w ack
+deliber ate
+osc ill
+herit ag
+du sted
+orni thology
+pad dle
+fer ns
+bar un
+cl ans
+anticip ate
+a ay
+mat ically
+é ĩ
+tu mble
+post man
+unic ef
+tro tter
+op d
+leaf let
+ge ist
+cease fire
+scre ws
+cre ation
+wal nuts
+longh orns
+under statement
+ab b
+proxim ity
+na x
+un ity
+turn pike
+orda ined
+dub step
+chak ra
+me ch
+love her
+look alike
+donne in
+vir on
+Ù Ī
+bang ers
+vari ants
+out dated
+in ta
+cri sto
+sp elt
+food and
+f on
+stefan i
+margin al
+hu tton
+ti ara
+tel ford
+qu en
+fair grounds
+que tta
+mikha il
+heal er
+v ball
+ty re
+under grad
+gl end
+hom ers
+scri bed
+main tains
+po che
+mis sal
+mar ko
+u as
+á n
+sh p
+con vey
+pad re
+sab a
+pu glia
+madhu ri
+pa xton
+chap lain
+n ago
+ca si
+... !!!
+fli rt
+sal eh
+k are
+di re
+stam ped
+extre me
+ðŁĺĥ ðŁĺĥ
+ho ppy
+guadalu pe
+advant aged
+eu char
+p low
+un n
+mac qu
+port land
+cla sh
+pe s
+lou bout
+y p
+keep ing
+arca dia
+fran kie
+fi u
+de th
+encyclo pedia
+si ze
+inve sts
+ðŁį ©
+geo logical
+fran ç
+con front
+ðŁĺ ¥
+d ys
+af m
+tex an
+graph ene
+repost app
+ac f
+ur sula
+gaz a
+dd led
+fu m
+wsb tv
+m be
+fron tiers
+chrono graph
+ke s
+inter faith
+tab oo
+spar ta
+won do
+flori st
+em braces
+ca w
+no el
+arch ers
+ðŁIJ ·
+roman o
+ban an
+sh akers
+melo dies
+geo thermal
+se phora
+ìļ °
+оР´
+pro c
+hand shake
+pan de
+popul ated
+slow down
+hor tons
+registr ations
+un deni
+lan ts
+pas sover
+thak ur
+li ef
+adhe sive
+pe tal
+micro scopy
+memph is
+confir ming
+air drop
+mesm er
+perce ived
+ming le
+lifel ine
+gh j
+worcester shire
+pas sions
+ach er
+el lar
+ah o
+firen ze
+bar ang
+letter man
+hat field
+lu cha
+je ter
+e shop
+william s
+horo scope
+pre de
+east bourne
+dur ga
+di version
+al trin
+seis mic
+premi osm
+nar co
+ti r
+ori g
+or m
+land fall
+ci ous
+lin do
+max ine
+x ico
+tra y
+os wald
+c ba
+ric otta
+n cr
+mar au
+ภ²
+gladi ator
+ch ery
+lun g
+u me
+po psic
+lon ging
+can als
+ta ya
+decentr alized
+sho pp
+pres sures
+mahar aj
+eti had
+wal greens
+succe ssion
+sign aling
+li g
+staf fer
+north korea
+def ying
+as ma
+de g
+peri meter
+oak ville
+m sk
+balti more
+rece ip
+de ple
+ðŁĺŃ ðŁĺĤ
+jambo ree
+> .<
+rsp b
+puni sher
+consider ably
+in tothe
+pari sian
+acceler ated
+polye ster
+low es
+fr ying
+sauté ed
+mou ths
+seychel les
+ra x
+go dis
+dak ota
+house wives
+the me
+mat inee
+black bird
+ye sung
+pre fers
+pelle gr
+in ated
+trun ks
+stronger together
+re pet
+re pairing
+ped als
+toler ant
+her r
+dun ne
+indic ation
+decat ur
+b tv
+exhibit ors
+ik on
+friday motivation
+bra gg
+live tweet
+al ves
+womens art
+foreig ners
+wal lets
+min dy
+lan ey
+bb in
+tv miaw
+lif ter
+tar get
+tam e
+dr ou
+astro photography
+mp c
+g pu
+nord strom
+fric tion
+run off
+lov able
+sp nfamily
+ext ingui
+bloo dy
+sch el
+arti stry
+sw ish
+scar ce
+ph ils
+max im
+pos sum
+com promised
+sty li
+sc fc
+is sa
+birmin gham
+sket ched
+angel ica
+ordin ance
+je ts
+conqu er
+ðŁĺ IJ
+online shopping
+s ori
+reason ably
+nue stro
+ar turo
+ch l
+benef ici
+spho to
+wel t
+ni kk
+ðŁ¤ ŀ
+dan ao
+for mid
+as se
+af irst
+âľ Ĥ
+gil lette
+as sor
+an onym
+sel ca
+fe mi
+bear able
+y and
+ar mory
+cre pe
+celtic fc
+bra vo
+in expensive
+de lec
+ge cko
+new market
+snow flakes
+kab ir
+con tra
+can ning
+mor pho
+gar wal
+ðŁĴĥ ðŁı»
+fight ing
+mu tation
+woo dy
+ju gg
+gr aces
+premiosm tvmiaw
+kenne dy
+gu p
+sa e
+op ha
+off spring
+fini sher
+bet ts
+span ning
+mar j
+h one
+sh ing
+contin ents
+samanthap rabhu
+un related
+l acy
+explo sions
+benjam in
+sophi e
+no ting
+micro soft
+as sen
+a hoy
+i ker
+ho fer
+mo e
+ah madi
+yan n
+an ak
+ma hi
+be u
+aha h
+creep er
+baahu bali
+am at
+pri ory
+haw keye
+deloit te
+sko da
+print making
+assemb ling
+mirac ulous
+no ch
+sw o
+leg a
+oper ates
+border lands
+eli e
+stron gh
+rep tiles
+pir ate
+un fold
+Â ¯
+qual comm
+un predictable
+ot r
+rose wood
+direc tional
+counsel ors
+corn ell
+liber ated
+j ad
+ir regular
+bulgar ian
+high ness
+vodaf one
+sw ild
+mini mize
+gra zie
+๠ĩ
+r stats
+stre ep
+ome tric
+humb le
+lu mp
+l ille
+b ü
+home depot
+tripad visor
+ki wan
+a via
+er z
+ex ico
+du f
+blu men
+mi zing
+ar ma
+in im
+con stan
+sor a
+ju al
+au n
+tw ell
+tren ches
+her a
+r k
+po plar
+recipe oftheday
+ll an
+bhu ban
+short ages
+ing don
+bridge water
+ðŁIJ ĺ
+fortn ite
+cam den
+un cture
+pro w
+colon ies
+t ks
+n go
+b hm
+live pd
+spl ace
+sli ke
+happye aster
+ter rence
+revol ver
+j ed
+yy yy
+office of
+m ts
+exist ential
+r ourke
+explore bc
+sse d
+pri est
+vix en
+si ding
+k pa
+a har
+ju ic
+ob struc
+foren sics
+uk mfg
+cancell ation
+we ary
+ab q
+ele c
+pri zed
+deb ts
+me zz
+salv atore
+m dc
+gre tte
+c gc
+th on
+snow storm
+ts ch
+cook ery
+å ¹
+wa xing
+n acional
+mur s
+ra ve
+cap es
+ger main
+dri pping
+sub mitting
+ome lette
+iter ation
+aj es
+shim mer
+fu eling
+ðŁĩ§ ðŁĩª
+li po
+bo bble
+un follow
+islam ist
+hi ber
+cat s
+agentsof shield
+sen si
+____ _
+ster ia
+inst al
+ausp icious
+har row
+over land
+femini sts
+inst ant
+char iot
+blind ness
+sp ed
+sc arec
+nu it
+mini atures
+ho seok
+glo ck
+fifa worldcup
+e te
+dis m
+we iner
+ex foli
+ear ts
+ภĶ
+my art
+man il
+iss ant
+form a
+in cu
+buffal ob
+in tim
+mc cul
+anj ali
+po po
+un doub
+hil a
+fun gal
+thank ful
+fu tur
+en dish
+ren ds
+th ar
+she ff
+ring o
+nichol ls
+io wa
+po tom
+cl ams
+ãģ Ħ
+acon f
+stadi ums
+di mp
+di k
+residen ces
+do v
+caric ature
+seagu ll
+kl m
+confe ss
+sla pped
+cele b
+turb ines
+pp v
+nur ture
+el ab
+.... .#
+tu ff
+de press
+al far
+amii bo
+di spon
+e wing
+que er
+friend s
+for re
+âĺ ¼
+sw t
+aqu arius
+head liner
+cur d
+fi gs
+o tters
+love fl
+kare em
+go vegan
+fri yay
+consol ation
+at ri
+ì§ Ħ
+âĺĿ ï¸ı
+poly ne
+gu ed
+o ya
+la us
+intestin al
+cam illa
+scal p
+pi r
+leed s
+horri fying
+bore tum
+dand elion
+fer rer
+ell ic
+as x
+so ren
+re loaded
+ale ague
+navig ator
+ine tte
+add ams
+al chemist
+ak shay
+dystop ian
+awe c
+n aya
+al isa
+ai led
+ag or
+avi ator
+ali zer
+smo bile
+findyour park
+cop ying
+to ddy
+sh ti
+mon ger
+cal houn
+nap kin
+break up
+y atra
+se thu
+ric hi
+eras mus
+fer ry
+am ore
+prac tise
+bo bo
+power point
+oo se
+li ffe
+chin a
+sh ka
+fad navis
+du ane
+war on
+fal se
+ðŁļ Ĥ
+wa shes
+disc ip
+==== ====
+g k
+ab b
+stub born
+medi eval
+p ci
+ðŁį ª
+maril yn
+h yo
+man di
+cr i
+prede cess
+continu ation
+om usic
+s lat
+wh al
+mall ory
+bon n
+shen zhen
+ca i
+âĺ ĥ
+sa fest
+for wards
+dra wers
+bla sted
+sle e
+mor phe
+mb ta
+dumb ass
+ÑĦоÑĤ о
+alhamdulil lah
+ec lub
+al beit
+heal ey
+ayurve da
+adverti sed
+cro cs
+itt les
+bry son
+be i
+nj pw
+honore e
+fu sed
+ðŁĶ ĺ
+mul tin
+n aga
+de parts
+ko p
+kin o
+jhar khand
+ed na
+ax le
+mil ton
+supremac ist
+marrake ch
+domin ic
+tran script
+] [#
+: ).
+wo c
+sur rounds
+o gil
+leaf lets
+co well
+whe w
+tru de
+proli fer
+succe s
+sports man
+con dom
+po che
+k up
+imprison ment
+{ }
+scram bled
+å Ľ
+ka ine
+cell phone
+metam or
+con i
+remn ants
+ee z
+down pour
+afterno on
+exerc ising
+ber ser
+architec ture
+wick low
+m ns
+is p
+bo c
+n iss
+mn wild
+stu mble
+r si
+lu ffy
+sil en
+dd ad
+bul lies
+haw ker
+bb cc
+scu ba
+e pp
+que ts
+for aging
+pal let
+ha di
+cinemato grapher
+cat chers
+to aster
+k hi
+lite coin
+kid lit
+amher st
+maur icio
+ip ad
+mar malade
+fe y
+don nelly
+g to
+est as
+cere bral
+ant grasso
+zz led
+vir gil
+swa pped
+ðŁĺħ ðŁĺħ
+no dapl
+greate st
+nhl bruins
+fra ser
+b mo
+ane w
+. âĿ¤ï¸ı
+se gregation
+remark ably
+mccor mick
+lo gger
+er as
+contrac ting
+âłĢ âłĢ
+yor ks
+uku lele
+touch screen
+de cked
+ben n
+south wark
+ra vin
+nu mis
+ðŁ¤ Ļ
+ru t
+gre co
+eth ic
+red neck
+ar r
+t cs
+ih ri
+ðŁĩ« ðŁĩ·
+l k
+inher ited
+zy k
+viadu ct
+marty red
+hi gu
+ss n
+be in
+street style
+fer gie
+bank of
+æĹ ¥
+stake holder
+exempl ary
+cre ss
+ess a
+ero tica
+intre pid
+gom es
+bra un
+bethan y
+bang tan
+pulmon ary
+m illing
+doctor ate
+trump russia
+ठ°
+s ani
+bl att
+pla u
+depri ved
+t le
+ful ly
+bour n
+st ak
+lufthan sa
+kio sk
+far oo
+def y
+bad an
+ðŁĺĺ âĿ¤ï¸ı
+rit z
+tri sha
+ran ds
+middle sex
+arab s
+pro j
+sport scenter
+repe ats
+iv f
+bleed blue
+as sure
+o bs
+territ orial
+ele n
+bever ley
+ann ah
+âĿ¤ï¸ıâĿ¤ï¸ı âĿ¤ï¸ıâĿ¤ï¸ı
+z l
+for good
+science fiction
+gla u
+son ya
+pri th
+st weets
+mix ers
+mari o
+ant elope
+writing community
+went z
+den ham
+be di
+sf o
+harley davidson
+look book
+immuno therapy
+or phe
+es ville
+ed ged
+tas k
+sb ball
+corro sion
+kilom eters
+co sting
+play back
+ke ke
+di visi
+u ter
+re location
+yel led
+pen g
+up beat
+ser ve
+âļ ł
+hal en
+stir ring
+reh man
+en v
+schu macher
+frag ment
+alkal ine
+sb k
+resil i
+share point
+rol lover
+tra sh
+counter part
+âĻ «
+ob itu
+à ½
+ãĤ ¹
+mul berry
+ðŁİ Ĩ
+auton omy
+spra ying
+nat l
+love you
+fran ki
+nu k
+esc ar
+can teen
+ali baba
+de plor
+mole cule
+pu d
+fort night
+blon die
+sp hin
+portra yal
+ta che
+bu te
+consi sting
+freep alestine
+c sp
+im mort
+d ns
+ðŁĴ¥ ðŁĴ¥
+tour de
+coo king
+archi val
+ga thers
+bit t
+b anc
+pre mature
+snow ball
+poetry day
+lou dly
+fug itive
+ed ay
+em ra
+ðŁĩ¸ ðŁĩª
+sci en
+node js
+jur gen
+je ong
+band ana
+un is
+fox sports
+v andy
+pro visions
+wee p
+tu k
+i ko
+h oun
+zig gy
+z r
+fil let
+bat a
+tin k
+con e
+we want
+k ilo
+hor ace
+sl t
+sc t
+stay tuned
+victor ia
+umb ria
+att acker
+ingham shire
+fright ening
+no ir
+fr at
+con tempt
+lia ison
+ho i
+br ink
+tr ill
+ni agar
+kick ass
+dun das
+not my
+rho de
+bu mble
+no xi
+fa g
+spec tators
+mancrush monday
+jin ping
+distr act
+dais y
+wal den
+portra it
+ar thistory
+vol tron
+ev el
+is c
+ac m
+r ite
+na o
+de ported
+swe ats
+ru fus
+lo bo
+labor day
+gam o
+ihri thik
+bl it
+abdomin al
+ãħ¤ãħ¤ ãħ¤ãħ¤
+i it
+e q
+bu sy
+allu arjun
+un disclosed
+de ton
+pro create
+ki l
+ðŁİĤ ðŁİĤ
+mitch ell
+ki i
+inherit ance
+al p
+jo burg
+pat rolling
+compul sory
+un signed
+ni am
+l ga
+eshop suk
+tr illi
+ma w
+appreci ating
+rock ab
+mañ ana
+an tal
+mal vern
+roy o
+grand prix
+sut ton
+go ftheday
+dig i
+ãħĭãħĭ ãħĭãħĭ
+t les
+varan asi
+erec ted
+discip les
+cont act
+ðŁĺ µ
+li d
+⬠ĩ
+scen tre
+radi ator
+ing tips
+trans itions
+thursday motivation
+chem ical
+separ ati
+sal is
+mi m
+geo graphical
+book fest
+/ .
+âľ ĭ
+v ae
+cur rie
+ag garwal
+acceler ation
+the ses
+lg m
+u mass
+pro portions
+nat a
+ani ans
+ku ch
+be acons
+ap r
+@ #
+ðŁĴª ðŁı¾
+nu ke
+sher aton
+ki o
+ma kati
+polit ico
+mor ale
+ì Ļ
+econom ically
+gg ly
+ss en
+pa stries
+intern ships
+vic ente
+fanta ken
+aveng ers
+accu se
+slee pover
+indic ated
+the dream
+ster one
+ren ders
+fro st
+ou i
+gre gg
+d ore
+⾨ ⾨⾨
+pu gs
+sat y
+nu mb
+hems worth
+tam i
+la ssic
+schi ff
+igle sias
+ag awa
+] "
+re shi
+game stop
+divor ced
+theat er
+clau di
+un conventional
+prophe ts
+ac in
+twel f
+tow ering
+t ml
+sc lerosis
+k wan
+ge ts
+distur b
+na ira
+ener g
+pir acy
+pru itt
+noti fied
+hen na
+bra m
+ground water
+bl s
+opti mis
+$ )
+luci e
+biz hour
+fang irling
+gr ills
+or l
+ver se
+c ina
+law less
+artistson twitter
+tele vised
+marshmal lows
+radio head
+bar r
+m fc
+bre vi
+mmor pg
+g aya
+âĸ «
+sub titles
+j t
+disney land
+to bago
+nh m
+groo ve
+fi awec
+" /
+ba o
+scra bble
+om ni
+ff l
+um c
+si mba
+ali er
+ter rell
+plu me
+mi di
+dig nit
+co c
+bru t
+ad ata
+alche my
+d sm
+ðŁĺĨ ðŁĺĨ
+win try
+spa res
+cu er
+conclu sions
+to ys
+od or
+fl ann
+gar vey
+scrip tions
+inspec tions
+cat ap
+ang lo
+st louis
+heim er
+at ay
+tr ich
+en yc
+chil ds
+vent il
+mont p
+guiller mo
+circu lare
+z ell
+mode led
+craf tsman
+al ina
+stimul ation
+cashe w
+ju das
+best of
+to ire
+susp ends
+scol lege
+real ising
+by tes
+bloo ds
+as si
+ðŁĴ ¿
+o hs
+ðŁį ĭ
+scallo p
+ठµ
+gi fting
+camo gie
+wil kes
+o zzy
+ðŁ¤ ¤
+ver onic
+sav oy
+deme tri
+baby girl
+ðŁĺį ðŁĺŃ
+so x
+cly de
+induc tee
+count down
+self care
+ठľ
+vi ka
+tor re
+phd chat
+pe ars
+aw h
+suff rage
+le sn
+admir ation
+mp p
+shark week
+schul z
+santor ini
+clo ver
+( *
+stras bourg
+ex iting
+so yu
+finger print
+che a
+ãĢ ľ
+vin dic
+song writers
+so a
+prou der
+nam a
+= ))
+simple st
+delici ously
+gil les
+u q
+mn wx
+ep p
+sh un
+ken nel
+fall on
+ðŁIJ £
+sin d
+tra gically
+out es
+modern ism
+co ke
+gy n
+spi on
+âĺ¹ ï¸ı
+le am
+compress or
+apolog ise
+twent yon
+fan atics
+âĻ »
+sco tsman
+sa wa
+ko u
+as er
+ภļ
+welter weight
+phen om
+twick enham
+stri a
+p out
+ka z
+gi am
+cd p
+ho y
+emplo y
+red mond
+ภĦà¸
+sm ere
+trance family
+proto cols
+pie ce
+lu iz
+iter acy
+carl s
+united states
+har med
+phd life
+ch aw
+foot prints
+l é
+cho ker
+z ana
+sli pper
+eric sson
+insul ting
+articho ke
+advis ing
+acquis itions
+op or
+mut ations
+re ar
+ॠģ
+pod cast
+wi ther
+kun g
+íĺ ¸
+win slow
+di apers
+ðŁĵ¸ @
+ec ker
+col lar
+hu ey
+gi ro
+mono gram
+kas ich
+si veness
+malay si
+arom atic
+gre s
+gali leo
+u ji
+rob b
+dr m
+none theless
+as a
+: >
+lo a
+l np
+at work
+ag t
+laksh mi
+pipel ines
+id al
+stre l
+re all
+chain z
+stone wall
+san sk
+ðŁı ´
+pied mont
+hoste ss
+ci u
+t é
+analy ses
+wil helm
+scott y
+rw by
+mosqu it
+use mb
+qu ins
+ðŁij İ
+tu cker
+s conf
+speci fications
+psychi atry
+broo kes
+s ils
+ol af
+de to
+co di
+cli p
+fil th
+womancrush wednesday
+go to
+ang erous
+be ale
+w tc
+paneli st
+ne x
+lar sen
+emili o
+tab leau
+h itters
+conce ived
+americ ani
+or tega
+mar di
+Ñ ĥ
+pain tball
+thir sty
+new yorker
+etis ation
+go ss
+we aker
+u gh
+tro ll
+har ga
+du al
+ght ning
+at ine
+ðŁĺİ ðŁĺİðŁĺİ
+cook out
+pyrene es
+po ss
+authent ication
+sports wear
+yun ho
+kir o
+archi pel
+shen ko
+ren der
+nov ation
+divin ity
+ðŁij £
+su fi
+humb ling
+ge opol
+devote es
+wait ress
+tr ough
+py ro
+i ba
+bl ing
+gra f
+epilo ts
+bt r
+of tball
+bas king
+domin os
+so om
+r ath
+sher yl
+qu el
+astronom ical
+wel d
+track list
+sig nee
+slee pless
+com man
+ch ron
+summ on
+pure michigan
+cri spr
+sli p
+la gi
+ra q
+um u
+thal ap
+char med
+scru mp
+quad copter
+ski p
+peter sen
+mun i
+ðŁĮ ¾
+mon aghan
+tra ys
+ick ed
+canad aday
+te gr
+ï¿ ½
+hot ness
+heavy metal
+ab ar
+gop debate
+az ul
+spider man
+sun flowers
+ľ ë
+web comics
+bar d
+Ð ²
+nichol as
+slu sh
+ram an
+mark ham
+ffici al
+ff ler
+íĬ ¸
+ple ss
+anush ka
+to to
+sk aters
+pro wrestling
+compet es
+ay ala
+myster y
+thr ills
+mp g
+independ ently
+y ul
+imper ative
+formid able
+tire less
+st acking
+ton gues
+mal tese
+pot ts
+mat ti
+char ting
+chill out
+super nova
+ome o
+sky sports
+nu tty
+ðŁĹĵ ï¸ı
+ro han
+insp ired
+concier ge
+ser ra
+ma kk
+gal at
+chi pp
+ye v
+ì £
+reim bur
+op ul
+kimber ley
+i eee
+bre men
+ch itec
+or in
+nak u
+bon kers
+foo ty
+emer gence
+ðŁĨ ĺ
+sti p
+serge i
+zo ey
+ai me
+wou ld
+dy es
+destin y
+vinai grette
+dri er
+circulare conomy
+an archi
+ss r
+sch el
+cin er
+gro om
+determin ing
+gar min
+cal ais
+incarcer ation
+bu kit
+no i
+chelms ford
+mckin ley
+chi pped
+belong ed
+tu mors
+str oud
+mi i
+influen za
+wwen xt
+tun dra
+tele communications
+cat sofinstagram
+t ages
+beat ty
+o du
+ml kday
+oo per
+dang le
+ak ley
+cru mb
+anti gua
+ti mbers
+rou hani
+ðŁĴª ðŁĴªðŁĴª
+ha fi
+... !!
+w cs
+coo p
+sn c
+lit res
+ãĢ Ĭ
+ha z
+co z
+k ant
+green field
+cur ti
+y ale
+flye agles
+what soever
+wor thing
+rou lette
+flyeagles fly
+un da
+a inted
+stand ing
+lusci ous
+h pc
+effic acy
+ash land
+me ghan
+ky wx
+n pr
+bath tub
+ac os
+h ani
+mar cor
+man tis
+da isi
+bo ba
+ab bie
+mu til
+vi al
+spy der
+po z
+g ti
+el fie
+nigh tw
+metro id
+anton i
+mad die
+dh ry
+dar lings
+ten ds
+taek wondo
+atlan ta
+me ow
+chlo e
+ãĥ İ
+ym es
+siber ia
+k con
+gu es
+mar iner
+fac il
+azz le
+[ ...
+han nover
+bav aria
+vir go
+te uk
+u sps
+) #
+wall a
+sam pson
+need less
+ver bally
+hay ley
+bow led
+pi us
+lam pard
+ham string
+vol vo
+road safety
+cho king
+sor bet
+a hem
+healthy food
+brai ded
+horticul ture
+cr ative
+che ek
+ad do
+the force
+ko ko
+schiz oph
+j ie
+w ada
+twentyon epilots
+h bcu
+pro ton
+pau ls
+lou isa
+lat am
+kyr gy
+com pac
+sd k
+sap i
+?? ?
+liber alism
+ep silon
+ai den
+w usa
+spra yed
+baske tball
+kim ono
+blue wave
+ali as
+ë§ Ī
+mug shot
+ce c
+do gre
+ad ora
+ðŁĵ· @
+kra kow
+intrigu ed
+exhau sting
+astron omer
+ven ison
+lady bug
+ci v
+bra e
+us m
+bri be
+acup uncture
+pembro ke
+ke ating
+chi e
+y ad
+t si
+sm i
+see ding
+gate shead
+lis boa
+gy p
+canv ass
+ðŁĶ´ âļªï¸ı
+op i
+ni r
+soci etal
+ly te
+ati es
+c sm
+ar tery
+al in
+aka poor
+abstr acts
+â̦ â̦
+teen wolf
+ne we
+travel gram
+sentim ental
+per ched
+han del
+ho ek
+f ay
+coordin ating
+anim ate
+man ian
+effor t
+jer ky
+f ck
+adri enne
+ma bly
+tra ding
+my el
+spi ro
+sol a
+stor ing
+over drive
+monday morning
+dream team
+pul se
+bon di
+ber nie
+pgat our
+tri poli
+son am
+plat t
+âļ ¡
+ag roup
+îIJ Ĵ
+inv ading
+v cu
+k ell
+ñ os
+un dead
+pod casting
+mercede sam
+mana fort
+cor tex
+que so
+impecc able
+pal mer
+wil doz
+sport sc
+guacam ole
+dispen ser
+cate gori
+stun ts
+per il
+invit ations
+dune din
+xi e
+achi eves
+saf er
+pre ds
+ph an
+knuck les
+k ak
+igno res
+lovemy job
+aru ba
+ound ation
+datac enter
+co vert
+gr ing
+cou ple
+ا ر
+vol i
+mc cle
+arti sans
+lu do
+kal am
+arom a
+under taker
+hu la
+wiz kid
+gu mb
+god frey
+bakers field
+ker n
+engine er
+car ve
+pal in
+guaran tees
+pe bbles
+b ays
+zi eg
+fin k
+â¬ĩï¸ı â¬ĩï¸ı
+down pours
+ro chelle
+rasp berry
+ðŁĺ ®
+gra phies
+stom p
+caf es
+ari zed
+utt ar
+cal vary
+dri e
+crusad er
+bus an
+tux edo
+si u
+seam us
+cul tured
+blan chard
+town house
+ge red
+butter milk
+flu ctu
+roger federer
+hel i
+ðŁ¦ ĥ
+u ous
+ram esh
+mu ppets
+email marketing
+ye ss
+br ice
+ri zio
+pel o
+donnein arte
+u rable
+inve stin
+bump ing
+raji v
+sav a
+thro wer
+fore x
+o hhhh
+th rust
+pull man
+r fid
+sep sis
+le ed
+fri ght
+roun ding
+ne b
+ph ins
+ai sha
+utili zing
+squ ats
+gold smith
+j ic
+bo ks
+vau s
+i po
+exclu sion
+tari ff
+po kes
+min al
+land s
+en force
+washington dc
+or char
+g x
+mar ys
+ey our
+aussi e
+bak ers
+un popular
+latin os
+lar ge
+pu tnam
+bol o
+wa de
+pel o
+di zz
+ob struction
+fla ppy
+weare the
+depend ence
+pajam a
+e te
+y ann
+e wan
+disc la
+a ay
+kar ina
+e ic
+an trim
+w soc
+neg atively
+kai do
+fotogra fia
+dh ru
+colo ssal
+mcle od
+k wang
+mani pu
+ex hilar
+us atoday
+summer slam
+co les
+tapro om
+unbeat able
+de ma
+tic ks
+k ling
+fil s
+campaig ners
+ภķ
+brew ster
+audu bon
+qu ay
+ch s
+ki gali
+d ler
+strength ens
+som al
+sign ingday
+gol ds
+pig ment
+orche stral
+g q
+lin kin
+ðŁı ĩ
+ta w
+algar ve
+ho v
+ear le
+gold fish
+am ig
+ex er
+ben in
+dru id
+ðŁIJ ¸
+she m
+quat tro
+mer cen
+men te
+incorpor ating
+bon anza
+state fair
+en de
+concep tions
+e es
+âĻ¥ï¸ı âĻ¥ï¸ı
+d son
+fire arm
+orb ital
+we h
+multi p
+fo b
+requi em
+p light
+thou se
+sa id
+oc re
+remem brance
+n old
+chi pping
+be v
+er t
+ca thy
+sy m
+ri ggs
+m ley
+dialo gues
+sl ender
+how l
+gau teng
+wd w
+to bi
+smo kes
+im plo
+b pm
+ad n
+mom basa
+cap sul
+bloom field
+artic ul
+cle o
+goog led
+flu ffy
+l ard
+en zyme
+ve sti
+ibra hi
+fl ame
+e mea
+out ages
+dispro por
+ble ak
+an sel
+ick er
+st louis
+stock market
+good friday
+sau lt
+stal led
+pro m
+ep som
+b é
+the se
+sau ces
+me w
+lit fest
+pre d
+re u
+kar ak
+si enna
+ell in
+bio technology
+ï¸ıâĥ£ -
+tac tic
+sa in
+por k
+mon za
+ka j
+lu sh
+compart ment
+chang ing
+shraddha kapoor
+fo al
+ar tem
+cu ando
+can ola
+ori ente
+me sse
+d ited
+br c
+box er
+bbc two
+s st
+ment day
+em ing
+de wey
+kof i
+âŀĸâŀĸ âŀĸâŀĸ
+reali zation
+smo l
+tw ood
+san je
+flag staff
+ber wick
+cor set
+can ary
+whistle blower
+et ched
+com posing
+squee zed
+bow er
+auto desk
+ne h
+mathi eu
+ba ja
+Å Ĥ
+hy dra
+da im
+am eri
+insi sted
+mer lot
+gar ros
+heart news
+gaine sville
+cut ler
+bo de
+ðŁĺī ðŁĺī
+lew es
+scoun try
+g sa
+us u
+cc m
+god awgs
+phara oh
+cra e
+mor ley
+hyp noti
+f ades
+neur ons
+fu zz
+ing co
+high landers
+star k
+vig ne
+pac kets
+amar illo
+reu ben
+insul ts
+bas ic
+vec tor
+n me
+ac ruz
+tro s
+transm itter
+ðŁĺ ŀ
+interpre t
+ðŁĺ ²
+pre quel
+mc gowan
+dis semin
+ðŁĴĺ ðŁĴĺ
+mascul inity
+indie gamedev
+ali ve
+te t
+pe tal
+ema iled
+ar med
+ko o
+he er
+ba ird
+super junior
+metro polis
+delav in
+decl ines
+stit utes
+Û ģ
+p tbo
+g lan
+cho res
+e aling
+chri ssy
+ste mc
+vi an
+assassin ated
+pron ounce
+illeg als
+discover y
+cav ill
+fri fotos
+f al
+so i
+sabot age
+t int
+p dc
+ðŁİīðŁİ Ī
+ãĤ Ĭãģ
+ji o
+endeav or
+in sig
+commit tees
+she arer
+me tz
+mar rying
+h dd
+g by
+fre t
+tri sh
+pu l
+scrip ted
+sa ki
+l w
+ke ye
+shim i
+nan aimo
+ca h
+Ã «
+tem pered
+ici an
+du gg
+dish washer
+air field
+s rugby
+gr inch
+y st
+r ms
+mahat ma
+lan kan
+disc ar
+dige stion
+no des
+l ls
+om ic
+gu tter
+tis garh
+feder ico
+election day
+bo he
+master card
+fire ball
+âľ Ķï¸ı
+oy ster
+p ong
+do k
+en route
+m vc
+beat the
+ali stair
+shu b
+sh aming
+cherno byl
+ghi bli
+the s
+pin ion
+d bs
+sal ts
+ic tion
+epi ph
+nc pol
+in convenience
+whit ley
+inspec ting
+wood ley
+wi ener
+skil let
+no les
+m ca
+h ina
+a sha
+willing ness
+well ness
+tam ed
+show time
+dis advantaged
+ber nat
+us n
+mission aries
+coun selling
+arrog ant
+quant itative
+leg alization
+ho dge
+energye fficiency
+cameron dallas
+pos sessions
+p bb
+harris burg
+v g
+hindu ism
+happy thanksgiving
+fi b
+re acting
+tweeta picture
+pol iti
+mu ppet
+hur rah
+pac e
+coast guard
+guar ded
+as am
+par ry
+fore very
+x q
+oom f
+ke anu
+j ind
+ri st
+customer service
+sac red
+ðŁĺ º
+ton er
+occur rence
+mat u
+val dez
+red d
+is ak
+power rangers
+pe asant
+raj ini
+abra ham
+e mil
+car do
+tr il
+hair styles
+obsole te
+sam pler
+direc tive
+delavin kisses
+ver ton
+glo s
+sp ay
+paler mo
+com ets
+man ziel
+chicag of
+ski pped
+pic torial
+h ant
+b mi
+a ol
+re opens
+pad dling
+devo s
+fra ud
+bas eline
+que ues
+sp ired
+sn are
+eu ve
+descri ptions
+daisi es
+ca ching
+gall eria
+tri mmed
+stin o
+recy cla
+ic ular
+bir ken
+raw lings
+fli x
+chic as
+b gt
+lik eli
+argy ll
+thel ove
+ga ston
+bl anca
+ha k
+f one
+sailor moon
+h aci
+ima c
+fl yn
+de can
+bel les
+ap ic
+zo g
+taun ton
+con stance
+lasag na
+ker nel
+in ka
+har bor
+collec tively
+calcul ated
+av ille
+shil pa
+pur du
+gi mm
+fun er
+a est
+pembroke shire
+nighting ale
+n unes
+hyper tension
+hu bert
+sli ders
+infer tility
+comm ended
+transat lantic
+metr ical
+!! @
+Å Ł
+ss g
+bac ca
+inver ted
+fun factfriday
+it ans
+albu m
+acqu ainted
+ri er
+whel an
+sar ab
+mu e
+snoo ze
+pi ff
+agre eing
+sp itting
+jer maine
+n ye
+âľı ï¸ı
+am bush
+ze ph
+con greg
+univers ity
+s app
+wann abe
+pat rice
+ib d
+do glo
+fri dges
+sun d
+king ston
+ar gon
+kam en
+hardro ck
+ds ley
+do lores
+ì °
+ota ku
+pi ping
+be having
+âŃIJï¸ıâŃIJï¸ı âŃIJï¸ı
+blue bird
+an sari
+teapo t
+fire work
+cro p
+log ans
+ty ped
+thick ness
+ig ers
+c fp
+dys functional
+contra sting
+et ty
+aston martin
+tx st
+dra grace
+at tributes
+marath on
+manu scripts
+john stone
+ðŁĺ± ðŁĺ±
+bo er
+ay u
+aru gula
+poo rest
+con du
+assu mption
+anag h
+no h
+delav in
+sit ter
+g ö
+mor ow
+kick start
+com i
+gl acial
+ghe ad
+ba in
+ker shaw
+en dof
+fre ud
+om at
+i af
+hu g
+sign up
+each other
+defin ite
+tu bing
+shak ira
+ðŁijı ðŁı½
+uu uu
+sw in
+sham bles
+ol as
+sk ell
+brit ain
+kn w
+clu tter
+om y
+j ens
+hang ed
+city scape
+scra ps
+un locking
+dead liest
+er no
+breast cancer
+a it
+inspec t
+fu ri
+ðŁĴ Į
+ku d
+ju le
+or ah
+mi ds
+m dt
+bur gring
+r attle
+pu sa
+stal k
+cle ans
+iss ance
+z ek
+worth it
+nam eis
+musko ka
+council man
+urban art
+bar rac
+un solved
+tu l
+g ita
+white board
+soy beans
+em ent
+cont i
+saturday motivation
+conveni ently
+doc king
+t ado
+âı ©
+sp ino
+puppy love
+po f
+fabric ated
+robb ers
+adop ts
+ti fied
+kk r
+indulg ence
+notic eable
+macqu arie
+chap el
+sensu al
+ki ko
+melan oma
+lore tta
+li ance
+ab en
+sp lus
+ga al
+ac ele
+lib dems
+compar isons
+ðŁĮ µ
+rhy thms
+mer y
+en capsul
+nap ier
+ðŁijĮ ðŁijĮðŁijĮ
+ðŁij IJ
+plat z
+fre sno
+re formed
+ran bir
+el it
+the best
+bhu shan
+vin nie
+impro vised
+s ittin
+re created
+e ba
+ec ker
+ac rob
+pon te
+cor d
+gi ddy
+eur usd
+fe ver
+intu ition
+gar i
+dum mies
+bud weiser
+amend ments
+te tra
+sch nit
+ay as
+mar ys
+ci st
+k ani
+ker mit
+ðŁĺ±ðŁĺ± ðŁĺ±
+tin ker
+strol ling
+di visional
+niger i
+omin ous
+menstru al
+kar ab
+k hy
+bw fc
+pan handle
+l illi
+well er
+stra pped
+son the
+transfer ring
+ethe real
+sne aks
+ru dol
+gab les
+jac king
+cin code
+for tune
+canadi ens
+con for
+ab normal
+frank lin
+tit a
+mu la
+persi st
+cu ties
+ki el
+ðŁĩ± ðŁĩ
+her mann
+aw k
+fi asco
+ko to
+we ta
+hi ker
+budd y
+preven tive
+mcgra w
+game boy
+forsy th
+top shop
+si ob
+sad h
+in tram
+follow art
+so aps
+dragon ball
+ou x
+morri son
+๠ĥ
+lu bric
+adul thood
+morri sons
+âļ łï¸ı
+her mo
+ta ka
+stall one
+mis use
+team gb
+ra gha
+con fined
+at y
+hom ophobic
+nw o
+sky news
+ho ya
+ac rosse
+wi iu
+pur ée
+jed dah
+ðŁ¤ §
+advis ers
+ph ine
+an is
+scrump tious
+ë° ķ
+c ke
+vin y
+ter m
+s dc
+o do
+home school
+vas c
+leop ards
+debor ah
+illic it
+cur ran
+as roma
+nau ght
+mar ig
+brand i
+em p
+ðŁĺį ðŁijĮ
+î Į
+su spend
+lu z
+initi ation
+sch aft
+jensen ackles
+craw ler
+post doc
+des ks
+trail blazer
+den omin
+tri x
+no ise
+po et
+± ï¸ı
+s mug
+vol atile
+proof s
+pharmac ist
+sardin ia
+mash able
+kim chi
+co ed
+schal ke
+doo dled
+c sw
+sh ur
+ro x
+do k
+chris brown
+mathemat ician
+ab ound
+ang elic
+rock ford
+d ole
+yor kers
+ms n
+g man
+xavi er
+bor rowing
+mark ings
+longh orn
+k ja
+diver ted
+mm it
+euph oria
+ay yy
+te a
+pa h
+ck i
+un cut
+li ven
+ky ung
+fan art
+mer ing
+red ding
+amo vie
+gri di
+c thulhu
+schol arly
+ju dah
+th bewithyou
+eu calyp
+ðŁIJ ķ
+hert fordshire
+cour troom
+by u
+auc tioned
+ple ase
+mar cia
+ê° ĵ
+succe eded
+el as
+arvin d
+t lot
+saig on
+re tt
+ra kesh
+fd ny
+as en
+se bring
+gladi ators
+you know
+v lad
+gol a
+par ap
+ÑĢ Ð¸
+sab cnews
+one team
+oh l
+sun e
+ri j
+cd c
+star gate
+run down
+plat o
+ph c
+chat ter
+ra viol
+mn f
+mand ala
+li et
+ภķ
+mari a
+hun gover
+consoli dation
+fer rell
+tradition al
+ilove art
+gal ap
+ðŁı Į
+que zon
+espa ña
+ðŁĩ¨ðŁĩ Ń
+ho bby
+steam boat
+mali gn
+guil lau
+pro hi
+its me
+íĥ Ģ
+in scription
+al z
+mari an
+k ade
+mm on
+adju sting
+ne sts
+intern ally
+ci r
+vik ram
+mal ala
+k ph
+fel icia
+the real
+cap tivity
+at is
+marcor ubio
+kale ido
+che v
+mano j
+le more
+gent ri
+vi ps
+tro pe
+" âĢĶ
+pair ings
+mal nutrition
+fr ay
+desig nation
+brun omars
+az e
+tor rential
+pan zer
+ga il
+under the
+the ological
+schizoph re
+dazz le
+freder ic
+mo par
+ad illa
+so ggy
+ra un
+medi ocre
+colo rec
+i fe
+p inst
+blu ef
+Â ²
+world water
+gir oud
+clar inet
+ad olf
+tar antino
+receip ts
+assu mp
+ðŁij Ł
+coffe es
+âľĬ ðŁı¾
+du plex
+s of
+r x
+lin o
+timber wolves
+pan dit
+mo tm
+e ga
+ay ama
+ach s
+outsi der
+ll en
+co er
+til ly
+cheese burger
+ma ds
+ple dis
+emp ty
+national parks
+az iz
+p mi
+jun kies
+f ener
+sq n
+è s
+gener ation
+cleop atra
+bhuban es
+mosqu es
+ty free
+popp ins
+tw c
+or well
+n age
+ka whi
+hol low
+dal ai
+¨¨ ¨¨
+ou ro
+m health
+gi on
+az o
+vis as
+reneg ade
+re ic
+w sop
+ðŁĴļ ðŁĴĽ
+e chel
+tox icity
+mü n
+bun k
+stimul ating
+asth our
+\ '
+ep h
+ende mic
+cn bc
+shrin king
+peabo dy
+michel angelo
+can yon
+wal e
+su mi
+si ders
+inu it
+? .
+profession alism
+dr acing
+plat oon
+p ons
+out bound
+maple leafs
+de sol
+cen cy
+a than
+ver ma
+ru bbing
+ok an
+ðŁij ł
+mull ins
+authent ic
+Å į
+alman ac
+ga ia
+bb q
+on imo
+ke h
+ty a
+tou ts
+y av
+re posit
+, .
+wi ght
+se eyou
+cal lof
+done sia
+bar gaining
+gr anth
+sd su
+amphi theater
+p su
+re watching
+wine tasting
+peak district
+dete cting
+thur man
+phe e
+èª ķ
+u mich
+re r
+sculp ted
+go le
+name sake
+ðŁĶ ģ
+serv icing
+bau gh
+pu gh
+pen cil
+dar th
+munch kin
+at orium
+ten ers
+sun y
+rolling stones
+mag ing
+star rer
+i dris
+fe instein
+ag ron
+âĺºï¸ı âĺºï¸ı
+supervis ed
+chamele on
+aggre gate
+succe ssive
+mo gul
+inst yle
+pol dark
+custom e
+ohio state
+ha ya
+ci des
+broker age
+angel ou
+fifa wwc
+de forestation
+al ton
+pam ph
+hu gged
+ho bo
+change able
+ku ber
+bur roughs
+demon etisation
+cape cod
+vers atility
+or ice
+le ila
+womenin science
+tu a
+he dges
+embarrass ment
+ali fe
+so ars
+ni ghter
+hy mn
+gi pp
+chas u
+tech s
+ni all
+k illa
+hi ka
+cam els
+valu e
+Â ¢
+sc oops
+mah moud
+clu sive
+adri ana
+pac o
+oz il
+un as
+transl ations
+whispe rer
+s bi
+bu xton
+bio tics
+indi ffe
+ken ney
+k lar
+et ching
+barra best
+inst ability
+se ine
+vo tel
+blo gged
+whis key
+my space
+t ant
+lan dia
+give back
+illu s
+aw ak
+ac ab
+f bloggers
+cloud computing
+blat ant
+syri ans
+band ra
+sty n
+an em
+ke ted
+kar thik
+barun sob
+pin ot
+gu bernat
+gay e
+arti ste
+i fied
+conven tions
+hu an
+geni uses
+eeee ee
+fol ly
+somer ville
+pride month
+ðŁĩºðŁĩ¸ ðŁĩºðŁĩ¸
+chemo therapy
+paul s
+bak ar
+ìĦ¸ë¸ IJ
+taiwan ese
+fol lo
+c ss
+re ign
+nn nn
+fla un
+catastro phe
+iti es
+frag ments
+extre mists
+ym oun
+car men
+eze kiel
+conne cting
+se h
+man ta
+remodel ing
+we ymouth
+at oms
+ce m
+ne well
+lu mi
+the open
+mo c
+mili band
+g land
+z shq
+mag gie
+mani acs
+m sp
+ad y
+cre ams
+le anne
+e sta
+py g
+af finity
+pray er
+dun bar
+ligh troom
+ac adi
+wyn onna
+roman tic
+state dept
+sick le
+wh os
+lam o
+et our
+fin ity
+shru b
+shar pen
+pun dit
+ed on
+af ore
+mar s
+jeff ery
+ter ps
+medal list
+kath arine
+accu sing
+ta z
+roy d
+from home
+confron tation
+alle gh
+ðŁijī ðŁijī
+refresh er
+ran veer
+never land
+jo jo
+lu crative
+en am
+ca ver
+pa edi
+man jaro
+flu ids
+the ssal
+oppre ssed
+mu ss
+joh anna
+Ø ®
+cn g
+buil dthe
+sett les
+s ith
+fu ego
+cl amp
+ar ag
+pay er
+ted x
+mand y
+inter stellar
+fr c
+ch and
+b cc
+mo lo
+len til
+johan sson
+grims by
+nature lovers
+ðŁļ¨ ðŁļ¨ðŁļ¨
+shin de
+x in
+international dayof
+transiti onal
+sat a
+cad dy
+wo d
+if u
+ha ys
+holl yo
+j ang
+ir c
+co im
+grad able
+" "
+ðŁį ´
+ঠ¾
+a el
+n yo
+west lake
+time out
+sof i
+phenom ena
+cultiv ation
+ag no
+un armed
+so t
+con j
+gen o
+royal navy
+nutriti on
+fair mont
+ti relessly
+sn g
+re ty
+mic a
+lu cent
+slo ane
+droo l
+riz al
+od ell
+critici zed
+. '"
+la ze
+deser ted
+co der
+pra s
+l illian
+itiner ary
+dav y
+an ap
+whi pping
+hobo ken
+kare ena
+çľ Ł
+vi us
+ter n
+nan tucket
+mis understood
+bu laga
+st ant
+chin ook
+z am
+reli es
+d ss
+ed mond
+sket chy
+m ell
+fe x
+rec tor
+dist ill
+day dream
+wine maker
+ri pley
+billion aires
+hel ene
+ati f
+cul prit
+bertr and
+wou ldnt
+ma pped
+v ak
+gla dly
+parliam ent
+kidlit art
+ware ness
+goli ath
+âĨ ĵ
+view point
+tat ted
+fu ls
+dor sey
+ang lers
+li ds
+ki ya
+bow les
+be h
+b ite
+compati bility
+ance stral
+pro x
+beha ved
+gubernat orial
+ch field
+sab an
+z h
+teen y
+shibu ya
+holli day
+pan cy
+âĿĦï¸ı âĿĦï¸ı
+seun gri
+? ,
+ðŁĩ¦ ðŁĩ·
+im itation
+impac tful
+any i
+gene vie
+añ os
+bate man
+gli der
+af ar
+ra sheed
+effor tless
+sh war
+dach sh
+er un
+at os
+kin i
+ch d
+kha ki
+k lin
+felici dades
+bel o
+as l
+to ppers
+fin ley
+stac ey
+rigor ous
+kar ting
+le ppard
+car michael
+be ret
+c se
+ak hi
+mer ingue
+ab an
+ha ke
+ger i
+er jee
+re sto
+comm anders
+pr it
+fl or
+ad ven
+ex termin
+remain der
+å IJ
+es g
+martin o
+lulla by
+| @
+mi gn
+in store
+big bang
+cor di
+cau ley
+ante bellum
+dg ate
+cro ck
+span dex
+scaf folding
+ore os
+ê°ĵ ìĦ¸ë¸IJ
+pom ona
+ma uro
+uni versi
+re mi
+af ootball
+t ant
+sm alls
+ne h
+worl do
+tropic al
+mor ph
+jav elin
+gla r
+arqu itec
+reminis cent
+tu bs
+spide y
+make u
+syl la
+progressi ves
+blo t
+shor ten
+keep in
+ch ak
+ang st
+super food
+decad ent
+ston y
+neuro logical
+ar boretum
+ann ak
+fe ma
+per cu
+dis respectful
+small biz
+lo x
+co om
+c sc
+bs bi
+pre valence
+him ss
+esp an
+mo ga
+fr ampton
+sky map
+mas se
+levi athan
+( ).
+noctur nal
+car ameli
+ang or
+amne sia
+outsi ders
+she alth
+rhin o
+ant ag
+ag io
+ðŁĴ° ðŁĴ°
+take me
+kab addi
+c si
+m sh
+coch rane
+thessal oni
+sil a
+ha us
+du sting
+obe se
+mack lemore
+mani sh
+len in
+m dc
+gro wn
+shef field
+s rs
+ke le
+car son
+ch um
+dah lia
+can tore
+opp o
+how ling
+cyber crime
+sur realism
+sc ran
+fa iz
+thre n
+rac ists
+r out
+pk not
+se mana
+sin i
+mc cull
+ma chi
+alfon so
+y b
+sar dar
+kend rick
+den g
+reci pro
+on f
+doom sday
+bri bery
+custom iz
+art is
+c pi
+ðŁĻĪ ðŁĻĪ
+sla va
+let te
+en s
+âĿ¤ï¸ı ðŁĺĺ
+cra yon
+ad an
+tr c
+migr ate
+simp son
+row ers
+king sley
+farmers market
+shee han
+ne phe
+bor non
+car ton
+mic key
+all ure
+u lu
+sli pknot
+heb do
+gui do
+dog celebration
+online marketing
+acceler ating
+) ..
+origin ated
+macar oni
+ed tech
+out field
+mit z
+disc us
+adverti ser
+man or
+ha shi
+descri p
+cap ita
+ful bright
+recep tor
+con n
+con ey
+spion age
+r attle
+pre st
+u li
+blog post
+acker ay
+) â̦
+red velvet
+mat th
+inspir ing
+b sd
+ker ri
+po con
+mil lar
+re pur
+accent ure
+ä ¹
+ram bo
+ragnar ok
+dele ting
+british museum
+pat ory
+leip zig
+flori an
+sci fi
+in ers
+br ate
+yo y
+melis sa
+ab er
+ma sa
+po te
+mosquit oes
+transpl ant
+r pa
+; ))
+bast ille
+yl an
+joye ux
+melo dic
+cap tions
+atri st
+roch dale
+gott i
+pew die
+cuties aturday
+who is
+aqu aculture
+tiv a
+sp el
+he ss
+ha ji
+fred die
+co per
+brand o
+v k
+photo book
+* ,
+my dayin
+micha ela
+brune i
+sr ini
+in te
+Ä ±
+de ol
+d fc
+separ ately
+bun d
+ve sts
+to c
+me ck
+rein forced
+constra ints
+car roll
+sq ft
+re ver
+cam per
+bird man
+in action
+gener ators
+triumph ant
+pe sts
+o vo
+gy pt
+al amo
+sc aled
+suresh pp
+sd n
+is mo
+gi os
+) @
+justic eleague
+restaur ant
+gab i
+den gue
+next gen
+exemp li
+ap ex
+inspir ational
+down side
+kid z
+u pl
+et na
+alvar o
+fel dman
+bar net
+m ha
+es ch
+bloo ded
+>>>> >>>>
+kan i
+ho fficial
+casablanc a
+bir ds
+ty ga
+sw amp
+o day
+new castle
+nb ap
+ci sion
+cho ols
+af lo
+ne p
+mon ton
+ak b
+super model
+down time
+th os
+sc wx
+snoo py
+ag greg
+yo ke
+nor cal
+we tt
+prolon ged
+me tast
+beat er
+f ta
+t lap
+disgu sted
+y h
+voice over
+itch y
+ip c
+ðŁİ ¾
+phe asant
+stra its
+ram pant
+j g
+fer til
+assu res
+fortun es
+sal inas
+liz ards
+kett le
+i bs
+cyn thi
+he g
+mc cr
+soccer oos
+happen ings
+cor den
+ðŁĺĤ ðŁijĮ
+t ches
+egre t
+wolver ines
+congratul ated
+ho gg
+bott ling
+wr i
+fer ri
+bo sch
+af ire
+og den
+s jo
+j dm
+sv t
+con tex
+tol lywood
+min k
+me se
+super sonic
+op oulos
+å ¸
+âĶ ģ
+knuck le
+gu ise
+gam i
+chu cky
+z inger
+radi al
+compla ined
+bo da
+fe tal
+discipl ines
+cor ro
+ðŁĩ®ðŁĩ ¹
+op ted
+filtr ation
+ad nan
+em cee
+mi stre
+insom ni
+fer gus
+tra jec
+on don
+med tech
+tanger ine
+madra s
+gru e
+cab s
+z hu
+sureshpp rabhu
+insul ated
+day swild
+pp m
+band ai
+v day
+s ff
+squ id
+lo thing
+not dead
+expre ssive
+cu ll
+ala stair
+x u
+up front
+fish ers
+en es
+um d
+dis missal
+sti er
+sel s
+lu st
+re active
+prote ster
+eyel ashes
+al im
+goo de
+gre eng
+da ir
+com pen
+anush ka
+proto typing
+ma pu
+bear ings
+ðŁIJ Ł
+for me
+bsbi botany
+timo thy
+out skirts
+am bed
+are tha
+wend ell
+stre aks
+ni m
+k pk
+sne e
+fit ter
+quo ta
+p ate
+win ning
+ðŁį Ń
+sho pping
+ma inst
+cul ver
+ste vie
+mcfad den
+counter parts
+gren fell
+fol som
+dor set
+tech crunch
+⬠ħï¸ı
+tip tuesday
+us l
+tre x
+geor gie
+ranveer official
+lic ks
+se wn
+k f
+' â̦
+jap s
+p ate
+orth op
+fe sta
+stra s
+mon tal
+hammer smith
+fore most
+wido ws
+mad re
+ite z
+mito chondri
+lig ans
+z ona
+cari bou
+m ss
+andre i
+weather channel
+gh c
+: ...
+ta ft
+awe ather
+al isation
+bru tal
+bliss ful
+nik ola
+mal icious
+q m
+mpg vip
+bro die
+bl itz
+applau d
+dri bb
+v ague
+dog go
+transl ating
+interpre ted
+hat ched
+ge tyour
+benefici aries
+spar ring
+caes ars
+aw illiams
+la hat
+bro ke
+ti mp
+virtu es
+rel ying
+pie tro
+k tn
+ici sts
+pab lo
+lou i
+a ag
+pn pp
+cha st
+pul ses
+fini sh
+usair force
+type writer
+thomp son
+dog s
+ut to
+ãģ į
+sand al
+new ly
+do ge
+z w
+wan kers
+ne gr
+mu cha
+determin es
+black fish
+sk unk
+mu ps
+instru ment
+phy to
+daysto go
+skin ned
+hai der
+con ten
+ðŁIJ¾ ðŁIJ¾
+we iler
+undoub tedly
+chair ing
+wall is
+sh ard
+zind abad
+adul t
+absor ption
+pre sto
+deplo ying
+drum mond
+battle front
+seag ulls
+how dy
+juda ism
+des de
+part ition
+âľ Ŀ
+no logy
+national bestfriend
+lesn ar
+film fare
+co asts
+christen sen
+ac an
+mb u
+co pped
+ru bble
+sw c
+fun nier
+far ther
+where as
+nano technology
+with stand
+pil low
+bow ers
+to pe
+it ly
+con fit
+ma kar
+comfor ts
+bo sh
+cli pper
+bal la
+sti k
+mil b
+safe guard
+musi que
+eas port
+ya z
+pad ded
+bad er
+fore ign
+chop in
+archi ve
+o ka
+tran sporting
+tml talk
+aj it
+consequ ence
+sc roo
+ff o
+collabor ated
+pug chat
+ye mi
+jav ed
+au burn
+o of
+ma w
+sau cer
+miti gate
+i les
+evangeli st
+ter ie
+re cl
+indic tment
+cat a
+bright ness
+may the
+whim sical
+un lv
+key word
+cu min
+med way
+west world
+tra w
+im posing
+form ity
+coul ter
+ab z
+ny pd
+grass i
+kel sey
+qld pol
+clock work
+f dr
+di anne
+âĺ ij
+ad h
+p ann
+bra vely
+ae ge
+un lawful
+ver di
+pocaly pse
+phar o
+kar la
+reson ance
+ma stiff
+la dak
+bu u
+ma iled
+hi i
+craw ley
+tor rent
+mach ado
+liby an
+effort lessly
+fal sely
+q vist
+ke ef
+craf thour
+cheri shed
+val kyrie
+s ari
+kal amaz
+be he
+ðŁĮ Ļ
+th im
+ro ddy
+col trane
+but chers
+ach im
+wk end
+awk ward
+cab rera
+:) )))
+fran c
+decl an
+con dos
+a ja
+pandor amusic
+char ter
+ph ill
+mon trose
+hatch back
+handic app
+gre aves
+eucalyp tus
+ut most
+t son
+bur ton
+mid wives
+in cur
+ðŁĺį #
+moo d
+compre ssed
+tom a
+must ang
+mo g
+as ana
+te stic
+sho tel
+in sol
+cor sair
+nh q
+ben ny
+sm ma
+kap ur
+in con
+jon as
+ener gies
+don al
+as ad
+se z
+n pa
+archi ved
+stimul ate
+do p
+hy d
+gri eving
+ãĥ Ī
+ron a
+why te
+tree house
+ss ell
+sand ro
+ko bo
+ther most
+se clu
+hi ya
+ge ez
+mam as
+prisc illa
+flav oured
+fas s
+w old
+maker space
+cospla y
+p tv
+happy valentinesday
+sequo ia
+love craft
+gu an
+d tm
+ci i
+yoko hama
+pos thum
+re q
+ðŁĶµ âļªï¸ı
+galat asar
+dol by
+hamp tons
+disturb ance
+stone henge
+ok c
+disrup ting
+month sary
+jun gle
+head lights
+du stin
+micro sof
+happy mothersday
+ko ko
+gra zi
+te sto
+na idu
+mal ay
+ari al
+ru mb
+ab oo
+har man
+tra pe
+spo ils
+je ho
+go dly
+lock screen
+z un
+pi ous
+ma gento
+l enders
+prob able
+corpor al
+m our
+aw al
+su a
+call me
+ton ne
+go vin
+devast ation
+x j
+gear box
+war lock
+per me
+it ate
+gaza underattack
+du val
+paras ite
+clement e
+le th
+i va
+fro zen
+tho les
+to bin
+cair n
+s ill
+luc kiest
+conver ts
+st ale
+pan cra
+euro pale
+wis dom
+sch ur
+ì ¶
+verti go
+bi j
+u bc
+nu re
+righte ousness
+mt c
+factor y
+ver st
+revers ed
+hur i
+hee chul
+fab er
+ar r
+ul ous
+ven om
+ph at
+green ery
+bra dy
+Ã ¦
+: ((
+never giveup
+di sha
+mo ta
+health care
+dun ham
+dex po
+den zel
+bb ins
+f ics
+wh am
+mc g
+eli an
+wat a
+str alia
+tel lu
+pe sky
+spin off
+ar moured
+re acted
+do fficial
+te du
+sag ar
+mor ally
+paralle led
+fi os
+dow ner
+dau gh
+re do
+world cup
+tari q
+bar ne
+glaci ers
+oc cult
+barbar ian
+her mosa
+!! !)
+y ur
+inter nation
+p ss
+sit u
+p int
+american air
+sw am
+dopp ler
+ðŁĴĻ ðŁĴľ
+cincode mayo
+le van
+hell enic
+mc ne
+ju di
+yu h
+st x
+qu are
+ðŁĺĤ .
+sti g
+g els
+mot ley
+hard work
+euro zone
+e ad
+ç¥ Ń
+seab ir
+ci us
+la id
+alpac a
+presu mably
+pewdie pie
+boo ted
+am ari
+tam ine
+sol ace
+bar row
+acade mies
+x ian
+om ination
+dun geons
+b ma
+de ity
+ai k
+stab il
+hir a
+affection ate
+ving ne
+new port
+ãħĭ ãħĭ
+thir ds
+re tains
+aroma therapy
+ski er
+ni ma
+do pe
+cr inge
+con domin
+to or
+anim ator
+sar aj
+seas cape
+minim alism
+lake shore
+calla way
+berg man
+ठĹ
+whisp ering
+stupi d
+ri ghtful
+requ is
+ir n
+se va
+ut pol
+tuber culo
+squ ish
+de but
+govern mental
+christ ine
+all man
+weap on
+s ito
+bur i
+lo lita
+leaf y
+fu ch
+tin ted
+mck en
+a hahaha
+ðŁĩµðŁĩ ¹
+repe al
+ne gan
+ðŁķ Ĭ
+tail gating
+game insight
+ðŁıŁ ï¸ı
+yaku za
+z t
+ti ring
+pro posing
+bow lers
+tra itors
+ak shi
+cler gy
+cit o
+up sets
+tu scal
+symph onic
+sil ently
+shu ff
+black well
+ðŁĺĤ )
+ko be
+rober to
+ri dg
+dc u
+mer ino
+ft p
+east side
+. ~
+nb l
+mn leg
+ts for
+frau dul
+ca pping
+in my
+gymna st
+ston es
+ss in
+twe aks
+shag gy
+oak land
+dem sin
+sang ria
+mm va
+hen nessy
+down ton
+ri ghtly
+in it
+aga ve
+ob last
+northe ast
+friend ship
+dal a
+tro phy
+ðŁij ½
+mag in
+margar itas
+ê ·
+ww fc
+fa sh
+di ke
+cu d
+char t
+ðŁij ®
+refuge es
+jop lin
+n cs
+imp y
+firm ware
+pas cu
+flam in
+health tech
+bell letstalk
+w aka
+ol ls
+la go
+co wan
+bombar dier
+sh ome
+ðŁĻ ħ
+mc master
+na ve
+well s
+u ta
+tell ers
+mis fits
+kap il
+face off
+af firm
+a pro
+whit epaper
+super yacht
+speci mens
+al located
+... ,
+- __
+ka w
+dachsh und
+djo ker
+s work
+qui ere
+or um
+ðŁIJ ł
+som m
+c mt
+ingh our
+skin ny
+lgb ti
+gi ggles
+break away
+resear ched
+par ity
+my al
+ms l
+re tained
+si vity
+make inindia
+sol ves
+defam ation
+wal tham
+sri racha
+road way
+concep tu
+al in
+iw ant
+å Ī
+del ft
+tender loin
+ga ins
+faul ts
+sw ire
+st ellen
+pol lo
+dy ne
+bornon thisday
+asdf ghj
+sq l
+sali m
+advis es
+vo ip
+ìĹij ìĨ
+un touched
+she il
+ontari o
+uph ill
+so bre
+de shi
+nov ella
+du tton
+craw fish
+ا٠Ĩ
+ma a
+tw ine
+kal in
+ðŁĩµðŁĩ Ń
+ye ss
+brook s
+hoo siers
+ton ka
+umbrel las
+ay ers
+ate am
+acqu iring
+su ction
+ä n
+wi es
+tari ans
+soci o
+mat tb
+shepher ds
+o so
+charity tuesday
+s logans
+ninj as
+al bat
+by te
+bash ir
+trampol ine
+mydayin la
+i ja
+bas el
+ror y
+gol die
+fi rec
+un noticed
+pecu liar
+sch a
+ker son
+mour ns
+liquid ity
+qu ipment
+hi bs
+ar s
+aeron au
+slide show
+sla bs
+delici ousness
+sk itchen
+hta fc
+full erton
+cre ighton
+aer ob
+procrastin ation
+az ores
+white hall
+uss occer
+medi ation
+djoker nole
+and me
+um en
+noxi ous
+jo ss
+ili fe
+anni vers
+sudan ese
+et res
+under mine
+whole foods
+diso be
+kor i
+ade le
+eli z
+can ti
+al on
+gymna sium
+sarko die
+meteoro logist
+yl de
+ste en
+stamp collecting
+nas al
+lo tt
+fran ks
+ex ol
+ack i
+good year
+animal rights
+y les
+vio lets
+mm es
+s thel
+ra pping
+tu scan
+wai ver
+tur ner
+eat local
+northe asthour
+anim ations
+tom morow
+t sh
+ff ame
+bra e
+pe tron
+glam our
+br yn
+d cs
+bal es
+ðŁĶ ¶
+bro v
+bre v
+b ons
+physi que
+car ne
+x e
+elix ir
+vol ved
+l oma
+ìľ ł
+æ ĺ
+van u
+ri gs
+bal ance
+va res
+bon ita
+sprink le
+perfec to
+di on
+le ak
+calcu tta
+o ba
+d ma
+c mon
+tun er
+pneu monia
+bo gus
+apolo ge
+cl ough
+bor ne
+)) ))
+revi ved
+o varian
+ner f
+c legg
+fan fest
+cho u
+reali zes
+mc n
+li gu
+leg alize
+just saying
+for ster
+bo sni
+k hi
+in dom
+hei del
+en cryp
+si ss
+ed di
+mar bles
+brisban e
+y ing
+pre paid
+wal sall
+cooper ate
+orche str
+mar isa
+ho wie
+che wy
+bren ner
+andro meda
+e gan
+sto cki
+cav endish
+ag an
+ban o
+de ir
+go g
+bl k
+re thinking
+ch ig
+rhe u
+sni p
+p eng
+semin ole
+m swx
+an nex
+lyn da
+lewisham ilton
+cu mul
+tb l
+dolph in
+agu ero
+........ ....
+pre lude
+at our
+gr anger
+too ting
+ro tun
+dis ar
+home items
+da res
+**** ****
+ðŁij Ĩ
+compre h
+jin x
+as well
+iri e
+circul ating
+ðŁIJ ¥
+over board
+cultiv ate
+rhe tt
+oriente ering
+ca k
+bal kans
+s itt
+jas min
+britney spears
+ro tor
+se aling
+g bc
+oc ci
+f as
+eman cip
+com er
+war time
+tic kle
+son ny
+pac es
+log g
+at rix
+sr p
+g win
+do bbs
+uz be
+the wanted
+dru sh
+ex tru
+m icky
+honore es
+dar win
+re dux
+mm j
+ram i
+jalape ño
+io c
+do ver
+ju ju
+whit ney
+s eng
+en ly
+au ch
+archipel ago
+vigil ant
+man gal
+wil dest
+parano id
+hal i
+bb ly
+sanc tioned
+real ms
+con co
+u ddin
+c sk
+play time
+libr a
+sav ag
+oc tane
+rec tan
+re turn
+par rish
+mor rha
+cc p
+c mu
+sa iled
+se vent
+ro sie
+pil ing
+he w
+boar ded
+seg ments
+neph ro
+( .
+cr ats
+bak es
+ðŁį ¸
+back tothe
+sibl ing
+kirk land
+ke o
+gu wa
+bre ads
+ðŁĺľ ðŁĺľ
+t q
+haras sed
+ga u
+wil bur
+j isoo
+ep er
+li sam
+tri ppin
+sh ino
+ru kh
+beast mode
+cho a
+inst aweather
+rich land
+gar i
+fe z
+cowboy snation
+fur suit
+k run
+a en
+sycam ore
+se gun
+ent ennial
+di h
+o ax
+demsin philly
+ðŁĻ Ģ
+sn hl
+pen nies
+pass words
+ma kin
+ty e
+d eng
+kni gh
+jeep life
+hel pline
+a for
+zz zz
+ste amy
+pic ker
+iter ate
+happen ingnow
+ki b
+bloom berg
+martyr dom
+bul ly
+assor tment
+a hora
+zo e
+no i
+illu stri
+agar wal
+p sc
+electr onica
+recruit er
+gar diner
+rad ha
+naf ta
+dot net
+pi ero
+geor g
+bel s
+ðŁĺĤ ðŁĺį
+tuberculo sis
+run nin
+mor is
+haul ing
+ev oc
+bre thren
+sha ir
+frame works
+a stu
+ri gid
+ku ma
+kre me
+jin nah
+insu rers
+ny u
+f ere
+nol lywood
+good vibes
+- ...
+toi le
+sk ril
+instaweather pro
+cze ch
+pa vel
+one piece
+nike plus
+fi let
+cav ity
+ðŁı½ âĢįâĻĤï¸ı
+ðŁİ £
+dra stic
+dail ys
+siam ese
+re bu
+oste o
+lar k
+f re
+sh elling
+p é
+glad ys
+ðŁıĢ ðŁıĢ
+gusta ve
+submer ged
+grand stand
+att u
+won t
+f pv
+b ley
+jon i
+ang ames
+weigh ted
+al ou
+ठ¶
+les bians
+f j
+anni es
+am l
+dor ia
+dav in
+be ta
+can c
+madewith unity
+ha j
+bad lands
+mu l
+blu ec
+pa wn
+cov ington
+neuro logy
+htt weets
+dysle xia
+thel ove
+ne at
+fork lift
+autom ate
+une ven
+monte ss
+he in
+ha g
+rel ics
+competiti veness
+can elo
+mar tens
+bullet proof
+sk ittles
+g ya
+pri mo
+americ afirst
+woo o
+abor tions
+?? !!
+ma che
+ld ers
+rl ly
+preli ms
+direc t
+cour se
+swa in
+super cell
+ec centric
+sting ray
+ple ts
+wil cox
+west in
+okan agan
+kir an
+car bo
+bomb ings
+ra rest
+bo h
+gaw d
+di gg
+mo ana
+enti rety
+en closed
+dodge ball
+par ton
+milky way
+at r
+thorough bred
+re ally
+qant as
+epiph any
+ine e
+aero smith
+spi eth
+ar thro
+ell ini
+du bu
+bra ving
+âļ½ âļ½
+re structuring
+illumin ate
+equ ili
+mp i
+ash ton
+pony tail
+ma scots
+flat tering
+cru m
+ast a
+à® °
+stranger things
+bar nab
+ر ÙĬ
+make shift
+got cha
+will am
+cho irs
+kilom etres
+gho sh
+eu than
+dol ly
+un ning
+the ar
+cre we
+w sw
+j ace
+dis miss
+ke an
+ho ta
+kh at
+~ >
+thir u
+ren dez
+hart man
+tee ssi
+cas ca
+z ah
+hydr ange
+fo d
+aw p
+mzan si
+thick er
+nago ya
+ne va
+sti que
+cast el
+dam ian
+there by
+ji ang
+ale k
+music islife
+ra q
+calla han
+gou ache
+somal iland
+sean hannity
+ra heem
+lo se
+elo ve
+whar ton
+rectan gular
+illustr ating
+har ne
+auti sma
+scra pped
+ell and
+decre e
+nag pur
+ki pp
+so re
+n md
+ma as
+gun a
+gart ner
+bel li
+then ight
+je on
+gendere quality
+gi ver
+a el
+gar ments
+ne u
+mardi gras
+mar sden
+ro wer
+pollu ted
+camer aman
+vin od
+be asley
+cro c
+ji u
+hollyo aks
+anesthe sia
+al les
+ste ward
+lati mes
+ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ ðŁĩºðŁĩ¸
+tic ian
+gor ia
+come dic
+ðŁ¤Ķ ð٤Ķð٤Ķ
+nai ve
+sli ons
+ł Ī
+bur glar
+ðŁĺŃðŁĺŃ ðŁĺŃðŁĺŃðŁĺŃ
+york shi
+se ñ
+fan boy
+lau rel
+inci dence
+potom ac
+rober ta
+presi den
+pr yor
+os bourne
+w ku
+te me
+pal ae
+ðŁ¥ º
+re boun
+itu de
+red dish
+k hand
+coloni alism
+north carolina
+ðĿ Ĵ
+manne quin
+lady bird
+ta sty
+knowledge able
+g shore
+ðŁĮ Į
+à® ©
+qu aker
+salz burg
+med alists
+chy na
+bridesma id
+ma ori
+ro p
+outra ged
+in adequate
+truck ers
+al ana
+ìĿ ¼
+ri x
+oooo oooo
+command ments
+lam beth
+aa j
+eco friendly
+bla z
+morecam be
+boun cy
+rou x
+rai ded
+mi zed
+sh c
+gaw x
+labor atories
+ru bs
+rest room
+consult ations
+ca jun
+virgin i
+so ir
+rev ue
+ple in
+wag er
+ç ¹
+we do
+growing up
+! ðŁĺĬ
+face ted
+sin ners
+ho vering
+ti ene
+seas oning
+an ja
+leg go
+il is
+fla x
+dev o
+ash ram
+mati sse
+ker i
+go wer
+bo tox
+mar shes
+unh cr
+ts m
+opti mus
+dun i
+stu ffs
+so k
+order ly
+n bad
+islam ophobia
+raviol i
+fab er
+cre ds
+won ka
+in fusion
+over weight
+daily news
+assi mil
+acol lege
+medalli on
+kili manjaro
+sti ff
+tham es
+sun ken
+th ard
+my dubai
+hilari ously
+han nel
+plu mber
+fair view
+separ ating
+rasc al
+qui en
+necess ities
+confeder ation
+ll ll
+: ]
+weak nesses
+bron co
+ra ffles
+el ot
+ãĤ¸ ãĥ
+advent calendar
+ðŁİ ¹
+stra vel
+tun ic
+k su
+im peach
+e spionage
+! -
+di ment
+cur rant
+bio de
+commu ting
+by ron
+ðŁĴĵ ðŁĴĵ
+shad ed
+tr uro
+cray ons
+ar ne
+h sc
+fre aked
+dram ati
+fle ek
+u cd
+marl borough
+^ -
+cross ings
+mal o
+black ops
+bin ance
+cho ked
+chen ey
+pl o
+ge stures
+val edic
+ryan air
+rem ington
+v cs
+mc kee
+ec z
+be gs
+nail art
+mayor of
+happy fathersday
+war t
+pet itions
+n ingly
+clean energy
+bro x
+sl alom
+exist ent
+ab ay
+ug liest
+tom p
+stom a
+sel by
+goal scorer
+ben ji
+overwhel mingly
+lan s
+semiconduc tor
+south korea
+re scheduled
+sk yl
+en listed
+dow ski
+si del
+rosen berg
+nas ser
+white head
+pri us
+har are
+en n
+ry der
+í Ĥ
+mon g
+clas ico
+transpor ter
+po tty
+is me
+** ***
+vic e
+sk it
+ode ssa
+l mp
+her n
+raci ally
+pin oy
+paragu ay
+obitu ary
+go es
+bu cha
+side walks
+angu lar
+un constitutional
+transiti oning
+i bu
+gu ys
+un packing
+oooo oo
+black girl
+ber gs
+Â ¯
+wordof theday
+trump train
+thunder bolt
+m si
+fasci sts
+ठ¬
+t sk
+collap ses
+raje sh
+loveis love
+migr ating
+set back
+ðŁĺĬ âĿ¤ï¸ı
+t els
+safety first
+nar rated
+jae joong
+un answered
+lique ur
+en nes
+dal go
+bill ings
+salt water
+mer maids
+lon gs
+clap ham
+we arec
+pic collage
+n ach
+h ace
+pois oned
+lo th
+ag na
+adel rey
+guar dia
+poli shing
+peace keeping
+d all
+p isa
+la pland
+process ors
+de andre
+so bs
+p once
+dra ins
+c be
+ðŁİ¥ :
+spla sh
+meat ball
+fon tana
+worcester shirehour
+ne v
+bri sk
+b int
+ac r
+po x
+cay enne
+skril lex
+j fc
+hahahaha hahaha
+gla s
+en gul
+tempor al
+oni zed
+con cre
+com pose
+vibr ations
+plant ers
+fer t
+criticalrole fanart
+t bli
+sch allenge
+huck abee
+munici pal
+iam bic
+radi os
+ne vis
+dura bility
+mc cla
+horse back
+inst itutes
+ful fill
+atta ch
+ate ur
+ak an
+resi sting
+illumin ation
+hand le
+hair care
+om ent
+macle od
+ka iser
+g no
+bear down
+ly f
+gl omer
+distor tion
+z m
+san k
+roo sters
+is now
+as ports
+ag en
+wo ken
+st george
+ro mper
+my le
+econom ists
+ru to
+t will
+health and
+d ito
+ws l
+tair p
+pra kash
+mic heal
+h ts
+w rights
+kat su
+fioren tina
+defen seman
+d itch
+var sity
+texan scheer
+ba ham
+sc anned
+we il
+seduc tive
+ðŁijį ðŁı½
+fu e
+er win
+dav ison
+ter ran
+moo ds
+wool f
+re source
+@ .
+cu sh
+ðŁį °
+regre ssion
+cur led
+la zer
+jo anne
+ab bott
+mo z
+down ers
+mm mmmm
+valent ina
+k hair
+dream t
+cro ok
+che k
+ste aming
+nephe ws
+cl eric
+as ober
+indefin itely
+w ye
+us news
+joy ce
+flu shing
+wynonna earp
+ron do
+kis s
+hot dog
+bar ns
+sax ophon
+far ley
+gas p
+decre asing
+al way
+pe x
+l sd
+shi ft
+p outine
+ra zz
+rescu ing
+ni ko
+ho ch
+cc l
+u aap
+n ts
+m car
+il wx
+conqu ering
+ket tering
+stur dy
+delay ing
+sto k
+vani shed
+cath ar
+bin gham
+in v
+ic hiro
+he mo
+budge ting
+[... ]
+be ss
+sebasti an
+slow ed
+ðĿ ij
+musli m
+stun s
+acton climate
+ve a
+se ton
+rose tta
+oun t
+hard in
+flu id
+ca w
+ðŁ¥ Ĥ
+yach t
+un l
+sp hy
+provoc ative
+or ic
+is back
+__ _
+nicol as
+gy an
+loo se
+fl in
+reb ate
+: ::
+! "@
+com icon
+she ff
+down stream
+chic hester
+beach life
+mom life
+diabe te
+ar ra
+van e
+ok u
+ye o
+man go
+try out
+app ell
+he irs
+arjun a
+dd u
+na veen
+movi c
+soci alists
+s back
+criteri on
+soyu z
+k her
+da z
+yol anda
+wine oclock
+re ina
+one w
+leon ard
+en dez
+u bs
+support local
+facilit ated
+carameli zed
+b pa
+vuel ta
+my tho
+m ami
+spe are
+nbap layoffs
+fe vre
+nick jonas
+im print
+c so
+craig slist
+la salle
+gi deon
+ha doop
+dis regard
+w ud
+tu c
+ma gee
+acou stics
+ta a
+qui e
+pol a
+cr t
+dw yer
+dis sec
+capit ol
+men tion
+kn oll
+he igh
+fin ders
+plac ements
+l se
+indi ra
+gur i
+madhuri dixit
+kingdom s
+iambic pent
+geor gina
+je ky
+conflic ting
+bay an
+aga tha
+uph old
+dr on
+vic ar
+ex pat
+periph eral
+pe ssi
+fa f
+ance stor
+? ..
+wid get
+pun c
+comm enced
+beav s
+air waves
+ad dis
+po a
+de sses
+co den
+vu e
+ru pee
+kar in
+spo ck
+m sy
+ภ°
+pr ick
+fill more
+ti fication
+thing sto
+sar de
+em ile
+pere ira
+n ad
+bright ening
+arre sting
+wo king
+usc g
+sp ill
+raspberry pi
+hu go
+ite c
+is ma
+cuff links
+optimi zed
+oc c
+mi wx
+en ka
+el ited
+afford able
+sa kh
+coron ado
+ho h
+at ul
+ai oli
+jim cantore
+accoun ted
+vin ay
+her mit
+groo ves
+ran ch
+r illa
+we tter
+ou tof
+veter in
+ni kov
+ki an
+fair banks
+ram apho
+n iti
+k ko
+ru sty
+ne stle
+tv xq
+shahe er
+âĿ¤âĿ¤ âĿ¤âĿ¤
+penn ant
+gem stones
+dem debate
+ðŁIJ Ĭ
+auton ews
+support indiefilm
+mach o
+ve x
+new sat
+ne ti
+conce ssions
+can died
+yof the
+mac au
+den ds
+cricke ters
+san iti
+mari ano
+gh at
+ar toftheday
+¡ ľ
+e gos
+gen oa
+chat bots
+bri er
+al labout
+mon ty
+spi ed
+r tr
+comfor t
+sni ppets
+real time
+gra in
+exam ined
+en lightening
+tt u
+god bless
+release the
+sing ular
+ki ans
+ha ka
+sor ren
+defe ct
+mar g
+equ ities
+d orian
+su ka
+per l
+aishwar ya
+pul lover
+preci sion
+fair way
+ne ve
+rive ting
+vill anova
+en com
+ak o
+passion ately
+europale ague
+siem pre
+x vi
+enligh tened
+c fr
+âĺħâĺħ âĺħâĺħ
+wast eland
+is f
+new comers
+emergen cy
+amphi theatre
+- .
+text books
+figur ative
+tre mb
+pe sc
+ab hin
+ab bot
+ac acia
+har ds
+por sche
+kau ai
+el isa
+car rick
+abo u
+elli er
+be ch
+neu tron
+galap agos
+ru ben
+in nis
+how to
+nun s
+sab ine
+i ac
+clin ched
+no tori
+fi ves
+cairn gor
+per i
+gr c
+ðŁĴ¯ ðŁĴ¯
+mal m
+twelf th
+di ff
+rout ines
+marty n
+lin den
+synthesi zer
+nu mber
+game cube
+fal kirk
+byz antine
+queu ing
+gr ill
+scal able
+char red
+rou ting
+her bali
+gri zz
+ðŁĺŃðŁĺŃ ðŁĺŃ
+tol l
+termin als
+l pc
+ab d
+war mups
+remo vable
+¯ \
+vi go
+pap aya
+ne ve
+lov ingly
+jo kers
+ib les
+sse tt
+poten ti
+pel e
+gi gi
+sadi q
+leg acy
+son o
+ru pees
+retar ded
+ele e
+par r
+fi ance
+ey re
+say ers
+pend ants
+mak nae
+al bans
+adap ting
+p ff
+pu berty
+ji u
+ing rad
+hypocr ite
+diplom ats
+phys ical
+rob by
+bon sai
+ãģ ·
+f att
+catal unya
+âľ ĸï¸ı
+ro ma
+more land
+so e
+conver sions
+stl blues
+shol m
+gra ssy
+pra do
+on u
+assaul ting
+> _
+sett es
+dis graceful
+aph ra
+âļ½ï¸ı âļ½ï¸ı
+ठª
+kil n
+goal tender
+s ru
+philanthro pist
+b als
+th n
+stu den
+sando val
+dogre scue
+eli ons
+asse ssed
+lar go
+hec tares
+sh rm
+sa if
+cle avage
+no ches
+n ene
+fat alities
+cur ing
+clean ser
+al es
+p vp
+south bank
+pizz eria
+marsh als
+kni fe
+an dover
+tbli ghtning
+sr sly
+ou te
+digi mon
+timesof india
+prome the
+le bo
+f su
+wit z
+rever e
+man as
+mam ba
+ch ica
+gu an
+exhibit or
+csr racing
+d ere
+xx xxx
+gu sta
+story time
+ston ey
+organ ics
+and u
+se am
+min ogue
+anushka sharma
+ab a
+ðŁİĻ ï¸ı
+ugand an
+chro matic
+as sn
+document aries
+sh t
+ru paul
+loy d
+k ats
+e us
+ite ch
+me dusa
+pan ty
+kel logg
+et to
+talla de
+sha a
+do st
+p ms
+mari ana
+je ster
+croo ks
+ðŁĶ ¬
+min danao
+ind hoven
+ðŁ¤ ª
+le xi
+tv n
+jan is
+co te
+ãģ Ĩ
+ser rano
+iw m
+ðŁIJ ¬
+k ke
+distribu tors
+cap u
+counterfe it
+camp site
+ag gie
+ðŁĺ ¼
+chhat tisgarh
+~ @
+state u
+san di
+prevent able
+cl s
+can ne
+mm c
+i ver
+sa haran
+pal is
+night out
+do s
+ap ia
+absc bn
+manag erial
+aro se
+mo wx
+aro sa
+ðŁĮ ³
+under dog
+remo ver
+astronom ers
+lent ils
+su scep
+smoo ther
+pend leton
+fau cet
+e mory
+dal mati
+af cb
+tic us
+exem pt
+en rol
+d heim
+ðŁIJ º
+restric tion
+star fish
+sto w
+snor kel
+thunder birds
+she ad
+homo sexual
+dy n
+as li
+andre tti
+dou che
+dom o
+tar mac
+slu mber
+pr onto
+first dayof
+mini ature
+mari achi
+argu s
+recomm ending
+mobi les
+in ce
+illustri ous
+or c
+adver ts
+gr its
+wea sel
+pag oda
+over pass
+gre ys
+maxi mus
+arma gh
+wood land
+sun ni
+ðŁĴ ī
+ë Ŀ
+ti one
+soci o
+ho s
+ðŁ¤Ĺ ð٤Ĺ
+wind sor
+subsequ ent
+munch ies
+id h
+exclu ding
+e mi
+cu th
+z ai
+week days
+law suits
+barn ard
+Ø ª
+pe tting
+net es
+mul ligan
+pharmac ists
+ra quel
+e ton
+cran ston
+gil ded
+cle ary
+ce ph
+ra a
+pam per
+lombar di
+as in
+sher ry
+pro d
+for te
+ari anism
+buffalob ills
+æľ ¬
+ðŁĶ¥ #
+uu u
+just ices
+car ina
+nat in
+mas low
+dro oling
+cog nac
+cam ber
+el ong
+r dr
+in en
+convic tions
+am use
+tro ck
+harm less
+visit ation
+gen omic
+bl and
+beno it
+chim p
+tuscal oosa
+gre asy
+x po
+gil t
+se q
+per mitted
+christma seve
+book s
+mu e
+old school
+human right
+be ati
+ðŁĶ Ŀ
+sh at
+sculp ting
+h wan
+fern andes
+sci utto
+fu entes
+endeav ors
+maid stone
+un paralleled
+shou ted
+queen of
+mer c
+band ic
+ve da
+sel angor
+pi le
+ja han
+intimid ating
+disapp ears
+cl ich
+za ha
+w urst
+hi v
+fod ils
+cor dless
+aaaa aa
+hy dra
+bel inda
+e els
+bu f
+su staining
+rugby league
+no c
+brig itte
+( ðŁĵ¸:
+tromb one
+soo the
+smo g
+ad p
+stab le
+ing ley
+diagno se
+ms g
+we ss
+tic keting
+one e
+nsw pol
+e up
+auto psy
+adity anath
+sun down
+river front
+si ya
+p is
+hier archy
+dur ango
+di jk
+ren shaw
+he aps
+epide mi
+david bowie
+interne tof
+dd i
+nation ality
+mb ar
+air y
+win der
+w alia
+elli ott
+c x
+bav arian
+pl att
+an tw
+wi wx
+sof ter
+ne ha
+h eller
+th and
+dani ela
+bo ast
+degra dation
+ðŁĴ¦ ðŁĴ¦
+transform ing
+man e
+av ut
+ðŁĺĪ ðŁĺĪ
+vo ter
+the e
+t ate
+pu ff
+in door
+sop roud
+boy ce
+boris johnson
+wait in
+immun ology
+ðŁıĨðŁıĨ ðŁıĨ
+âĿ Į
+street food
+liz asober
+cavali er
+c elia
+need le
+motor ing
+g ato
+, )
+ra de
+harve st
+t ms
+jar pad
+on ey
+air men
+v re
+impair ment
+abhi shek
+snoo p
+l ant
+fam ously
+bl ou
+s ze
+g ander
+un touch
+tu f
+dee jay
+col lateral
+b ind
+ðŁļ ©
+pin ning
+ic n
+' ;
+the economist
+ul tram
+worldwater day
+ti poff
+the i
+feed ers
+campa ign
+sc umb
+day weekend
+yo m
+pe dic
+h ough
+ps v
+pl in
+on de
+boston marathon
+az zy
+* _*
+con ley
+thi ago
+hoo o
+gal erie
+luci d
+je tt
+gl itz
+final fantasy
+achiev ers
+y ung
+peregr ine
+op hi
+dam es
+biom ar
+âĺĢï¸ı âĺĢï¸ı
+sk c
+l ics
+fl ank
+ar rahman
+ho of
+uphol stery
+t ats
+wo z
+Â ¿
+snor ing
+ra er
+l ju
+ap d
+pl ating
+kan u
+im ation
+fragr ances
+m ra
+mor ay
+mo tt
+im muni
+hearti es
+bho pal
+tim ers
+g ata
+color way
+car nation
+win get
+si ghs
+s ville
+optimi st
+chate au
+olympi ans
+ci o
+singer songwriter
+ny o
+fi bers
+bur ch
+ag ro
+mil ne
+ig bo
+cr amer
+ation als
+dan ube
+pad ma
+nor mani
+en forced
+bre ck
+boeh ner
+ar den
+sur rendered
+pros thetic
+om a
+ha iled
+calcul ations
+w fa
+bi b
+fcb live
+fon da
+west coast
+que sts
+friend ly
+to wie
+fit ch
+bal ot
+star dom
+scrat ching
+ho sa
+thi ka
+o ven
+stro ke
+out post
+pharmaceu ticals
+hi kari
+mu y
+af d
+fallon tonight
+squ at
+or u
+dra ined
+chocol at
+ë¯ ¼
+wor ths
+ri b
+mu j
+that s
+residen te
+it el
+boo st
+mi gos
+mul led
+la a
+etsy shop
+don keys
+me k
+p tc
+flin ders
+e hs
+ro hit
+mu ir
+g ad
+compos itions
+åĨ Ļ
+combu stion
+i kh
+yemen i
+wav ed
+gar ci
+ak os
+oo ds
+fu sion
+se que
+s lan
+pl ur
+kic chasu
+shenan do
+s ams
+worl den
+horo witz
+with me
+mic robes
+k ki
+ðŁĴĶ ðŁĴĶ
+w su
+patch work
+fre er
+y aki
+the art
+symboli sm
+mil er
+bt n
+ma bu
+side kick
+motiv ates
+sag itt
+natur als
+serv iced
+ps ori
+pa ola
+qu ig
+i badan
+gi ggs
+ë ³
+sciento logy
+si oux
+salam at
+d res
+cad bury
+d hawan
+ci ón
+_ '
+swa pping
+maris ka
+james bond
+explo sives
+ay les
+af er
+s agu
+cen sor
+tom a
+jeff erson
+ring ed
+par tist
+ir responsible
+aguil ar
+vac ay
+equ itable
+altrin cham
+ac ur
+man ish
+ger min
+schoo led
+pu tter
+ed ad
+nav al
+toast y
+sol areclipse
+dish u
+coy ne
+ac co
+mu ck
+mar an
+el os
+len der
+cro ix
+worth less
+ha ber
+gun men
+ðŁį ĵ
+zen ith
+t enders
+hur st
+hol tz
+itali ans
+car low
+u cd
+characteri stic
+bun g
+av l
+u th
+sa sia
+rs l
+red man
+neighbor ing
+green peace
+sti ps
+follow party
+y gk
+en os
+omni bus
+na issance
+chri ssy
+secu re
+call back
+ji hoon
+memor y
+block er
+l anta
+daf fodils
+bil t
+ffer ty
+fau st
+ie c
+nipp les
+so g
+m nd
+jagu ar
+bol dly
+ab poli
+pro position
+gun sense
+evan sville
+cu tters
+we go
+dou n
+do x
+stal lions
+ka j
+shi ppers
+j awa
+vol o
+le ven
+pap rika
+kov ich
+jor di
+induc tees
+app alling
+dial ysis
+allevi ate
+âĢĶ âĢĶ
+pie ter
+mid wi
+q tr
+juli ette
+inter mission
+haw ks
+act ment
+one ill
+k lin
+vam ps
+fam ous
+cou ld
+autom obi
+da an
+west end
+elli p
+nh c
+mel anch
+web series
+ton gue
+snat ched
+smy th
+tan gible
+sl i
+e asing
+bar stool
+over lay
+afford ability
+ting ed
+ter as
+ay ush
+wanna one
+rh ine
+dan a
+sh ana
+kend al
+fer tile
+w ir
+repl eni
+lar vae
+is ro
+con vos
+ab brevi
+u cc
+hun gry
+bur rows
+ag er
+nav i
+mat in
+du per
+cer n
+ma don
+ķ ï¸ı
+é ģ
+tu ps
+hy att
+sh ep
+friday night
+wis er
+hei di
+hat ton
+p gh
+foun tain
+wrist bands
+ahmadi yya
+aeri al
+subscri bed
+so los
+m ace
+sla yed
+for fe
+dul ce
+christ mass
+arun jaitley
+viol ate
+ob stru
+ni eces
+w vu
+idy l
+fa ze
+pre serves
+infr inge
+premi ers
+inter vals
+agen cy
+( ©
+stand alone
+di mes
+bo er
+param eters
+ge tit
+ðŁĺĺðŁĺĺ ðŁĺĺðŁĺĺ
+tu lane
+for given
+scol l
+mb ps
+smash bros
+rob bi
+prima vera
+ali st
+ghost ly
+ay at
+ye ats
+impre ssionist
+ear phones
+caul field
+wai kiki
+sal ute
+sc ou
+mu ay
+louis vuitton
+bak hta
+ado g
+inven tions
+hur d
+forec lo
+stream line
+thalai var
+ch snews
+will ard
+t sn
+euro parl
+cru sher
+my sore
+gro wer
+ra ping
+pat ti
+g den
+sm w
+muf ti
+kid man
+ab r
+soun ders
+skep tical
+ðŁĶ İ
+sun dar
+i me
+fer g
+feather weight
+ar lington
+pas qu
+ag azine
+wearab le
+nati c
+mccl ure
+inter mitt
+hor de
+six ties
+car te
+bha v
+ze al
+experi ential
+ador ned
+som mer
+eno te
+hypo thesis
+stin ky
+pro to
+dead lines
+vo gel
+mus ings
+monc ton
+gu ter
+f le
+aci on
+voice of
+ta sha
+inhabit ants
+type face
+s ba
+bts x
+ðŁĶ Ĵ
+wor x
+u hc
+jo ko
+cell ars
+gor o
+continu um
+... &
+weather cee
+ha p
+sr k
+ris ers
+lonely planet
+un named
+co eur
+ðŁį Į
+the world
+ili ke
+fa sten
+ami go
+ri ba
+ramapho sa
+staf fers
+had ley
+? ?"
+fi ore
+sal ut
+hu ff
+bez os
+Ñ ĭ
+ra der
+kam ala
+in line
+fill ers
+um atic
+all in
+shat ter
+re in
+o ku
+ch ases
+fla gged
+baby metal
+water stones
+ts b
+cut out
+op hel
+aam a
+rockab illy
+sto lic
+jet blue
+ich ick
+down ton
+uzbe kistan
+pat na
+la q
+gr ange
+) _/
+subsi di
+sc p
+newsc ast
+it sa
+twee tyour
+e mor
+archae ologists
+uni fication
+por ta
+q x
+protec tors
+pro hib
+charis ma
+car tag
+ren fre
+scul pt
+guwa hati
+de ma
+boo p
+unf pa
+dex ter
+lay la
+alleg es
+sou ps
+never again
+l ys
+cal c
+bar oness
+visu alize
+ger ber
+absor bed
+i ers
+a han
+fon tein
+detec tors
+verst appen
+sv c
+formul ated
+ac dc
+li x
+in competent
+bh k
+lour des
+water house
+snow ed
+appreci ative
+sig ma
+lizasober ano
+pen ned
+pay check
+tall inn
+fanc afe
+par isi
+av alley
+vi g
+ru fc
+hard ship
+so cute
+po ise
+ì ¹
+roth schild
+k ly
+???? ????
+l hp
+il ay
+f hs
+am ad
+ide als
+brad bury
+bal boa
+nic ot
+kid nap
+wol ve
+tas manian
+op t
+matthi as
+ãĥ³ ãĤ
+super markets
+mylittle pony
+me lee
+li ster
+gr oun
+fe dora
+kind ness
+en en
+bra hms
+¯\ _(
+ros well
+mar lene
+ic u
+re formation
+or ail
+he brides
+dispar ities
+terrac otta
+swal lows
+re id
+influ encing
+flu or
+den e
+tum our
+blon des
+thunder bird
+sh eva
+moga dishu
+ka b
+cre eps
+i ving
+ene ed
+anno y
+âĶ Ģ
+intri gue
+enqu iry
+ar aj
+tur al
+kuber netes
+end lessly
+divi dends
+tor a
+ti sh
+commemor ates
+un ra
+tri b
+pon ty
+ne m
+diss ent
+brew ingco
+ðŁĺ ½
+nor mali
+bi of
+( ...
+chil len
+ì£ ¼
+mell on
+av is
+mccor mack
+ing ra
+enrich ed
+custome rexperience
+testo sterone
+snu g
+sett i
+ger onimo
+inqui rer
+bre aches
+very thing
+bloom ing
+mu ra
+dispo s
+bi de
+de va
+shade sof
+in trin
+sh ev
+s ven
+nayanth ara
+gan esha
+c ws
+ber ta
+label led
+use um
+nick named
+ma han
+car uso
+ap ur
+ðŁij Ĩ
+w q
+orphan age
+discar ded
+mag nu
+lu e
+je on
+bridge port
+pac ing
+mercur y
+( ðŁĵ¸
+marx ist
+amphi bious
+transplant ation
+stit ching
+then burg
+gradu al
+ãĤ Į
+ro ft
+ma ils
+ine c
+guy ana
+dopp elg
+ver o
+re write
+head less
+harb augh
+gate way
+car sforsale
+sw i
+st is
+mach t
+un de
+sura baya
+stap leton
+nur turing
+mil ner
+ya o
+lma oooo
+ko sh
+arsen al
+k ame
+er ry
+ar royo
+dis misses
+ru bbed
+rc b
+lew d
+dil u
+and or
+vi de
+ur in
+inter sec
+ha ar
+al b
+year swith
+app leton
+é al
+ul livan
+suc cu
+monter rey
+d mx
+artem is
+ron nie
+farm land
+s football
+gro tto
+anth i
+ãĢ ģ
+à® Ł
+vid ya
+jimmy fallon
+ൠį
+t zer
+gravit ational
+w thr
+u hhh
+e hr
+tin ker
+ti juana
+scran ton
+ram charan
+bar clay
+re van
+m si
+ka p
+wr s
+we thenorth
+tor al
+sat u
+gro m
+fac ep
+erick son
+z yn
+se dge
+oo dle
+spur sofficial
+ds p
+sic ilian
+soli hull
+recei vers
+ladak h
+hend rick
+ther i
+presi ding
+mc guinness
+litt ers
+gun nar
+gh oul
+wi b
+n tv
+kar o
+fro ck
+b lau
+ampli fy
+all is
+ul lah
+memo irs
+kh loe
+intercep tions
+pet day
+lo oney
+con fin
+ch ay
+piyush goyal
+frequ encies
+ut z
+event ual
+warm ly
+obli vion
+an ka
+ta it
+âĿ¤ï¸ı .
+director ial
+ru lers
+prince s
+mu ck
+stur ridge
+deu ce
+abri dged
+bagu ette
+un cles
+pen du
+min ding
+forre ster
+av ila
+wall er
+wall street
+ment or
+hin o
+high way
+crom well
+fanart friday
+mb i
+co yle
+a hi
+tro ve
+spie gel
+pay tm
+mcin tosh
+jan sen
+nit i
+nash ville
+len o
+leicester shire
+le gos
+dic t
+ðŁĵ ½
+sp ad
+beverly hills
+sy rah
+separ ates
+z ain
+un fit
+dra gs
+tan ia
+over flowing
+hri thik
+haw thorn
+z ani
+mac far
+fi de
+to tem
+pe ds
+fundament ally
+cal ico
+sin ner
+j ä
+hil de
+ds d
+ten ay
+ta hit
+mil f
+lie b
+inform ing
+up lift
+ra el
+mortg ages
+lec t
+ii ii
+guillau me
+compos ites
+old smobile
+l end
+gar th
+com mish
+bapti zed
+scorpi ons
+ru cker
+bringback our
+alli ance
+thalap athy
+tal i
+sp ans
+eri dge
+wither spoon
+lin da
+sky lar
+kor n
+hom s
+Ä į
+sil enced
+caf fe
+ar ty
+dist inguish
+to wed
+pun g
+jessic a
+ear nest
+beau fort
+t ama
+study abroad
+si khs
+new bie
+nav ratri
+mar ble
+loun ging
+lit ter
+dal it
+so sa
+iz es
+gra de
+com promising
+tr iton
+de tta
+v j
+chau ffe
+spec tral
+powe red
+montess ori
+artic ulate
+hal ton
+al co
+ye y
+mn twins
+acoun ty
+ðŁijı ðŁı¾
+âī Ī
+mad men
+kal a
+gru m
+chi k
+ati s
+su me
+akh tar
+job search
+high lighter
+bo ath
+âĦ ¹
+tar zan
+lam bo
+âĽĦ ï¸ı
+ox fam
+dump ster
+pretz els
+mac os
+incl ined
+fac tual
+adverti sers
+shu i
+pu ree
+ml pfi
+anti dote
+cap o
+pa str
+merc ado
+but ton
+ar min
+ag g
+lol la
+horri bly
+er rands
+christop he
+time snow
+monday motiv
+li ss
+scand als
+mc i
+dispropor tion
+âĺ İ
+sur pass
+samar itan
+so tho
+pu rest
+fl att
+trivi atuesday
+delec table
+leop old
+hermi one
+chou dhary
+en rich
+¡ ¡
+subsi diary
+ine qualities
+bachel or
+auto immune
+la kota
+i hop
+ad jec
+the simpsons
+sh es
+se k
+gret chen
+up stream
+hin akhan
+coper nic
+x tina
+lu g
+tough ness
+e ad
+cli pped
+bi us
+sl v
+fah ren
+dee pak
+ca u
+x an
+im mature
+dig ni
+bo bs
+shred ding
+but tery
+accommod ations
+de ven
+chun ks
+super league
+sky bet
+kil dare
+je et
+ë į
+ce k
+wrec ks
+pro pane
+oh l
+tb d
+quo i
+trum pp
+mi mo
+reluct ant
+ver ne
+o ic
+ma gh
+ar nau
+se ver
+li dge
+stair way
+kicchasu deep
+ðŁĶ º
+mach ining
+aama admi
+ot i
+c da
+al it
+pan y
+inst alls
+ac ct
+e shop
+di em
+hard well
+fulfill ment
+sc afe
+qu ack
+extrac ts
+swee tened
+fi ghton
+f di
+d inger
+wal tham
+us ur
+refe rees
+seok jin
+gran n
+af rin
+th n
+sch af
+par cels
+bet is
+amar ine
+nom an
+kh tar
+mor itz
+cou pling
+bar ons
+ðŁIJ ¸
+Ã ¸
+sl p
+sad ler
+x ander
+tri ad
+mc millan
+kh z
+divi ding
+ìĹijìĨ Į
+dar yl
+zed d
+le ys
+pla ques
+flu ori
+tipper ary
+on nell
+di dier
+lang ford
+im c
+the sun
+bir dies
+ar cha
+ye ssss
+t di
+dar ia
+cand ace
+al tam
+pal aces
+ch it
+sant am
+event ful
+book of
+ad b
+mon stax
+cre ole
+co el
+âĸ ½
+we aren
+sten nis
+she ath
+ati sm
+gron ingen
+mlpfi m
+le pre
+wrong ly
+rsp ca
+rendez vous
+acknowle dging
+pel vic
+solic itor
+sla ys
+nue stra
+lo d
+is lander
+fer oci
+fashion show
+ra ss
+dge on
+adole scents
+sma shes
+negli gence
+grate ful
+ved ere
+sw oop
+ing l
+apol ice
+vand alism
+gan n
+jo ao
+di supdates
+zimbab we
+under age
+radi ance
+w of
+bour geo
+pla s
+cr ani
+gh ue
+wrec kem
+warran ts
+re form
+jim mie
+at wood
+ys l
+neil himself
+l bj
+i man
+tan to
+nois se
+ver bs
+equip o
+al together
+mam ent
+l ice
+dou glass
+tier ney
+pri med
+j hal
+furn itu
+braz ili
+v ill
+past els
+n ison
+u ff
+paral ysis
+jay e
+im po
+ðŁij ģ
+strate gically
+pakistan is
+was sup
+super bike
+thank u
+tru elove
+sha ikh
+israel is
+vi p
+to g
+li en
+la ker
+grey hounds
+cul ars
+bian chi
+balot elli
+ar ran
+loo s
+str ates
+he bron
+ar vo
+sunder land
+the al
+tomb stone
+sand man
+c pac
+thanks giving
+love him
+lat ino
+an in
+aka if
+ĭ ãĤ
+tor quay
+di est
+alli anz
+ðŁĺ ķ
+golf club
+cl lr
+wal cott
+sch nau
+promp ted
+nomin ating
+len nox
+val et
+mon ro
+may ward
+e ph
+ðŁĶ Ķ
+inter oper
+r da
+re flex
+arm chair
+ê° ķ
+stri pper
+por ti
+ph arm
+ham za
+ni reland
+ne ue
+h pv
+port foli
+sun burn
+fris bee
+be al
+bapti ste
+x h
+ty m
+pr ati
+o vers
+haz rat
+deser t
+der ry
+us ky
+em mett
+ach arya
+)_/ ¯
+shu d
+may a
+ham ill
+ra im
+nr c
+fitt ings
+cur vy
+ðŁı ĩ
+ster ling
+ॠĢ
+wal kin
+short cuts
+mil ly
+ast ur
+alpha be
+pl i
+pe z
+miss you
+rad ford
+ml g
+ta eyang
+notjust lakes
+du mps
+seren dip
+le ur
+ra ving
+e ster
+de priv
+absc bn
+ðŁijĩ ðŁı»
+scar city
+o cr
+mean ings
+cap t
+da hl
+fer mentation
+bri oche
+to win
+out lander
+massi mo
+en cro
+ðŁ¥ ³
+buil t
+po tam
+kir i
+tm w
+monit ored
+k ites
+peoples vote
+gray son
+íģ ¬
+afri ka
+a dies
+i vote
+gy ne
+g annon
+di x
+c mc
+ou ral
+fox andfriends
+bel i
+ig ne
+gl an
+katrin akaif
+co politics
+qual itative
+p si
+lu cci
+disc oura
+âĺ ®
+kel li
+gau tam
+carac as
+reale st
+pu la
+in us
+hill top
+make aw
+atten borough
+tw y
+r arity
+peck ham
+ma hon
+corn elius
+clin icians
+ton line
+tb i
+paradi se
+ka si
+inev it
+fresh ness
+colling wood
+lun atic
+defen se
+cop d
+in fra
+wain wright
+sains bury
+alab am
+te ma
+lac o
+chec ker
+releg ated
+tren t
+stal ks
+huff post
+bhubanes war
+ast ral
+share your
+prim rose
+hi me
+cat an
+end ment
+en dow
+cle mens
+mal oney
+hil ary
+game time
+den ise
+collabor ators
+b wo
+radic als
+gue tta
+ici on
+au a
+snap matic
+sat chel
+excav ation
+base man
+s ão
+gn ation
+fel d
+surve y
+shah zad
+ma st
+anirud hofficial
+tru cker
+ot ago
+geo graph
+ethe l
+âļ¡ï¸ı âļ¡ï¸ı
+s ver
+mu tt
+internetof things
+ancho red
+wh ouse
+bang la
+bal main
+ç¹ ĭãģ
+break fa
+á Ģ
+twi ster
+te tris
+ca v
+stag s
+g z
+au b
+stor med
+hel ens
+yar mouth
+st asy
+gustav o
+co sc
+vin son
+up p
+sc ricket
+assump tions
+app e
+nu h
+u er
+pre mise
+n aga
+e amon
+coron ary
+na f
+north side
+el mer
+ro tar
+out lining
+el f
+re surg
+kat elyn
+in can
+hyster ia
+ce e
+am bani
+pro lly
+Į ãĤĬãģ
+ax es
+san jose
+rem brandt
+mag pie
+even ly
+scor sese
+qu aint
+f g
+b buk
+indian football
+weare all
+spd wy
+pis ces
+ec g
+âĺħâĺħâĺħâĺħ âĺħ
+pre orders
+: |
+ni pple
+sal azar
+ju me
+jail break
+min n
+bas sett
+ze tta
+jef free
+ad jun
+tic on
+san diego
+drink local
+chol era
+solic itors
+o bo
+com post
+ni an
+wr a
+tre ach
+ic ic
+profession al
+del ve
+leg ate
+histor ia
+cro issant
+con noisse
+nam o
+palli ative
+chem trails
+i ority
+global warming
+comic art
+behavi oural
+re sted
+li as
+cli mates
+Ł ãģĦ
+rut land
+nou rish
+menopau se
+hot ties
+demen ti
+ve spa
+mel ville
+anal ogue
+tz man
+str ung
+im perfect
+gl are
+cir cling
+ros berg
+rec o
+oc ity
+lo ire
+em be
+do ssier
+ne el
+nan do
+me a
+gal vani
+fin esse
+ag p
+berke ley
+asi m
+âĺº âĺº
+quil ted
+ish ere
+un matched
+po tion
+for z
+at re
+selfi es
+juli ana
+ðŁļ ¶
+âĸ º
+mel ton
+âłĢâłĢâłĢâłĢ âłĢâłĢâłĢâłĢ
+spin rilla
+pur cell
+ed p
+at leti
+tony awards
+ra ja
+pro gno
+mol ten
+stu ff
+p ally
+nobel prize
+âĻ» ï¸ı
+spiritu al
+spe ake
+sa sha
+bri um
+tru ss
+critici ze
+assassinscre ed
+yor uba
+u lo
+fire man
+workin progress
+ef cc
+fla res
+ro bot
+hi kers
+cl l
+shado wing
+pat sy
+leh man
+c ns
+å ±
+guad al
+à± į
+ra pe
+r honda
+paralle ls
+son ja
+langu age
+land ings
+z ola
+cr amps
+bur ning
+apprais al
+jol la
+ham m
+kas a
+gul ly
+f go
+uly sses
+ri be
+ðŁĴ Ħ
+ib u
+eti enne
+bri ar
+fin ely
+comb ating
+y ql
+go tham
+we chat
+to paz
+primar ies
+l se
+iz z
+hel e
+dispon ible
+cy stic
+bel ichick
+th rush
+kansas city
+ge om
+soli di
+red bubble
+by stand
+cambridge shire
+par fait
+ast le
+ow o
+ind ore
+stom ping
+sm elly
+ðŁ¤ ĸ
+locom o
+adm itting
+hol me
+clock wise
+min sk
+mc co
+for get
+ev p
+cam ra
+ab ella
+yo tes
+universit yof
+mé xico
+silver ado
+ric ket
+crom bie
+pu j
+eradic ate
+deli ght
+y go
+glam ping
+vic a
+du ggan
+coun ters
+cf d
+sc our
+react js
+pu ram
+paras ites
+in ki
+vill en
+stel la
+li mbo
+ang as
+k cr
+ðŁĴļðŁĴļ ðŁĴļ
+vap ori
+mum ford
+oli gar
+à ¼
+al oo
+boo ties
+ad r
+k elli
+dru mmers
+av ici
+nature uk
+ron al
+in trac
+un splash
+le che
+g oma
+el ine
+envir o
+bi onic
+bu eno
+mi k
+av in
+star ling
+em powers
+cake day
+boy cot
+ðŁĴļ ðŁĴļ
+ðŁĮ¸ ðŁĮ¸
+v ach
+m ci
+fractu res
+ger i
+sk ing
+exclu ded
+lu ce
+ja ve
+ig gy
+evi den
+aki stan
+a wn
+mor als
+luci fer
+ha ban
+tumb ling
+sunday motivation
+mo sley
+captain america
+sch icago
+the one
+mo td
+d ts
+ðŁIJ ¼
+rep ell
+ii i
+locu st
+geo spatial
+mer sey
+immer se
+desc end
+ber nade
+j s
+boat sales
+win der
+cran k
+sing leton
+candid acy
+ben a
+ðŁı» âĢį
+high lander
+ol t
+k prs
+healthy lifestyle
+four teen
+end the
+ith aca
+circul ated
+r ans
+pre valent
+ha vas
+splend or
+roo ster
+kalamaz oo
+jewell ers
+enne dy
+rou sey
+es y
+cann ons
+ornam ental
+// //
+ren don
+win ne
+mol ding
+eid mubarak
+coun tess
+simon a
+ha wa
+fo es
+du ster
+sb u
+por tray
+mar ries
+goo dday
+cho co
+achi ever
+ðŁĺ¹ ðŁĺ¹
+pre neur
+tr amp
+tom i
+n bat
+garden chat
+farra khan
+ever glades
+ab ru
+sou sa
+se ce
+homes wee
+terre strial
+bar it
+sri devi
+ol u
+mel inda
+f rick
+can dies
+ðŁĺŃ ðŁĴķ
+qu reshi
+family fun
+exor cist
+cardin al
+ny t
+dies el
+cu mulus
+capric orn
+si ology
+lor na
+dou gie
+an die
+super sport
+c fl
+п ÑĢи
+say ang
+pe ek
+ภĬ
+lo be
+j em
+ing lis
+gg led
+c sn
+amne sty
+chu ps
+ba es
+sau er
+ðŁı IJ
+mongo lian
+en et
+back street
+dr illed
+acce ssing
+ce o
+b se
+ai ken
+pur r
+wor sen
+whe res
+war k
+testi fying
+bu ri
+bla st
+aw g
+ðŁĵ ĭ
+re defining
+hear ing
+u ci
+c mp
+bon i
+tail oring
+ta ji
+noc chi
+em t
+stephen king
+ne et
+compla ins
+campaig ner
+luci ano
+twili ght
+ti esto
+pas sports
+flo yd
+cathe dr
+na ked
+caregi ver
+b coz
+ade cides
+ku ri
+ly k
+br aries
+dren ched
+disc lose
+ðŁĴª ðŁı½
+le blanc
+je tty
+gar ty
+chip mun
+b su
+rhyth mic
+ic z
+fri d
+anne x
+ame x
+solo ist
+lanc ers
+arro whead
+speci fication
+simul ated
+na is
+inver te
+bo wing
+wor ship
+f z
+abo ss
+sha q
+ì¶ ķ
+challeng ers
+an arch
+aamaadmi party
+ãħĭãħĭ ãħĭ
+suffol k
+so corro
+sn ell
+cla dding
+absor bing
+shaw a
+particip ates
+ðŁį Ķ
+book stores
+bak u
+seap ort
+ko jima
+gab y
+pack ard
+electr ician
+let it
+mo wing
+fa wad
+young jae
+hot mail
+men ing
+u rie
+intim acy
+con ti
+: ")
+lifeis good
+in ciner
+i dri
+craz iness
+jour nos
+fran chi
+bott len
+al da
+ff es
+k x
+south we
+air a
+clay ton
+sco ti
+f j
+bri ga
+ð٤ĺ ðŁı»
+demonstr ators
+y z
+stor k
+na q
+casc ades
+travel chat
+plat a
+pad ma
+fran ci
+at tain
+bat girl
+lom bard
+hoo s
+d dos
+neon atal
+discla imer
+r ss
+r ant
+di sen
+tex aste
+so cal
+frac tal
+cam ry
+stri fe
+sn acking
+mu h
+sant ander
+mor ons
+gra f
+par ades
+hu ston
+dru pal
+mi ento
+kir stel
+hy de
+vom it
+forti fied
+sphin x
+da v
+bir yani
+win nings
+s baseball
+mer ged
+lovel ondon
+ling ering
+dream big
+car leton
+liveli hood
+djan go
+astri d
+gri ds
+down e
+bru ised
+s ne
+scarec row
+hel ium
+f nc
+bi ggs
+an ter
+restor ative
+em pires
+ab del
+life style
+kiwan is
+colloqui um
+me en
+pr ick
+anti que
+ze b
+mi mic
+edmon ds
+ðŁijĬ ðŁijĬ
+q ing
+pp el
+mc gill
+interpre ting
+âŀ ķ
+rash ad
+do ka
+narr ator
+electro magnetic
+ash by
+sau ra
+iran deal
+âģ īï¸ı
+krish nan
+in di
+ff en
+bre a
+os man
+multin ational
+chi ppe
+recruit ers
+aus biz
+p ounding
+re gen
+cur sor
+refu sal
+mac s
+in ak
+ax ial
+wa ifu
+up cycled
+hindu stan
+cas sini
+carly le
+scrat ches
+re ef
+man atee
+eat ery
+ðŁĵ ¢
+un condition
+sen pai
+on ther
+comic book
+pro sciutto
+de mar
+mi se
+ma ge
+fre ec
+aye sha
+al der
+android games
+ley ton
+ho ck
+door way
+chicagof ire
+aali yah
+sw elling
+bi x
+. ðŁĺĤ
+evan kirstel
+torpe do
+kon stant
+genevie ve
+ma ia
+ha user
+do torg
+hide ous
+fi k
+sp raw
+e ek
+z appa
+wan dered
+' '
+ra jan
+bam bi
+( $)
+wid ening
+tool box
+sa ir
+illumin ating
+pra ys
+out patient
+i w
+day o
+lo b
+sw fl
+sha des
+gu ms
+coo kin
+ko di
+gri ffin
+traum ati
+ste a
+slaugh tered
+god bless
+air time
+pseu do
+b sa
+hau led
+ar if
+à¸Ńภĩ
+le l
+wc po
+mil iti
+char ters
+worl da
+ru k
+k gs
+digital india
+is able
+idyl lic
+esp ino
+marie tta
+e bo
+team canada
+ab our
+wil ton
+rock stars
+fav ored
+phys ic
+wrink le
+tb r
+d print
+ball arat
+ad al
+z ey
+ðŁĺį ðŁĶ¥
+tom lin
+mt r
+pal sy
+fener bah
+tight en
+phil ia
+ir oning
+ry u
+b ant
+enqu ire
+ca ir
+abur ger
+tru n
+green berg
+chau han
+ir ina
+sh ani
+trend setter
+pre tt
+zaf ar
+alo ve
+v ici
+pan ic
+no o
+lu stre
+disrup ted
+bal lis
+son sof
+mon si
+inst ac
+ake st
+ëĭ ¤
+kw ame
+horror movies
+distric t
+sau cy
+mb an
+ar mies
+with drawn
+med ics
+loft us
+er oom
+be kind
+ar ns
+all on
+un ison
+davi ds
+cr at
+nicot ine
+so or
+sm x
+on co
+cospla ying
+zombi es
+har ms
+e ger
+ro sy
+moon shine
+fe in
+ce tt
+du brov
+reg ents
+ben itez
+ðŁijıðŁı¼ ðŁijıðŁı¼
+ste c
+m alia
+prioriti ze
+ic eland
+ft se
+v amo
+lam ont
+homo sexuality
+bre es
+regu i
+cb p
+te j
+sky sports
+deter gent
+sha sta
+de rel
+conserv ancy
+colori zed
+accol ades
+vis o
+show your
+nan ow
+bice ps
+us ability
+bi m
+dailys ketch
+pearl jam
+stran gest
+mega deth
+broad casts
+bar ren
+ar ton
+chri ss
+confi gu
+lu res
+is the
+e ul
+railway ana
+global health
+gi anni
+u aap
+s lum
+consci ously
+ab re
+n up
+bud get
+v ada
+e sch
+real ness
+er ased
+th unt
+be z
+armist ice
+ðŁij ¹
+sh run
+o led
+driver less
+ðŁ¤· ðŁı»âĢįâĻĢï¸ı
+won dr
+sk an
+sal aam
+mother land
+h wang
+gen o
+gang nam
+tw right
+endor sing
+en ic
+ador ation
+pau sed
+patric ks
+do cked
+plat te
+ff xv
+ethnic ity
+auto show
+side show
+after life
+re located
+orphan ed
+food network
+dare to
+and ra
+sla ps
+v live
+swim s
+re imagined
+mist le
+re vise
+real ity
+bhar ti
+ðŁĴĻ ðŁĴĽ
+late st
+prou dest
+gra sses
+lan yard
+fresh est
+carcin oma
+anom aly
+zieg ler
+sum ner
+ly rix
+gor g
+is d
+av el
+swild life
+me squ
+john cena
+euro league
+sab er
+master ful
+yar ra
+cogn ition
+jacob son
+abo lic
+sir loin
+shuk la
+moj ito
+su pere
+st weet
+me z
+e sa
+rudol f
+gur a
+where you
+tt m
+win s
+trust worthy
+ny k
+bra den
+table top
+good food
+es on
+be k
+lingui stic
+gra ys
+ch ath
+h cs
+mon i
+de ans
+cu ssions
+ch ell
+slo ws
+he mi
+d app
+shar pie
+boo sters
+a os
+str ack
+se dona
+mu eller
+hard wick
+or nate
+thor a
+sal ud
+o twol
+ch um
+mi ho
+for age
+thel ittle
+tear ful
+ones elf
+min dy
+sm g
+gmb h
+emer ald
+ðŁĶ´ âļªï¸ı
+tu tti
+recep tions
+re vising
+i brox
+tope ka
+sal ami
+expan se
+i books
+dob son
+cli o
+at s
+ðŁļ Į
+mo ha
+is ance
+shu tters
+moo t
+jan ine
+marvel comics
+jor dani
+pos er
+kenne th
+hy ung
+de ja
+ase ball
+speci ality
+eu ston
+classic car
+had ith
+ðŁIJ ī
+chas ing
+iz o
+gros ven
+ag lia
+thisdayin history
+t row
+om ile
+hu ar
+by n
+sal ine
+div ine
+demon ic
+ty ran
+han dover
+revit alization
+pa ella
+cryp tic
+se dg
+m end
+dun kirk
+bre d
+wal d
+sport scar
+a ard
+whe aton
+da ener
+k lan
+br t
+bakhta war
+spi res
+schu bert
+ro ti
+poli sh
+o se
+ag ame
+wonder con
+prote stant
+bo sa
+ðŁĺ Ł
+d ü
+joy ride
+ger trude
+âĿ Ŀ
+gil a
+v h
+tw a
+tra v
+swal lowed
+star ve
+la in
+ent ren
+rei ki
+su kh
+cra ic
+az u
+web page
+kee fe
+hypo the
+hir sch
+hel le
+camp ground
+w amy
+tra vi
+sha hi
+san deep
+ru i
+han uman
+dw p
+reposit ory
+no or
+no ff
+un real
+p ell
+black history
+har vick
+ma scar
+pay ee
+pa sha
+gastron omy
+d ÃŃ
+ai g
+rosen thal
+open day
+embelli shed
+t tip
+sun bathing
+go pack
+end ome
+ï¸ı #
+invali d
+final four
+st fu
+squish y
+ra sta
+mo sch
+jam esc
+die trich
+sel a
+mel b
+el vi
+t dp
+sun i
+sli t
+j ha
+bi za
+spi ked
+l li
+l illard
+vam pi
+syno psis
+az har
+kendrick lamar
+ĮãĤĬãģ ŁãģĦ
+heart less
+country file
+air play
+arrog ance
+pre e
+virtu oso
+ãħłãħł ãħłãħł
+raj u
+le bu
+for ward
+tu g
+dro s
+mondaymotiv aton
+concep cion
+thel o
+pad i
+looo ol
+ÑĢ Ð¾Ð´
+it ss
+eth ical
+end uro
+__ :
+expend iture
+mon ste
+mas king
+terri ers
+ib is
+e mber
+cu mple
+punctu ation
+pi per
+ir vin
+ade e
+yy yyyy
+flash backs
+cel sius
+don nie
+bo gota
+ben evol
+the script
+shil pa
+pro se
+fin dia
+ze ke
+ne ko
+do ves
+blues lyrix
+fro sh
+sowe to
+mp lo
+al ai
+sab i
+raq qa
+wf tv
+stro ller
+ian somerhalder
+ðŁĶ ª
+an on
+mo seley
+! ?!?
+sta king
+mol y
+car tri
+c sg
+ast or
+transc end
+ma er
+de ux
+cow girl
+sas k
+pun ter
+ma ken
+o ates
+love tt
+grow ler
+sag in
+v n
+ssi ble
+officeof rg
+y mc
+sab ar
+faul ty
+ap ha
+ak on
+ðŁij «
+snow don
+ae w
+raise the
+ðĿ ĵ
+grue some
+clement ine
+sp ing
+lat a
+worlden viron
+mi mic
+can aria
+bakhtawar bz
+ao a
+fal a
+ãĤ Ń
+avi va
+you uuu
+thi gh
+la dders
+gu mbo
+tz ky
+fu zz
+plastic pollution
+est ate
+strength ened
+k ant
+dr in
+cal vert
+transform ational
+frigh tened
+mac lean
+elited angerous
+ear thy
+t son
+to da
+j nu
+.. ,
+mic hal
+i ban
+je ong
+is real
+sim coe
+exclu sives
+blue bells
+ben e
+te u
+pil sner
+pens ke
+athe ists
+m pu
+cartag ena
+ðŁĴĹ ðŁĴĹ
+million aires
+kk kk
+it ar
+subscri ptions
+remo te
+ma fi
+hin ton
+w cc
+ho k
+ds b
+ab leton
+sevent y
+pun ks
+e indhoven
+sh one
+mcfar lane
+lim popo
+empha si
+Ã ¼
+sin fo
+pe tre
+man grove
+ch ino
+ber tie
+play lists
+push awards
+p af
+deb bie
+c do
+r ino
+ðŁı¾ âĢįâĻĤï¸ı
+fol ke
+bon nar
+th ine
+sl an
+hal ter
+evi e
+aw some
+vul tures
+spar ky
+seiz ures
+âľ Ķ
+ram one
+ine ffe
+al n
+pro ctor
+ast ra
+the voice
+gro te
+sci on
+dead line
+am aya
+tain ted
+patter ned
+exce eding
+cross fit
+kay lee
+drop box
+ru shes
+tack led
+mo by
+retro gamer
+n cbd
+benef itting
+shay kh
+guild hall
+gen try
+dream cast
+dread ed
+bun dled
+th aw
+revol ving
+n pt
+kylie jenner
+imagin ative
+ron i
+over came
+family time
+ds burg
+car naval
+relation ship
+recogni zable
+cor oner
+ho le
+fan fic
+emir ates
+bur ritos
+analy se
+thin ner
+ne es
+galli poli
+bl r
+cat woman
+-- >>
+au lt
+ada ily
+nau ghty
+ili o
+solit aire
+mtv br
+jocel yn
+arun ach
+rep ent
+south gate
+hy acin
+essenti al
+fent on
+and um
+it or
+go pal
+sl inger
+po sei
+aw il
+wi elding
+ra ila
+eli as
+a sto
+Ã ¤
+tend ency
+str ata
+ker t
+< -
+im acele
+da es
+sti mulus
+han ley
+fit nes
+ec stasy
+lim ous
+ha iling
+ðŁ¤ Ń
+chis wick
+tar ies
+sla v
+pul i
+moderni zation
+black mail
+b ingham
+h fx
++ +
+ðŁĩ®ðŁĩ ³
+ni v
+we a
+profess or
+k off
+bol ster
+su ave
+sequ ences
+pepper oni
+not te
+dre n
+ãģ¨ ç¹ĭãģ
+hs v
+o ga
+ap tly
+z ad
+excel si
+rin ka
+mol dova
+min n
+ma bel
+conferen cing
+bas ing
+of er
+ob si
+hamill himself
+care less
+brief ed
+inhe rent
+par ish
+dub nation
+town sville
+sar awak
+gee ky
+doncaster isgreat
+was abi
+gu p
+phen o
+dra inthe
+carrie underwood
+ble eds
+bbc world
+ane w
+alta f
+dul wich
+ani ston
+w ti
+sumat ra
+gra fton
+bl n
+me ster
+bode ga
+re go
+es q
+an jo
+sump tuous
+mai sie
+ï¿ ½
+wil t
+jak ob
+el vis
+se pul
+mu ster
+air pollution
+president e
+happy monday
+exten sively
+fl ondon
+t ls
+play ing
+pe ed
+din ho
+var dy
+pi ka
+n iro
+au cus
+ðŁį ¦
+nu ll
+el ondon
+juvent us
+imag ines
+dis ab
+lit o
+d ura
+work places
+promo te
+mc caf
+wood work
+waw x
+à® ª
+tt ino
+shar i
+sem per
+better together
+ðŁijĬ ðŁı»
+ze bra
+pon dering
+en chil
+ho m
+cosm ic
+tan z
+mo cked
+ec cc
+ath ed
+abo lish
+prop eller
+paris agreement
+assemb lies
+indu stry
+fraudul ent
+pe sa
+chang min
+ax x
+ðŁĴ µ
+irr ational
+cu sa
+ramad han
+octa via
+on elove
+jac ki
+bar ak
+taxi der
+seri ous
+nathan fillion
+mc en
+ch k
+po part
+grav ity
+copp ola
+reading fc
+illu sions
+j ig
+ww x
+re sh
+ex porting
+buzz ard
+âĻ ¤
+p cm
+lan apar
+ko s
+arom as
+antal ya
+ww dc
+ven a
+phil a
+ball in
+ðŁij Ħ
+quin ta
+ma o
+f ery
+eigh ty
+sentim ents
+safe guarding
+r wa
+pu ffs
+luc ille
+de cath
+sl u
+nu gent
+de ter
+braz il
+ze iss
+super bowl
+subsi dy
+alter n
+hi dalgo
+enz ymes
+ä ½
+tag ne
+hair dresser
+adri en
+walk out
+oppo ses
+can tina
+bed side
+af an
+ðŁĶ Ĺ
+prophe tic
+dan es
+un successful
+super charged
+pk k
+exem ption
+hart le
+secu lar
+cli pping
+br s
+united way
+c net
+pat chy
+ha gan
+e en
+âļ ľ
+var a
+sym pathi
+never trump
+affir mation
+om f
+ny cfc
+ma ja
+sur ro
+keer th
+up scale
+sandal wood
+mon archy
+kno bs
+å ĭ
+po tholes
+hunger games
+ter races
+na sir
+coun sell
+welcome to
+wa q
+se aman
+m ita
+stun ningly
+on theroad
+in ability
+) !!
+bon go
+ant v
+sp ut
+worldenviron mentday
+resu sc
+y td
+fi m
+eun hyuk
+sa chin
+rose anne
+cler mont
+ape c
+am ina
+v ening
+n antes
+al most
+sin us
+ex as
+ty l
+ti en
+ple ad
+lanc s
+bur naby
+re k
+jo om
+observ ers
+disco graphy
+cl g
+âĻ ¦
+sn ack
+r ti
+o ily
+crystal li
+bru te
+web development
+topp ings
+la f
+an is
+ad der
+reli ving
+car lin
+battle of
+we g
+syri an
+pon t
+n dc
+lagh ate
+yu ma
+sp p
+p iti
+ro bbing
+mart ing
+rey kja
+raj put
+nc ds
+kie wicz
+âĢ¢ âĢ¢
+vam pire
+substan tially
+opio ids
+nepal i
+k line
+ar oo
+under stand
+lit t
+u it
+thro mbo
+sar ies
+qu ot
+b alling
+t tr
+s gh
+philip p
+br ant
+ac l
+m ello
+whit taker
+. ;
+defi ant
+b gc
+repl ying
+mir ren
+metamor pho
+sch wab
+bul ge
+utili zed
+pick ering
+par don
+d sa
+ภĪ
+doo ley
+cumul ative
+Ð »
+ur gency
+e mir
++ /-
+¦ Ī
+ot as
+âı ³
+station ed
+grape vine
+ar ac
+karan johar
+f ancy
+sau l
+coo gs
+lgbt q
+ا٠ħ
+jav i
+u mmer
+pl l
+den is
+dai pur
+pu ffin
+lewi sham
+fand om
+co pe
+ves matter
+s ve
+hel pless
+deo dor
+ostr ich
+kaz an
+friday the
+con dor
+v x
+sophom ores
+rob les
+cu tt
+cli mbers
+ë¦ ¬
+sle g
+sn f
+mac ys
+hydr ating
+grou pe
+po yn
+mou lin
+hg tv
+lmfa ooo
+sulph ur
+asdfghj kl
+annab elle
+hump back
+bra ved
+viswas am
+multi purpose
+hu midi
+escor ted
+barb ican
+f ad
+cor sa
+ðŁ¤ «
+pi ppa
+here to
+can y
+ser gi
+or cas
+o vie
+ed ou
+s any
+glob alization
+man cini
+food truck
+f is
+defi brill
+sch re
+sma fia
+love wins
+la ut
+k aka
+hol lande
+game on
+resurg ence
+out side
+olympi ad
+int an
+abstr action
+rapi d
+pal om
+cal le
+jas min
+attack ers
+swag g
+mit ra
+ky lo
+à® ²
+her mitage
+gor do
+e ira
+so sfam
+roll out
+exc ite
+sy nod
+mer rill
+c als
+as sa
+liveli hoods
+ju ve
+the black
+gopack go
+ant lers
+alban ian
+wool ly
+qu iche
+puri fication
+are th
+smar thome
+ne k
+all blacks
+mex icans
+is m
+ger ms
+comple xion
+mar ck
+u shi
+ðŁIJ IJ
+char l
+ca stic
+till erson
+giuli ani
+biode gradable
+mal bec
+bo is
+ju bil
+im es
+r ame
+gene tic
+esp nu
+ch ley
+so ho
+go pher
+g sc
+buu ren
+cu be
+bridesma ids
+webin ars
+to e
+mani pur
+viol ently
+notic ias
+ex changing
+chi ev
+replac eable
+muay thai
+bu ss
+sp il
+instal ment
+div ya
+cait lin
+o lim
+fil tering
+whirl wind
+sta red
+prior it
+pr am
+pompe ii
+mono logue
+k ite
+bu ka
+â̦ ..
+vac cine
+bre ro
+woz ni
+sol ent
+re ferr
+my rt
+gridi ron
+galatasar ay
+fro ze
+clare mont
+ðŁ¥ ĥ
+victori as
+ssel dorf
+pa stures
+net neutrality
+ch or
+ðŁij ģ
+ಠ¿
+we ho
+symp tom
+jo sel
+in ous
+dragon con
+power ball
+p te
+four thofjuly
+ec la
+ear buds
+where abouts
+salt life
+depriv ation
+ch ter
+wi ggle
+syste m
+ps st
+ch az
+d any
+ri mo
+oax aca
+lanapar rilla
+barcel on
+melanch oly
+way back
+ho tro
+n si
+l illy
+kur o
+ja han
+intellec t
+board game
+ðŁı Ĭ
+sneak peek
+k prc
+jail s
+cand el
+zan zi
+mor timer
+star ch
+ra gs
+p fa
+long live
+k art
+gir ona
+cro cker
+christop h
+precau tions
+war ship
+per m
+paren t
+van gogh
+gif ford
+allegh eny
+ra yn
+ut m
+sten cil
+rec alling
+pen ney
+z azzle
+ìĥ Ŀ
+hin ds
+aren as
+nu ev
+law ler
+gu in
+do this
+ðŁij ķ
+ì¶ķ íķĺ
+we g
+ti b
+ri din
+complex es
+turbul ent
+pe sos
+de marcus
+vall arta
+sam sun
+kis ses
+hein rich
+deport es
+wil ms
+ur d
+then ext
+inki gayo
+ho wi
+fir sts
+carri age
+clean liness
+mas war
+is ch
+ax el
+si zzle
+road house
+fr ans
+ent ourage
+co bble
+boo th
+benedic t
+tal on
+fc u
+year ofthe
+ray on
+raider nation
+fo yle
+ko val
+pi anos
+l pg
+bur mese
+man ure
+geo caching
+cosc ino
+b np
+fer ra
+stro phy
+mar ais
+ce es
+legen dof
+kat niss
+eno ch
+av ed
+you know
+d prk
+ðŁĺ¢ ðŁĺ¢
+sp un
+pro st
+sor rows
+cent red
+ke a
+gal icia
+? ð٤Ķ
+ÑĢод а
+bou chard
+ðŁĴĻ ðŁĴľ
+yu i
+seed lings
+jon ah
+reco vers
+ny rd
+board room
+su ma
+my japs
+tun g
+sha i
+ir gc
+eli o
+wag ons
+ka shi
+polic emen
+john nie
+ale coscino
+shop ify
+dot ted
+de tri
+va w
+to fficial
+in your
+chal mers
+trac ed
+no vi
+by es
+ari el
+nipp on
+la pel
+gri ez
+b gs
+fool ing
+d ita
+vijay sethu
+nm wx
+as ot
+kr anti
+hel m
+ve di
+sic kest
+mo chi
+k abo
+shru bs
+he red
+b sp
+sq m
+ham r
+dul kar
+anth a
+nr f
+avoid ance
+at en
+publi x
+be arers
+nas i
+ha p
+h ells
+ðŁĸ ¥
+ภ·
+thelast jedi
+oh wx
+ðŁį «
+wa hoo
+there se
+rec aps
+ss nhq
+bird photography
+v ay
+pet ti
+pau lo
+bel vedere
+( *
+gr l
+du vet
+c pec
+sa it
+por sch
+meas urable
+avi ators
+fre mantle
+bre en
+on om
+me and
+life saving
+eu ref
+en don
+embar as
+aira sia
+el is
+dun kin
+star magic
+s ill
+porto bello
+ki efer
+ex e
+mu ted
+ãģ ¦
+we thepeople
+logi a
+liber al
+theforce awakens
+min ed
+haun ts
+freck les
+care taker
+s india
+âķ IJ
+dev lin
+list on
+direction er
+oh n
+fi garo
+em manuel
+du bois
+cl ones
+bru ise
+ðŁİĪ ðŁİī
+disin fe
+der matology
+as r
+s watch
+dis comfort
+tam anna
+pi day
+mack en
+k atic
+delu sional
+shaw nee
+gu d
+al bino
+p ali
+din gh
+cucu mbers
+coffe y
+anticip ating
+treas ured
+web summit
+shel tered
+sav or
+pedago gy
+m gs
+sh ma
+s bu
+den ali
+cam pos
+bubble gum
+o ir
+le aps
+y ler
+r one
+sansk rit
+min t
+meat less
+futuri st
+du de
+a vel
+prote sted
+squ ire
+z aki
+sz n
+har court
+cycl one
+bour dain
+gather ings
+d ant
+advent urer
+parag on
+alt man
+dd ing
+ban erjee
+snorkel ing
+mother well
+mis sy
+en der
+glo ws
+ki wis
+chick pea
+por o
+e fron
+app t
+u y
+speci fied
+gab by
+e strada
+com bos
+bour bon
+vin i
+var un
+steph ani
+key words
+car vings
+amit abh
+wr ought
+tw al
+re els
+clu bbing
+ubi quit
+cri t
+ambed kar
+æ Ļ
+prun ing
+vaccin ated
+boe ing
+s ks
+lo ona
+hypno sis
+edel man
+pho l
+he w
+colo sse
+mckin sey
+u on
+to te
+sacrific ing
+ox i
+n ang
+e mu
+пÑĢи ÑĢода
+m th
+kers wednesday
+argu ed
+timel apse
+ris king
+regul ating
+ni gh
+likeli hood
+cu bic
+au ction
+rein for
+pi stor
+no ses
+ye l
+snu ggles
+pe i
+jean ette
+ta ku
+ri th
+guy z
+ภŀ
+y te
+ver ted
+pay soff
+jau regui
+hoo ligans
+procedu ral
+mi b
+har dy
+el eng
+chec kers
+all ine
+the met
+prou dof
+keerth yofficial
+collabor ator
+ni u
+infl icted
+adv ani
+re twee
+memor iam
+f icial
+ti ghter
+sal em
+re viewers
+br ics
+ben digo
+am ell
+tur kish
+sush maswar
+paul son
+pal awan
+mol lie
+stitch er
+s burgh
+ir u
+hay dn
+en ers
+aro a
+u zzi
+saraj evo
+hel a
+apol lo
+nine ty
+vac a
+sp on
+vent u
+jel ena
+hei fer
+avo ids
+sp ine
+pri ze
+mar ist
+re creating
+me de
+woo den
+find lay
+ro fl
+n di
+compreh end
+yu go
+y ü
+to work
+u fos
+son ar
+pi ston
+recor ding
+tent ative
+art forsale
+pel lets
+fre do
+ÙĪ Ø±
+mu ses
+custom ization
+pro found
+is ner
+ide ally
+si am
+plan kton
+cm dr
+man ger
+fran ken
+customiz able
+ठ®
+walk away
+swi vel
+vast ly
+no ton
+lex a
+ex moor
+z as
+tan te
+reduc tions
+lol ly
+hip sters
+benef ited
+ë ²
+ww www
+mascul ine
+fi ji
+dre y
+ph ill
+ane ous
+nic ol
+men dez
+disapp ro
+ch ner
+through s
+shen mue
+east man
+ðŁIJ İ
+yu ck
+under tale
+re ys
+go beavs
+eng en
+c na
+mer r
+bir k
+ãģ¨ç¹ĭãģ ĮãĤĬãģŁãģĦ
+âĥ£ @
+yn na
+ste ed
+offen der
+at um
+vani shing
+presi denti
+love them
+g nocchi
+fri ggin
+per il
+mad hya
+ag ne
+dee jay
+mar nock
+m tb
+fold able
+@ ___
+stand re
+bron x
+bow ski
+fin ite
+cro ckett
+b sf
+ge tit
+seren awilliams
+mir o
+ignati us
+sla y
+rin se
+fon due
+sel dom
+s more
+gan i
+dy ce
+dmit ry
+cru mb
+late post
+pri mark
+oh ana
+flor als
+do a
+remembrance day
+d ds
+azi one
+toon ami
+air port
+æĿ ±
+th ad
+fi st
+dine sh
+dr who
+ad words
+admi rer
+pro je
+kyrgy z
+à «
+manife station
+le wan
+j ic
+thi bau
+le ased
+van ity
+nouri shed
+never theless
+aug mente
+fu elled
+che ad
+wil shere
+ru di
+p z
+my co
+mor ro
+herbali fe
+hardro ck
+de man
+dre ality
+sp ades
+ce vic
+bha i
+bar on
+ultimat efan
+hou news
+to bi
+stru t
+ke el
+affili ation
+the masters
+sm al
+hu e
+este ban
+con v
+om nic
+datab ases
+co v
+ter ti
+st g
+snoop dogg
+metab ol
+leth bridge
+ðŁı» âĢįâĻĢï¸ı
+year ling
+residente vil
+nws l
+iy aki
+griez mann
+c ous
+ðŁĵĿ :
+tor ian
+sam i
+ðŁĶ¥ðŁĶ¥ ðŁĶ¥ðŁĶ¥ðŁĶ¥
+g are
+alli ances
+whit field
+we ther
+refin ing
+coy i
+kra ken
+ðŁĺĺ âĿ¤
+singul arity
+lil i
+h ns
+bol dand
+waw rinka
+misogy ny
+lo vers
+c q
+b dg
+ad ona
+gar ter
+women of
+sc d
+recogn ising
+mun a
+str ou
+sign alling
+lare do
+hell boy
+alek sand
+un available
+pedi atric
+as in
+mer ia
+ri shi
+futuri sm
+w ye
+polari zed
+e we
+pro pel
+in forms
+cre ase
+~ "
+arti ston
+like for
+heidel berg
+er ra
+life in
+len ny
+inter rupt
+cohe rent
+ca z
+vick ers
+le veled
+f bs
+cab ins
+bu mmed
+apost les
+we h
+ten don
+souven irs
+infu ri
+pier ce
+asse t
+m las
+go th
+di ggin
+ann as
+yl or
+th waite
+sw el
+pan era
+mur derers
+croo ked
+bs go
+ac u
+a on
+re an
+one of
+ko hl
+bloo dh
+pest icide
+lost dog
+fle xing
+ëĤ ĺ
+su pra
+eter nally
+ðŁļ Ļ
+pa olo
+ol an
+mom o
+is elle
+captain marvel
+s lou
+mistak enly
+akhi lesh
+mer t
+il inan
+bu on
+bal kan
+mir ro
+mill en
+der ail
+dam on
+tit i
+bi os
+re don
+pic ard
+par te
+ðŁ¤ Ł
+Ø º
+son ics
+fir sth
+dd c
+veg ans
+tur ban
+ni gan
+lot tie
+lyn don
+star buck
+pink floyd
+life styles
+am ara
+a she
+r sc
+val a
+sm er
+cw gc
+cli ent
+buen as
+jag an
+coo ps
+ðŁijij ðŁijij
+speci alizes
+snag ged
+g lar
+ben net
+wildlife wednesday
+bow den
+pi k
+art in
+empor ium
+ar l
+re ba
+pas ser
+disappo ints
+additi ve
+âľĬ ðŁı½
+bay er
+missou la
+ha skell
+comm ences
+ni x
+ne man
+explo ited
+plastic surgery
+cc d
+aso cial
+vo t
+sie gel
+fro ome
+kap am
+far a
+e ha
+pro bes
+mw f
+meet ing
+p bb
+ak ins
+mistle toe
+kingdom hearts
+for kids
+ec r
+bal e
+escor ts
+adidas originals
+k wa
+k ts
+hallo ffame
+ðŁĺį .
+wag s
+pot ted
+o wing
+honey comb
+he fty
+uro logy
+mer le
+b pd
+stri pping
+re ich
+k state
+gu ay
+yon ge
+shak ti
+g loom
+bat t
+son om
+n ery
+el ba
+blan ks
+hel le
+triple ts
+bom bay
+ak arta
+ab ia
+transm itted
+rol f
+ja is
+angular js
+fi erc
+m ss
+trac e
+ॠĩ
+tom bs
+old man
+kom bucha
+fo l
+e health
+cere als
+are lli
+in ari
+ðŁĴ ©
+wo l
+liber ties
+fa wn
+af firm
+nun avut
+hyster ical
+k drama
+art es
+âĢ¢âĢ¢âĢ¢âĢ¢ âĢ¢âĢ¢âĢ¢âĢ¢
+valent in
+man slaughter
+gal es
+eo in
+energi zed
+del s
+with draws
+st les
+sar castic
+ram esh
+incredi bles
+lock hart
+ya wn
+ultimatefan live
+oooooooo oooooooo
+mu en
+guru dev
+te er
+pe eling
+new snow
+lingui stics
+direc tv
+ag end
+uni lever
+ru ger
+han dedly
+ero se
+li mel
+the c
+royal ties
+fini shers
+nr g
+m gt
+fid get
+com ps
+bac on
+aggre ssively
+ab it
+ch â
+tar de
+slu gger
+q anda
+gre ening
+d ats
+ensla ved
+spec tor
+o ye
+fre ef
+b hand
+stop brexit
+mis conceptions
+cav a
+ðŁĺįðŁĺįðŁĺįðŁĺį ðŁĺįðŁĺįðŁĺįðŁĺį
+multit asking
+hou sel
+ferre ira
+cen time
+ank les
+jo dh
+hel ly
+fro me
+out tuesday
+nar nia
+bal aji
+l bloggers
+jyo ti
+ðŁį ĩ
+lan cia
+cap ri
+y ap
+nat ash
+down fall
+." âĢĶ
+Ã ®
+ligam ent
+coat ings
+ai ded
+hi ko
+fall ing
+encryp ted
+yeg food
+infringe ment
+cu di
+ce p
+ðŁĺį ðŁĺĤ
+tra d
+super rugby
+ed win
+wh iche
+vi meo
+lay ne
+in vigor
+he he
+dubrov nik
+bie ber
+u tr
+sham an
+op ers
+ham ill
+en ig
+di f
+ar um
+scrap book
+min h
+diver gence
+mckin non
+life time
+guter res
+wil le
+ple as
+patt y
+mic ron
+k z
+dom aine
+ru sher
+m ds
+ches ney
+screw driver
+âģ© ,
+sle dge
+hau er
+chan a
+stam ina
+sprink ler
+pl n
+he ff
+bol ton
+om on
+car rington
+accor dion
+jor ge
+inter ception
+in puts
+gu ll
+tran scription
+vanu atu
+it ical
+eth os
+tic h
+spac ey
+pee king
+u mi
+ha ger
+psycho tic
+illi an
+illi a
+bonnar oo
+an ese
+pu c
+laghate parth
+en hall
+econom ical
+dre dge
+% -
+u we
+tu bular
+scoun cil
+pe asants
+fl er
+tumb ler
+he p
+ford ham
+row ley
+initi als
+ev asion
+er nation
+plu gins
+coch ran
+c attle
+acid ity
+ðŁİĬ ðŁİī
+re grann
+jump man
+ef ace
+x ma
+patri archy
+esco bar
+cristi an
+tip ton
+nu eva
+hack ney
+back seat
+kill arney
+aid an
+sta dion
+simul taneous
+ida ho
+a je
+u th
+figu re
+clo s
+bur k
+volun tar
+rec ite
+macfar lane
+cur few
+bou do
+w gn
+sti x
+sla p
+scrat ched
+philli p
+jour ne
+ex pelled
+wa z
+u ke
+tati ana
+ou e
+ho pp
+dimit ri
+ðŁĵ £
+mato logist
+electri fying
+blu ffs
+bill smafia
+az cardinals
+y aa
+x mas
+shar a
+r ith
+g ills
+dre s
+bar ton
+authori zation
+imperi alism
+home of
+to do
+foot path
+band width
+visit spain
+moh sin
+erup ted
+mi ki
+insig nia
+mike l
+ss h
+ger a
+bank holiday
+aw an
+t weak
+star craft
+e al
+construc tion
+skelet ons
+le ep
+ine m
+bar clay
+ship wreck
+monsi eur
+yo h
+ron t
+form ative
+ser o
+le p
+horse man
+hoo sier
+haz mat
+cylin ders
+cen ti
+ðŁĴ¥ðŁĴ¥ ðŁĴ¥
+re em
+na ire
+mus ically
+gras shopper
+est onian
+termin ology
+ro main
+blogger rt
+tox in
+stan ce
+cultiv ated
+an ast
+ðŁIJ į
+shi mano
+go pher
+ene i
+recycla ble
+gam ification
+fight for
+c q
+avoc ados
+ke ys
+eli ke
+gly cer
+shak ur
+mobili zation
+gal ley
+expla in
+ex changed
+pe th
+obe dience
+illa ge
+en nis
+ãĥ ŀ
+wi v
+walla bies
+ma ar
+ig ers
+fin tech
+fin alized
+wo j
+meaning less
+in field
+onna ise
+e et
+bron te
+pass ages
+ðŁij §
+strick land
+northern lights
+lom ond
+h tc
+wr ay
+shi fter
+di alog
+ðŁį į
+>> >>>>
+te atime
+ste ch
+sic huan
+qu ill
+fran ca
+comple mentary
+bar rington
+marcu s
+mal am
+goo oo
+for sa
+elec tra
+af s
+âĹ Ĩ
+tri fe
+sn azzy
+fo lia
+and olan
+after dark
+wood son
+stra de
+litt lest
+o gun
+con wy
+co wards
+ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤðŁĺĤ
+íĬ ¸
+se ul
+mur phy
+dun ks
+kapil shar
+jo achim
+wom ack
+equal ity
+aver ages
+a ine
+ðŁ¦ Ī
+tac ular
+dis ability
+u ked
+mid century
+bar thol
+teas ers
+tab ern
+nj caa
+sp out
+op i
+ku bball
+bl om
+so ar
+popu lism
+meth yl
+ðŁijĬ ðŁı¼
+o spre
+alo ils
+ðŁĵ ĸ
+ðŁĮ ļ
+x er
+sp illing
+publ ica
+car dam
+adi sh
+sa cha
+p kg
+bu da
+lyric ist
+i bc
+gru mp
+ho ver
+hal ep
+anti body
+anem one
+âĻ¥âĻ¥ âĻ¥âĻ¥
+m cl
+litho graph
+cc u
+s fest
+path ic
+calli ster
+otta wa
+gun sn
+rut ger
+hali but
+en vision
+differenti ate
+ðŁļĢ ðŁļĢ
+pir an
+lat el
+uc n
+trou bad
+ra ine
+fierc ely
+learn english
+lea se
+wex mondays
+em it
+dray ton
+bur rell
+scuba diving
+hol ler
+dr u
+clo cked
+w ral
+ap ro
+trans lucent
+w bo
+patri arch
+mo ja
+lan nister
+fish ery
+ne derland
+mil dly
+mi rai
+ma ko
+ja p
+ðŁĺ©ðŁĺ© ðŁĺ©
+pro statec
+p anna
+ar ama
+under taking
+tomp kins
+ne op
+soli ds
+sav oury
+e ames
+cut lery
+wood bridge
+steam er
+ri zzo
+wild cat
+rat na
+lamin ated
+kin eni
+jal ap
+ai des
+acknowle dges
+?! ?!?!
+! ðŁİī
+w afc
+mag gio
+ha ves
+dar je
+of i
+gr il
+v asi
+bru x
+mo hd
+fake speare
+arn old
+r mb
+for be
+wal leye
+ro di
+therapeu tics
+strate gi
+ob ste
+mu dder
+download able
+dd ings
+d ca
+asi angames
+campe on
+appropri ation
+th century
+ram atta
+dra ped
+bul lion
+mu c
+one x
+se greg
+ophel ia
+bod ily
+âĿ¤ ðŁĺį
+wi zar
+te ased
+ade my
+to id
+sur a
+lazar us
+sn ickers
+ma se
+lo h
+bow ed
+bibli o
+x change
+har lan
+gho shal
+flavor ful
+bha gat
+alle z
+whiche ver
+ten stein
+disc er
+organ iser
+mt g
+dream liner
+t se
+hok kaido
+mo k
+indulg ent
+hick man
+blin ded
+al yn
+aaa ah
+sp ool
+lough borough
+inter pret
+et v
+aristo tle
+optimi zing
+avici i
+madu rai
+ju li
+naw az
+mat chups
+ab ide
+paint ing
+w elling
+vel i
+octag on
+in scribed
+po king
+plac er
+life cycle
+kili g
+g sp
+eli ves
+cle ments
+na sheed
+me sut
+incarcer ated
+dist illed
+wal ang
+delic acy
+del gado
+che z
+ch ita
+ad ero
+tu x
+pati l
+o do
+abh cosmetics
+tv c
+p bc
+in accurate
+hardwork paysoff
+ball er
+quot ation
+merchandi sing
+ga stri
+defen ses
+dro gba
+bex hill
+ban kno
+win ona
+si eg
+p gs
+hahah ha
+agu chi
+su bram
+mirac le
+de sch
+li bre
+ba cher
+ent ine
+bbcra di
+lou dest
+r ps
+pi erc
+fr yer
+storm trooper
+rafael nadal
+pas co
+exhau stion
+epic onetsy
+rc tid
+kel lie
+ga ines
+d bz
+sm riti
+s bridge
+lim ited
+cla w
+technic al
+bio graphical
+ado red
+ภ°
+exclu de
+ac adia
+key boards
+fur man
+so ca
+sur u
+ni ps
+sw aps
+server less
+run e
+pu ffy
+north ampton
+nish ings
+hen der
+cartri dges
+gun shot
+ðŁĵ ¹
+fil ament
+respon dents
+pey ton
+mountaine er
+mer ging
+life span
+intimid ation
+p afc
+nl wx
+expan sive
+pur r
+f ck
+ca e
+at ti
+tele thon
+so hn
+mend el
+lo pes
+dor i
+un broken
+te red
+tast ings
+in active
+disin tegr
+t assel
+share the
+pi ano
+is lay
+air space
+z awa
+ricci ardo
+ming ton
+fresh er
+cur ry
+re vs
+pharo ah
+h mv
+exhilar ating
+wh oo
+lin kin
+kri spy
+competen cy
+ste wards
+ne bu
+kat su
+ad mins
+baz ar
+as ar
+giving back
+s summit
+song z
+lin us
+raj kumar
+farm ington
+fanta sia
+ðŁĺ´ ðŁĺ´
+so bri
+lis se
+barry more
+pri sm
+blo b
+sen ew
+mono xide
+exp ire
+eigh teen
+di pper
+xi ao
+kil t
+hin ch
+bbc sport
+bam boo
+p ter
+ex al
+ðŁ¦ ĭ
+ham lin
+expe ditions
+star gazing
+food security
+wy lie
+ul f
+st ingly
+on storm
+lo eb
+bro ome
+bn ha
+pancre atic
+eli ve
+!!!!!!!! !!!
+ther apper
+ortho pedic
+avengers endgame
+antit rust
+ìļ °
+go te
+om d
+off side
+gy llen
+win eries
+white water
+ad l
+lu pita
+exce eds
+consi sted
+chew bacca
+ash leigh
+nhl jets
+is san
+sh ld
+hay at
+cran berries
+ð٤ĺ ðŁı½
+rock the
+spring training
+fall out
+dairy free
+wa j
+un decided
+so wn
+rc n
+north wales
+htt r
+fu mble
+d its
+comp elled
+popu list
+min ted
+blan chett
+. ''
+pro pulsion
+m illa
+au berg
+her tz
+h ta
+u daipur
+serendip ity
+azte cs
+als ace
+ðŁIJ ij
+lu n
+sho es
+char li
+gar za
+ðŁĴ Ł
+pro biotics
+fox tv
+ol is
+mi ff
+loc alized
+diffu ser
+si gue
+fun ko
+rend ous
+ðŁĴ ij
+jeky ll
diff --git a/ SDPose-Wholebody/tokenizer/special_tokens_map.json b/ SDPose-Wholebody/tokenizer/special_tokens_map.json
new file mode 100644
index 0000000000000000000000000000000000000000..ae0c5be6f35217e51c4c000fd325d8de0294e99c
--- /dev/null
+++ b/ SDPose-Wholebody/tokenizer/special_tokens_map.json
@@ -0,0 +1,24 @@
+{
+ "bos_token": {
+ "content": "<|startoftext|>",
+ "lstrip": false,
+ "normalized": true,
+ "rstrip": false,
+ "single_word": false
+ },
+ "eos_token": {
+ "content": "<|endoftext|>",
+ "lstrip": false,
+ "normalized": true,
+ "rstrip": false,
+ "single_word": false
+ },
+ "pad_token": "!",
+ "unk_token": {
+ "content": "<|endoftext|>",
+ "lstrip": false,
+ "normalized": true,
+ "rstrip": false,
+ "single_word": false
+ }
+}
diff --git a/ SDPose-Wholebody/tokenizer/tokenizer_config.json b/ SDPose-Wholebody/tokenizer/tokenizer_config.json
new file mode 100644
index 0000000000000000000000000000000000000000..f4fe219b936c0e171504b4bba0c33c7bef6ea211
--- /dev/null
+++ b/ SDPose-Wholebody/tokenizer/tokenizer_config.json
@@ -0,0 +1,34 @@
+{
+ "add_prefix_space": false,
+ "bos_token": {
+ "__type": "AddedToken",
+ "content": "<|startoftext|>",
+ "lstrip": false,
+ "normalized": true,
+ "rstrip": false,
+ "single_word": false
+ },
+ "do_lower_case": true,
+ "eos_token": {
+ "__type": "AddedToken",
+ "content": "<|endoftext|>",
+ "lstrip": false,
+ "normalized": true,
+ "rstrip": false,
+ "single_word": false
+ },
+ "errors": "replace",
+ "model_max_length": 77,
+ "name_or_path": "hf-models/stable-diffusion-v2-768x768/tokenizer",
+ "pad_token": "<|endoftext|>",
+ "special_tokens_map_file": "./special_tokens_map.json",
+ "tokenizer_class": "CLIPTokenizer",
+ "unk_token": {
+ "__type": "AddedToken",
+ "content": "<|endoftext|>",
+ "lstrip": false,
+ "normalized": true,
+ "rstrip": false,
+ "single_word": false
+ }
+}
diff --git a/ SDPose-Wholebody/tokenizer/vocab.json b/ SDPose-Wholebody/tokenizer/vocab.json
new file mode 100644
index 0000000000000000000000000000000000000000..469be27c5c010538f845f518c4f5e8574c78f7c8
--- /dev/null
+++ b/ SDPose-Wholebody/tokenizer/vocab.json
@@ -0,0 +1,49410 @@
+{
+ "!": 0,
+ "!!": 1443,
+ "!!!": 11194,
+ "!!!!": 4003,
+ "!!!!!!!!": 11281,
+ "!!!!!!!!!!!!!!!!": 30146,
+ "!!!!!!!!!!!": 49339,
+ "!!!!!!!!!!": 35579,
+ "!!!!!!!!!": 28560,
+ "!!!!!!!!": 21622,
+ "!!!!!!!": 15203,
+ "!!!!!!": 9168,
+ "!!!!!": 5203,
+ "!!!!": 2360,
+ "!!!\"": 28048,
+ "!!!)": 42532,
+ "!!!": 995,
+ "!!\"": 20556,
+ "!!#": 34997,
+ "!!)": 28352,
+ "!!": 748,
+ "!!@": 40705,
+ "!\"": 2947,
+ "!\"@": 43819,
+ "!#": 9670,
+ "!'": 13222,
+ "!),": 37904,
+ "!).": 26225,
+ "!)": 4571,
+ "!*": 37737,
+ "!,": 29325,
+ "!-": 43499,
+ "!...": 22121,
+ "!..": 35475,
+ "!.": 22517,
+ "!:)": 31671,
+ "!:": 17545,
+ "!": 256,
+ "!?!": 29767,
+ "!?!?": 47081,
+ "!?": 6004,
+ "!@": 15117,
+ "!]": 34466,
+ "!â̦": 35068,
+ "!âĿ¤ï¸ı": 32559,
+ "!ðŁİī": 49085,
+ "!ðŁĺĬ": 43434,
+ "!ðŁĺį": 36438,
+ "\"": 1,
+ "\"!": 10377,
+ "\"\"": 41530,
+ "\"\"\"": 25539,
+ "\"\"": 8575,
+ "\"#": 8345,
+ "\"'": 31065,
+ "\"(": 32741,
+ "\")": 13112,
+ "\",": 4332,
+ "\"-": 9375,
+ "\"....": 37785,
+ "\"...": 9049,
+ "\"..": 25403,
+ "\".": 2811,
+ "\"/": 39486,
+ "\":": 7811,
+ "\";": 37549,
+ "\"": 257,
+ "\"?": 11727,
+ "\"@": 1512,
+ "\"@_": 20236,
+ "\"[": 36930,
+ "\"â̦": 33993,
+ "\"âĢĶ": 41151,
+ "#": 2,
+ "##": 15483,
+ "#...": 31491,
+ "#:": 30144,
+ "#": 258,
+ "#@": 35062,
+ "#â̦": 12834,
+ "#âĢİ": 34262,
+ "$": 3,
+ "$$": 24233,
+ "$$$": 31859,
+ "$$": 14929,
+ "$)": 39460,
+ "$.": 34682,
+ "$": 259,
+ "%": 4,
+ "%!": 35070,
+ "%),": 37819,
+ "%)": 16063,
+ "%,": 14505,
+ "%-": 48784,
+ "%.": 12475,
+ "%;": 33379,
+ "%": 260,
+ "&": 5,
+ "&&": 27791,
+ "&": 261,
+ "'": 6,
+ "'!": 13781,
+ "'\"": 19479,
+ "'#": 15319,
+ "''": 46594,
+ "''": 8445,
+ "')": 19175,
+ "',": 5662,
+ "'-": 26152,
+ "'...": 20474,
+ "'.": 4645,
+ "':": 7182,
+ "';": 44517,
+ "'": 262,
+ "'?": 17242,
+ "'@": 26397,
+ "'d": 1896,
+ "'ll": 1342,
+ "'m": 880,
+ "'re": 982,
+ "'s": 568,
+ "'t": 713,
+ "'ve": 1200,
+ "'â̦": 42120,
+ "(": 7,
+ "(!)": 30253,
+ "(\"": 18741,
+ "(#": 6229,
+ "($)": 46597,
+ "($": 15186,
+ "(&": 15042,
+ "('": 18235,
+ "((": 22944,
+ "(((": 33287,
+ "((": 13796,
+ "().": 41737,
+ "()": 8475,
+ "(*": 48004,
+ "(*": 39575,
+ "(+": 12903,
+ "(-": 20228,
+ "(...": 45159,
+ "(.": 43055,
+ "(:": 8528,
+ "(;": 23983,
+ "(": 263,
+ "(?)": 22885,
+ "(@": 2181,
+ "(£": 33987,
+ "(©": 44886,
+ "(ðŁĵ·:": 34610,
+ "(ðŁĵ·": 37999,
+ "(ðŁĵ¸:": 44422,
+ "(ðŁĵ¸": 45204,
+ ")": 8,
+ ")!!": 47518,
+ ")!": 7805,
+ ")\"": 13046,
+ ")#": 39981,
+ ")'": 23613,
+ ")(": 27956,
+ "))": 13720,
+ "))))": 42911,
+ "))))": 34181,
+ ")))": 18305,
+ "))": 5167,
+ "),": 2361,
+ ")-": 19034,
+ ")...": 15274,
+ ")..": 41822,
+ ").": 1818,
+ ")/": 26616,
+ "):": 4143,
+ ");": 19686,
+ ")": 264,
+ ")?": 18765,
+ ")@": 41928,
+ ")_/": 45028,
+ ")_/¯": 45781,
+ ")â̦": 41844,
+ "*": 9,
+ "*)": 30956,
+ "**": 9825,
+ "****": 21326,
+ "********": 42974,
+ "*****": 43571,
+ "****": 25167,
+ "***": 7829,
+ "**": 4441,
+ "*,": 41895,
+ "*-*": 23568,
+ "*.": 31304,
+ "*": 265,
+ "*_*": 44535,
+ "+": 10,
+ "+)": 34810,
+ "++": 47298,
+ "+++": 35986,
+ "++": 19056,
+ "+,": 35885,
+ "+.": 25238,
+ "+/-": 47614,
+ "+": 266,
+ ",": 11,
+ ",\"": 3823,
+ ",#": 11215,
+ ",&": 26905,
+ ",'": 10599,
+ ",)": 44493,
+ ",,": 21340,
+ ",,,,": 33225,
+ ",,,": 14811,
+ ",,": 8844,
+ ",-": 29821,
+ ",...": 20365,
+ ",.": 41277,
+ ",": 267,
+ ",@": 13975,
+ ",â̦": 14601,
+ "-": 12,
+ "-\"": 18646,
+ "-#": 10151,
+ "-$": 24946,
+ "-'": 28010,
+ "-(": 33345,
+ "-)": 3535,
+ "-*": 21527,
+ "--": 2154,
+ "----": 5753,
+ "--------": 11772,
+ "----------------": 23122,
+ "----": 30164,
+ "---->": 35999,
+ "---": 11079,
+ "--->": 14518,
+ "--": 2432,
+ "-->": 6422,
+ "-->>": 47252,
+ "-.-": 32765,
+ "-...": 43147,
+ "-.": 44040,
+ "-": 268,
+ "->": 5081,
+ "-@": 10087,
+ "-_-": 27227,
+ "-__": 42718,
+ "-â̦": 30047,
+ ".": 13,
+ ".!!": 37805,
+ ".!": 14030,
+ ".\"": 18650,
+ ".\"-": 21234,
+ ".\"": 1081,
+ ".\"âĢĶ": 48703,
+ ".#": 5014,
+ ".'\"": 41558,
+ ".''": 49379,
+ ".'": 5938,
+ ".(": 22294,
+ ".)": 5376,
+ ".*": 26145,
+ ".,": 5276,
+ ".-": 12481,
+ "..": 608,
+ "..!!": 23707,
+ "..!": 17994,
+ "..\"": 15229,
+ "..#": 15735,
+ "..,": 47143,
+ "...": 3002,
+ "...!!!": 38351,
+ "...!!": 39915,
+ "...!": 16860,
+ "...\"": 5240,
+ "...#": 8195,
+ "...&": 44979,
+ "...'": 23167,
+ "...(": 37981,
+ "...)": 14040,
+ "...,": 42717,
+ "....": 2386,
+ "....\"": 26689,
+ "....#": 20346,
+ ".....": 34151,
+ ".....#": 38867,
+ "........": 8246,
+ "................": 24855,
+ "............": 42965,
+ "...........": 35008,
+ "..........": 25526,
+ ".........": 19881,
+ "........": 14720,
+ ".......": 9917,
+ "......": 5590,
+ ".....": 3104,
+ "....": 1390,
+ "....@": 29790,
+ "...:": 34570,
+ "...": 678,
+ "...?": 16388,
+ "...@": 12672,
+ "..": 852,
+ "..?": 23875,
+ "..@": 21124,
+ "./": 31975,
+ ".:": 15811,
+ ".;": 47596,
+ ".": 269,
+ ".<": 29442,
+ ".?": 29294,
+ ".@": 1230,
+ ".]": 33511,
+ ".~": 42651,
+ ".â̦": 18047,
+ ".âĿ¤ï¸ı": 39085,
+ ".âłĢ": 30097,
+ ".ðŁĺĤ": 46580,
+ "/": 14,
+ "/#": 13217,
+ "/$": 36266,
+ "/-": 19811,
+ "/.": 39382,
+ "//": 15348,
+ "////": 46271,
+ "///": 22734,
+ "//": 3502,
+ "/": 270,
+ "/@": 8216,
+ "0": 15,
+ "0": 271,
+ "1": 16,
+ "1": 272,
+ "2": 17,
+ "2": 273,
+ "3": 18,
+ "3": 274,
+ "4": 19,
+ "4": 275,
+ "5": 20,
+ "5": 276,
+ "6": 21,
+ "6": 277,
+ "7": 22,
+ "7": 278,
+ "8": 23,
+ "8": 279,
+ "9": 24,
+ "9": 280,
+ ":": 25,
+ ":\"": 29498,
+ ":\")": 46432,
+ ":\"": 12089,
+ ":#": 26625,
+ ":$": 33769,
+ ":'": 8017,
+ ":'(": 21250,
+ ":')": 10701,
+ ":'": 23851,
+ ":((": 42496,
+ ":(": 5965,
+ ":)": 11070,
+ ":))))": 42339,
+ ":)))": 21840,
+ ":))": 10164,
+ ":).": 39010,
+ ":)": 1408,
+ ":*": 12617,
+ ":-": 13021,
+ ":-(": 25137,
+ ":-)": 4223,
+ ":-": 10323,
+ ":...": 42140,
+ "://": 12441,
+ ":/": 13604,
+ "::": 33077,
+ ":::": 43818,
+ "::": 9788,
+ ":": 281,
+ ":>": 39677,
+ ":@": 14339,
+ ":]": 43486,
+ ":|": 45986,
+ ":â̦": 22365,
+ ";": 26,
+ ";))": 41873,
+ ";)": 3661,
+ ";-": 35657,
+ ";-)": 10475,
+ ";;": 34824,
+ ";;": 24492,
+ ";": 282,
+ "<": 27,
+ "<-": 47280,
+ "": 34308,
+ "<<": 24588,
+ "<": 283,
+ "<<": 16482,
+ "<<<": 35054,
+ "<|endoftext|>": 49407,
+ "<|startoftext|>": 49406,
+ "=": 28,
+ "=))": 39587,
+ "=)": 17840,
+ "=": 284,
+ "==": 11748,
+ "====": 21734,
+ "========": 38952,
+ "==>": 29688,
+ "=>": 9714,
+ ">": 29,
+ ">.<": 38507,
+ ">:": 36196,
+ ">": 285,
+ "><": 28015,
+ ">>": 8270,
+ ">>": 2988,
+ ">>>": 6395,
+ ">>>>": 18461,
+ ">>>>": 18435,
+ ">>>>>": 32972,
+ ">>>>>>": 48947,
+ ">>>>>>>>": 41947,
+ ">_": 44144,
+ "?": 30,
+ "?!": 9785,
+ "?!!": 25342,
+ "?!\"": 29315,
+ "?!": 2835,
+ "?!?!": 16349,
+ "?!?!?!": 49084,
+ "?!?!?": 37619,
+ "?!?": 11395,
+ "?\"": 3283,
+ "?#": 24018,
+ "?'": 13610,
+ "?)": 9626,
+ "?,": 41628,
+ "?...": 22641,
+ "?..": 43905,
+ "?.": 41251,
+ "?:": 21067,
+ "?": 286,
+ "??": 5195,
+ "??!!": 43219,
+ "??!": 37341,
+ "??\"": 44996,
+ "??": 2197,
+ "???": 40017,
+ "???": 3824,
+ "????": 15936,
+ "????": 10362,
+ "?????": 21370,
+ "??????": 34589,
+ "????????": 45091,
+ "?@": 29258,
+ "?ð٤Ķ": 47928,
+ "@": 31,
+ "@#": 39397,
+ "@.": 43730,
+ "@/": 28639,
+ "@": 287,
+ "@@": 30314,
+ "@_": 2692,
+ "@__": 17042,
+ "@___": 48308,
+ "A": 32,
+ "A": 288,
+ "B": 33,
+ "B": 289,
+ "C": 34,
+ "C": 290,
+ "D": 35,
+ "D": 291,
+ "E": 36,
+ "E": 292,
+ "F": 37,
+ "F": 293,
+ "G": 38,
+ "G": 294,
+ "H": 39,
+ "H": 295,
+ "I": 40,
+ "I": 296,
+ "J": 41,
+ "J": 297,
+ "K": 42,
+ "K": 298,
+ "L": 43,
+ "L": 299,
+ "M": 44,
+ "M": 300,
+ "N": 45,
+ "N": 301,
+ "O": 46,
+ "O": 302,
+ "P": 47,
+ "P": 303,
+ "Q": 48,
+ "Q": 304,
+ "R": 49,
+ "R": 305,
+ "S": 50,
+ "S": 306,
+ "T": 51,
+ "T": 307,
+ "U": 52,
+ "U": 308,
+ "V": 53,
+ "V": 309,
+ "W": 54,
+ "W": 310,
+ "X": 55,
+ "X": 311,
+ "Y": 56,
+ "Y": 312,
+ "Z": 57,
+ "Z": 313,
+ "[": 58,
+ "[#": 11115,
+ "[...": 39975,
+ "[...]": 43790,
+ "[": 314,
+ "[@": 15148,
+ "[]": 22240,
+ "\\": 59,
+ "\\'": 41239,
+ "\\": 315,
+ "]": 60,
+ "]\"": 39434,
+ "],": 34067,
+ "].": 26262,
+ "]:": 21641,
+ "]": 316,
+ "][#": 39009,
+ "][": 29329,
+ "^": 61,
+ "^)": 30720,
+ "^-": 43516,
+ "^.": 31552,
+ "^.^": 35791,
+ "^": 317,
+ "^^": 34454,
+ "^^": 9064,
+ "^_": 14423,
+ "^_^": 15995,
+ "_": 62,
+ "_'": 44701,
+ "_(": 36951,
+ "_)": 37393,
+ "_*": 36237,
+ "_,": 31417,
+ "_-": 23193,
+ "_.": 26841,
+ "_/": 37647,
+ "_:": 13109,
+ "_": 318,
+ "__": 2355,
+ "__:": 47043,
+ "__": 3838,
+ "___": 43812,
+ "___": 13530,
+ "____": 4727,
+ "____": 25350,
+ "_____": 38803,
+ "________": 9549,
+ "________________": 20115,
+ "`": 63,
+ "`": 319,
+ "a": 64,
+ "a": 320,
+ "aa": 1821,
+ "aa": 3894,
+ "aaa": 14376,
+ "aaa": 9583,
+ "aaaa": 6727,
+ "aaaa": 19336,
+ "aaaaa": 31095,
+ "aaaaaa": 44413,
+ "aaaaaaaa": 23126,
+ "aaaah": 49151,
+ "aaah": 35856,
+ "aaay": 37846,
+ "aab": 34108,
+ "aac": 23251,
+ "aac": 11346,
+ "aad": 20464,
+ "aad": 35894,
+ "aaf": 37638,
+ "aaf": 31534,
+ "aag": 42174,
+ "aah": 28990,
+ "aaj": 28727,
+ "aaj": 43411,
+ "aak": 37739,
+ "aal": 22268,
+ "aal": 30208,
+ "aali": 27896,
+ "aaliyah": 46577,
+ "aam": 12943,
+ "aam": 22775,
+ "aama": 45018,
+ "aamaadmi": 45563,
+ "aamaadmiparty": 46406,
+ "aamir": 27456,
+ "aan": 20705,
+ "aan": 13426,
+ "aand": 38054,
+ "aap": 12023,
+ "aap": 12052,
+ "aapl": 34516,
+ "aar": 4695,
+ "aar": 13234,
+ "aard": 46932,
+ "aaron": 13948,
+ "aaron": 7709,
+ "aas": 28542,
+ "aas": 32205,
+ "aat": 34018,
+ "aat": 35004,
+ "aau": 35426,
+ "aay": 38281,
+ "aay": 40249,
+ "aaz": 26770,
+ "ab": 596,
+ "ab": 3937,
+ "aba": 44204,
+ "aba": 11102,
+ "abad": 33444,
+ "abad": 7155,
+ "aban": 41662,
+ "aband": 8595,
+ "abandon": 28805,
+ "abandoned": 11227,
+ "abar": 17860,
+ "abar": 39805,
+ "abas": 25402,
+ "abay": 43542,
+ "abb": 38954,
+ "abb": 38297,
+ "abba": 30870,
+ "abbas": 37494,
+ "abbas": 24412,
+ "abbey": 31927,
+ "abbey": 10132,
+ "abbie": 39949,
+ "abbo": 13536,
+ "abbot": 44046,
+ "abbott": 43737,
+ "abbott": 15649,
+ "abbrevi": 44843,
+ "abby": 30586,
+ "abby": 14694,
+ "abc": 13137,
+ "abc": 5334,
+ "abcnews": 31566,
+ "abd": 44093,
+ "abdel": 46511,
+ "abdomin": 35335,
+ "abdominal": 39328,
+ "abdu": 13361,
+ "abduc": 17884,
+ "abducted": 31520,
+ "abduction": 36984,
+ "abdul": 14227,
+ "abdul": 15593,
+ "abdullah": 21317,
+ "abe": 15856,
+ "abe": 12734,
+ "abee": 36037,
+ "abel": 31938,
+ "abel": 25318,
+ "abella": 46156,
+ "aben": 40865,
+ "aber": 7828,
+ "aber": 41867,
+ "aberdeen": 30539,
+ "aberdeen": 17236,
+ "abh": 27484,
+ "abh": 33649,
+ "abhcosmetics": 49189,
+ "abhi": 18113,
+ "abhin": 44045,
+ "abhishek": 44502,
+ "abi": 16867,
+ "abi": 14161,
+ "abia": 48604,
+ "abide": 49163,
+ "abig": 20863,
+ "abigail": 25686,
+ "abil": 21135,
+ "abilities": 8724,
+ "ability": 35146,
+ "ability": 3024,
+ "abit": 48668,
+ "ablanc": 33716,
+ "able": 10102,
+ "able": 863,
+ "abled": 10655,
+ "ableg": 24055,
+ "ables": 8486,
+ "ableton": 47169,
+ "ably": 6748,
+ "abnormal": 40934,
+ "abo": 2889,
+ "abo": 21861,
+ "aboard": 11661,
+ "abol": 31768,
+ "abolic": 46827,
+ "abolish": 47403,
+ "aboo": 42433,
+ "abor": 8416,
+ "aboriginal": 20422,
+ "abortion": 12336,
+ "abortions": 43218,
+ "aboss": 46401,
+ "abou": 36455,
+ "abou": 44053,
+ "abound": 41037,
+ "abour": 46637,
+ "about": 20204,
+ "about": 781,
+ "abouts": 36339,
+ "above": 35019,
+ "above": 4348,
+ "aboy": 37077,
+ "abpoli": 44779,
+ "abq": 38767,
+ "abr": 44932,
+ "abra": 10694,
+ "abra": 35087,
+ "abraham": 40623,
+ "abraham": 15869,
+ "abram": 33255,
+ "abrams": 29852,
+ "abre": 22472,
+ "abre": 46756,
+ "abri": 28605,
+ "abridged": 45333,
+ "abroad": 11253,
+ "abru": 46295,
+ "abs": 18431,
+ "abs": 11109,
+ "absc": 25389,
+ "abscbn": 44260,
+ "abscbn": 45810,
+ "absen": 32453,
+ "absence": 19240,
+ "absent": 30363,
+ "absol": 4624,
+ "absolu": 7055,
+ "absolut": 4666,
+ "absolute": 7501,
+ "absolutely": 4703,
+ "absor": 14303,
+ "absorb": 35806,
+ "absorbed": 45059,
+ "absorbing": 46412,
+ "absorption": 42210,
+ "abstr": 7530,
+ "abstract": 23885,
+ "abstract": 10197,
+ "abstractart": 31170,
+ "abstraction": 47696,
+ "abstracts": 40065,
+ "absur": 21639,
+ "absurd": 29757,
+ "abt": 9850,
+ "abu": 9167,
+ "abu": 11787,
+ "abud": 20180,
+ "abudha": 21450,
+ "abudhabi": 25256,
+ "abuja": 23371,
+ "abun": 20544,
+ "abundance": 23236,
+ "abundant": 31611,
+ "abur": 23377,
+ "aburger": 46660,
+ "abuse": 7678,
+ "abused": 23855,
+ "abuses": 37132,
+ "abusing": 36558,
+ "abusive": 26858,
+ "abv": 34172,
+ "aby": 16342,
+ "aby": 31378,
+ "abyss": 33632,
+ "abz": 42292,
+ "ac": 546,
+ "ac": 2816,
+ "aca": 9213,
+ "acab": 41388,
+ "acacia": 44047,
+ "acad": 32537,
+ "acade": 2892,
+ "academia": 22662,
+ "academic": 31178,
+ "academic": 7935,
+ "academics": 26417,
+ "academies": 42569,
+ "academy": 29968,
+ "academy": 4041,
+ "acadi": 41455,
+ "acadia": 49236,
+ "acam": 26172,
+ "acan": 42227,
+ "acan": 26318,
+ "acap": 32357,
+ "acar": 22232,
+ "acare": 16961,
+ "acc": 26805,
+ "acc": 9318,
+ "acca": 30883,
+ "acce": 8564,
+ "acceler": 10161,
+ "accelerate": 23619,
+ "accelerated": 38513,
+ "accelerating": 41821,
+ "acceleration": 39387,
+ "accelerator": 25261,
+ "accent": 28110,
+ "accent": 18931,
+ "accents": 31738,
+ "accenture": 41853,
+ "accep": 4616,
+ "accept": 16447,
+ "accept": 9338,
+ "acceptable": 14209,
+ "acceptance": 17090,
+ "accepted": 9159,
+ "accepting": 12855,
+ "accepts": 22338,
+ "access": 7596,
+ "access": 3822,
+ "accessi": 10787,
+ "accessibility": 23407,
+ "accessible": 13977,
+ "accessing": 46339,
+ "accessories": 10220,
+ "accessory": 20417,
+ "acci": 4263,
+ "acci": 33943,
+ "accident": 6608,
+ "accidental": 24895,
+ "accidentally": 11061,
+ "accidents": 22072,
+ "acclaimed": 21172,
+ "acco": 44730,
+ "accol": 33858,
+ "accolades": 46731,
+ "accom": 23658,
+ "accommo": 34495,
+ "accommod": 14386,
+ "accommodate": 34708,
+ "accommodation": 18066,
+ "accommodations": 45536,
+ "accomp": 24985,
+ "accompan": 14746,
+ "accompanied": 20715,
+ "accompany": 34142,
+ "accompanying": 38179,
+ "accompli": 10205,
+ "accomplish": 25542,
+ "accomplished": 16462,
+ "accomplishment": 26100,
+ "accomplishments": 24965,
+ "accor": 4182,
+ "accord": 34293,
+ "accord": 28513,
+ "according": 4717,
+ "accordingly": 35535,
+ "accordion": 48760,
+ "accoun": 3081,
+ "account": 18424,
+ "account": 4684,
+ "accountability": 19377,
+ "accountable": 24216,
+ "accountant": 31026,
+ "accountants": 37222,
+ "accounted": 43951,
+ "accounting": 14805,
+ "accounts": 9974,
+ "accra": 31900,
+ "accred": 17451,
+ "accreditation": 27015,
+ "accredited": 27647,
+ "acct": 45569,
+ "accu": 5618,
+ "accumul": 19275,
+ "accumulation": 37112,
+ "accur": 6551,
+ "accuracy": 18423,
+ "accurate": 8858,
+ "accurately": 24206,
+ "accusations": 33615,
+ "accuse": 39414,
+ "accused": 9434,
+ "accuses": 27496,
+ "accusing": 41474,
+ "acdc": 45067,
+ "ace": 2675,
+ "ace": 804,
+ "acea": 35219,
+ "aceae": 38153,
+ "acele": 40868,
+ "aceous": 33610,
+ "acer": 37990,
+ "acer": 25809,
+ "aces": 5725,
+ "acet": 28735,
+ "acf": 38389,
+ "ach": 972,
+ "ach": 987,
+ "acha": 22686,
+ "acharya": 45780,
+ "achat": 32706,
+ "ache": 27771,
+ "ache": 7214,
+ "ached": 17048,
+ "acher": 38442,
+ "acher": 17936,
+ "achers": 25051,
+ "aches": 14823,
+ "achi": 3264,
+ "achi": 9087,
+ "achiev": 8160,
+ "achieve": 14798,
+ "achieve": 8175,
+ "achieved": 12359,
+ "achievement": 8245,
+ "achievements": 16114,
+ "achiever": 46286,
+ "achievers": 44544,
+ "achieves": 40123,
+ "achieving": 16120,
+ "achilles": 33327,
+ "achim": 42335,
+ "aching": 12864,
+ "acho": 33130,
+ "achs": 41195,
+ "aci": 4359,
+ "aci": 34100,
+ "acia": 30163,
+ "acial": 32422,
+ "acid": 35474,
+ "acid": 10085,
+ "acidity": 48800,
+ "acids": 27751,
+ "acies": 20162,
+ "acin": 39442,
+ "acing": 9442,
+ "acio": 26202,
+ "acion": 44965,
+ "acion": 24968,
+ "acional": 26435,
+ "aciones": 35832,
+ "acious": 16020,
+ "acity": 7511,
+ "ación": 38175,
+ "ack": 877,
+ "ack": 725,
+ "acked": 5698,
+ "acker": 31201,
+ "acker": 7940,
+ "ackeray": 41843,
+ "acki": 42857,
+ "acking": 5515,
+ "ackles": 28503,
+ "acknow": 13563,
+ "acknowle": 18100,
+ "acknowledge": 25209,
+ "acknowledged": 35913,
+ "acknowledges": 49083,
+ "acknowledging": 45645,
+ "acks": 3858,
+ "acl": 47593,
+ "acl": 23073,
+ "acle": 6504,
+ "acles": 34164,
+ "aclu": 37354,
+ "acm": 39317,
+ "acmilan": 36500,
+ "acne": 24195,
+ "aco": 9463,
+ "aco": 8800,
+ "acol": 17431,
+ "acollege": 43468,
+ "acom": 17224,
+ "acom": 22342,
+ "acon": 11621,
+ "acon": 11571,
+ "aconf": 38851,
+ "acons": 31599,
+ "acor": 22076,
+ "acorn": 37537,
+ "acos": 39943,
+ "acosta": 31994,
+ "acou": 8794,
+ "acoun": 31295,
+ "acounty": 45449,
+ "acoustic": 10616,
+ "acoustics": 43873,
+ "acp": 19627,
+ "acqu": 7946,
+ "acquainted": 40713,
+ "acqui": 12194,
+ "acquire": 21576,
+ "acquired": 15932,
+ "acquires": 27376,
+ "acquiring": 42785,
+ "acquis": 14207,
+ "acquisition": 16543,
+ "acquisitions": 39649,
+ "acr": 43648,
+ "acre": 26749,
+ "acre": 9493,
+ "acres": 11630,
+ "acro": 21060,
+ "acrob": 40891,
+ "acron": 37770,
+ "across": 2500,
+ "acrosse": 40979,
+ "acruz": 40455,
+ "acry": 10440,
+ "acrylic": 12252,
+ "acs": 11782,
+ "act": 10305,
+ "act": 1393,
+ "acted": 10971,
+ "acti": 4786,
+ "acting": 6319,
+ "action": 12493,
+ "action": 1816,
+ "actions": 6271,
+ "activ": 3430,
+ "activate": 26737,
+ "activated": 22249,
+ "activation": 26769,
+ "active": 19009,
+ "active": 4046,
+ "actively": 18645,
+ "activi": 7230,
+ "activism": 20117,
+ "activist": 10850,
+ "activists": 12649,
+ "activities": 6514,
+ "activity": 6206,
+ "actment": 44807,
+ "acton": 36167,
+ "acton": 36697,
+ "actonclimate": 43797,
+ "actor": 12181,
+ "actor": 4035,
+ "actors": 9255,
+ "actorslife": 25117,
+ "actorvijay": 34033,
+ "actress": 5805,
+ "actresses": 33639,
+ "acts": 6816,
+ "actu": 2375,
+ "actual": 7488,
+ "actually": 2955,
+ "acu": 9204,
+ "acu": 48475,
+ "aculture": 38145,
+ "acup": 30869,
+ "acup": 27278,
+ "acupuncture": 40043,
+ "acur": 44719,
+ "acura": 30120,
+ "acus": 33710,
+ "acute": 19734,
+ "acy": 18717,
+ "acy": 2356,
+ "ad": 594,
+ "ad": 680,
+ "ada": 25785,
+ "ada": 1886,
+ "adaily": 47254,
+ "adal": 46646,
+ "adam": 6037,
+ "adam": 4944,
+ "adamlambert": 27659,
+ "adams": 7942,
+ "adan": 41802,
+ "adani": 37499,
+ "adap": 6341,
+ "adapt": 22666,
+ "adaptation": 16566,
+ "adapted": 26657,
+ "adapter": 21839,
+ "adapting": 44120,
+ "adaptive": 28672,
+ "adar": 27702,
+ "adar": 32681,
+ "adas": 23250,
+ "adata": 39500,
+ "aday": 31367,
+ "aday": 10280,
+ "adays": 24337,
+ "adb": 45630,
+ "adc": 38201,
+ "add": 19408,
+ "add": 3536,
+ "addams": 38912,
+ "added": 4149,
+ "adder": 47557,
+ "addi": 36378,
+ "addic": 5709,
+ "addict": 14614,
+ "addicted": 16275,
+ "addiction": 11751,
+ "addictive": 29638,
+ "addicts": 29997,
+ "adding": 8676,
+ "addis": 43911,
+ "addison": 32369,
+ "additi": 26927,
+ "addition": 6698,
+ "additional": 10666,
+ "additions": 22575,
+ "additive": 48546,
+ "addo": 40001,
+ "address": 5834,
+ "addressed": 20817,
+ "addresses": 12702,
+ "addressing": 10594,
+ "adds": 9944,
+ "addy": 24746,
+ "ade": 2194,
+ "ade": 1928,
+ "adecides": 46374,
+ "aded": 9994,
+ "adee": 47054,
+ "adel": 4434,
+ "adel": 27308,
+ "adelaide": 38193,
+ "adelaide": 11611,
+ "adele": 42843,
+ "adele": 21220,
+ "adelrey": 43627,
+ "ademy": 49123,
+ "aden": 28669,
+ "aden": 28688,
+ "adena": 23648,
+ "adequ": 18232,
+ "adequate": 22281,
+ "ader": 21365,
+ "adero": 49185,
+ "aders": 27672,
+ "ades": 5793,
+ "adh": 42301,
+ "adhd": 32649,
+ "adhe": 21175,
+ "adhesive": 38429,
+ "adi": 2486,
+ "adi": 8779,
+ "adia": 26874,
+ "adic": 36780,
+ "adid": 8086,
+ "adidas": 22396,
+ "adidas": 9589,
+ "adidasoriginals": 48575,
+ "adies": 45834,
+ "adifference": 37217,
+ "adilla": 41167,
+ "ading": 15000,
+ "adio": 15060,
+ "adirond": 36843,
+ "adish": 49009,
+ "adity": 28596,
+ "aditya": 37186,
+ "adityanath": 44437,
+ "adjac": 32517,
+ "adjacent": 33836,
+ "adjec": 45512,
+ "adju": 16413,
+ "adjun": 45995,
+ "adjust": 13784,
+ "adjust": 28073,
+ "adjustable": 20476,
+ "adjusted": 30515,
+ "adjusting": 41132,
+ "adjustment": 36081,
+ "adjustments": 36331,
+ "adl": 49351,
+ "adler": 30222,
+ "adm": 9892,
+ "adm": 33604,
+ "admi": 11666,
+ "admin": 12528,
+ "admini": 6434,
+ "administr": 12174,
+ "administration": 9502,
+ "administrative": 22424,
+ "administrator": 22603,
+ "administrators": 36123,
+ "admins": 49297,
+ "admir": 17031,
+ "admiral": 21013,
+ "admiration": 39569,
+ "admire": 17791,
+ "admired": 36103,
+ "admirer": 48344,
+ "admiring": 29835,
+ "admission": 11315,
+ "admissions": 22463,
+ "admit": 13769,
+ "admits": 16332,
+ "admitted": 20427,
+ "admitting": 46148,
+ "adn": 40339,
+ "adnan": 42037,
+ "ado": 4775,
+ "ado": 2933,
+ "adobe": 29256,
+ "adobe": 16484,
+ "adog": 44913,
+ "adol": 33512,
+ "adole": 22704,
+ "adolescent": 36793,
+ "adolescents": 45656,
+ "adolf": 41179,
+ "adon": 25907,
+ "adona": 48419,
+ "adop": 4183,
+ "adopt": 16441,
+ "adopt": 11159,
+ "adoptable": 36905,
+ "adoptdont": 19674,
+ "adoptdontshop": 20089,
+ "adopted": 12538,
+ "adopting": 30158,
+ "adoption": 11544,
+ "adopts": 40853,
+ "ador": 4992,
+ "ador": 9162,
+ "adora": 40031,
+ "adorable": 6298,
+ "adoration": 46781,
+ "adore": 15502,
+ "adored": 49233,
+ "adores": 30290,
+ "adorned": 44953,
+ "ados": 20079,
+ "adox": 32188,
+ "adp": 44426,
+ "adr": 46189,
+ "adren": 24204,
+ "adrenaline": 35552,
+ "adri": 5935,
+ "adrian": 25012,
+ "adrian": 13163,
+ "adriana": 41363,
+ "adrid": 26562,
+ "adrien": 47469,
+ "adrienne": 40081,
+ "ads": 2485,
+ "adu": 16882,
+ "adu": 24446,
+ "adukone": 30511,
+ "adul": 7222,
+ "adult": 42209,
+ "adult": 7115,
+ "adulthood": 40964,
+ "adults": 9391,
+ "adv": 1647,
+ "adv": 21018,
+ "advan": 33411,
+ "advance": 27291,
+ "advance": 7022,
+ "advanced": 7465,
+ "advancement": 35437,
+ "advances": 15852,
+ "advancing": 21355,
+ "advani": 48189,
+ "advant": 7017,
+ "advantage": 8573,
+ "advantaged": 38361,
+ "advantages": 23506,
+ "adven": 41670,
+ "advent": 3071,
+ "advent": 15199,
+ "adventcalendar": 43492,
+ "adventur": 29627,
+ "adventure": 17251,
+ "adventure": 4377,
+ "adventurer": 48098,
+ "adventures": 7941,
+ "adventurous": 31179,
+ "adver": 4806,
+ "adverse": 30348,
+ "adversity": 32516,
+ "advert": 19080,
+ "adverti": 5682,
+ "advertise": 31473,
+ "advertised": 38987,
+ "advertisement": 18713,
+ "advertiser": 41829,
+ "advertisers": 45472,
+ "advertising": 8158,
+ "adverts": 44306,
+ "advice": 4973,
+ "advis": 4634,
+ "advise": 25962,
+ "advised": 23196,
+ "adviser": 20367,
+ "advisers": 40984,
+ "advises": 42761,
+ "advising": 39648,
+ "advisor": 12380,
+ "advisors": 23197,
+ "advisory": 10224,
+ "advoc": 6657,
+ "advocacy": 14443,
+ "advocate": 12044,
+ "advocates": 17757,
+ "adwords": 48343,
+ "ady": 41446,
+ "ady": 8781,
+ "ae": 5548,
+ "ae": 4542,
+ "aea": 37048,
+ "aed": 26912,
+ "aege": 42304,
+ "ael": 41533,
+ "ael": 43340,
+ "aen": 43085,
+ "aer": 10195,
+ "aeri": 27685,
+ "aerial": 44866,
+ "aerial": 12440,
+ "aero": 10196,
+ "aero": 25026,
+ "aerob": 42824,
+ "aeron": 37286,
+ "aeronau": 42816,
+ "aerop": 27735,
+ "aerosmith": 43253,
+ "aerospace": 20530,
+ "aes": 10617,
+ "aes": 35677,
+ "aest": 40694,
+ "aesthe": 21181,
+ "aesthetic": 16179,
+ "aesthetics": 29295,
+ "aew": 47108,
+ "af": 702,
+ "af": 4391,
+ "afa": 24953,
+ "afan": 47474,
+ "afar": 41637,
+ "afar": 37866,
+ "afb": 27022,
+ "afc": 29742,
+ "afc": 6571,
+ "afcb": 44276,
+ "afcon": 30019,
+ "afd": 44626,
+ "afe": 30487,
+ "afe": 13912,
+ "afer": 44707,
+ "aff": 8849,
+ "aff": 14864,
+ "affair": 13998,
+ "affairs": 9830,
+ "affe": 4556,
+ "affect": 11361,
+ "affected": 9715,
+ "affecting": 18448,
+ "affection": 33780,
+ "affection": 28381,
+ "affectionate": 42578,
+ "affects": 17285,
+ "affili": 12120,
+ "affiliate": 18652,
+ "affiliated": 37540,
+ "affiliation": 48377,
+ "affinity": 41451,
+ "affir": 25343,
+ "affirm": 42711,
+ "affirm": 48625,
+ "affirmation": 47495,
+ "affl": 34036,
+ "affleck": 35584,
+ "afford": 7951,
+ "afford": 13223,
+ "affordability": 44828,
+ "affordable": 43944,
+ "affordable": 8926,
+ "afg": 33994,
+ "afgh": 9029,
+ "afghan": 15919,
+ "afghanistan": 9836,
+ "afi": 24074,
+ "afi": 31958,
+ "afil": 27209,
+ "afire": 42010,
+ "afirst": 38601,
+ "afl": 15132,
+ "afl": 14356,
+ "aflo": 41959,
+ "afm": 38385,
+ "afootball": 41694,
+ "afor": 43102,
+ "afore": 41468,
+ "afp": 18311,
+ "afraid": 9474,
+ "afri": 13888,
+ "afric": 2136,
+ "africa": 3093,
+ "african": 17471,
+ "african": 4736,
+ "africans": 26534,
+ "afridi": 37651,
+ "afrika": 45833,
+ "afrin": 45586,
+ "afro": 16267,
+ "afro": 21795,
+ "afs": 48960,
+ "aft": 22693,
+ "after": 2278,
+ "after": 953,
+ "afterdark": 48966,
+ "afterlife": 46790,
+ "aftermath": 20958,
+ "afterno": 22330,
+ "afternoon": 39035,
+ "afternoon": 2716,
+ "afternoons": 31631,
+ "afterparty": 35305,
+ "afterwards": 23911,
+ "ag": 602,
+ "ag": 5241,
+ "aga": 1050,
+ "aga": 4654,
+ "again": 1495,
+ "against": 23838,
+ "against": 1601,
+ "agame": 46943,
+ "agan": 42946,
+ "agan": 9178,
+ "agar": 13199,
+ "agar": 17544,
+ "agarwal": 43117,
+ "agas": 20430,
+ "agate": 25454,
+ "agatha": 43896,
+ "agave": 42671,
+ "agawa": 39433,
+ "agazine": 44942,
+ "age": 4758,
+ "age": 805,
+ "aged": 3889,
+ "ageing": 25349,
+ "agen": 10101,
+ "agen": 43696,
+ "agencies": 13887,
+ "agency": 44885,
+ "agency": 6270,
+ "agend": 48653,
+ "agenda": 8728,
+ "agent": 21210,
+ "agent": 6576,
+ "agents": 10199,
+ "agentsof": 37074,
+ "agentsofshield": 38801,
+ "ager": 44847,
+ "ager": 10443,
+ "agers": 22123,
+ "ages": 2321,
+ "agg": 45482,
+ "aggarwal": 39386,
+ "agger": 27836,
+ "aggi": 36844,
+ "aggie": 44244,
+ "aggie": 37618,
+ "aggies": 31047,
+ "aggio": 36685,
+ "aggrav": 35203,
+ "aggre": 10426,
+ "aggreg": 41968,
+ "aggregate": 41318,
+ "aggression": 28900,
+ "aggressive": 16295,
+ "aggressively": 48667,
+ "agh": 17917,
+ "agh": 14402,
+ "aghan": 31276,
+ "agi": 24036,
+ "agi": 17645,
+ "agic": 37652,
+ "agile": 16276,
+ "agility": 32161,
+ "aging": 4336,
+ "agio": 41746,
+ "agirl": 35469,
+ "agle": 37035,
+ "agle": 16702,
+ "agles": 36374,
+ "agles": 22679,
+ "aglia": 46912,
+ "agm": 19162,
+ "agn": 36474,
+ "agna": 43626,
+ "agne": 29374,
+ "agne": 48303,
+ "agnes": 26213,
+ "agno": 41540,
+ "ago": 6276,
+ "ago": 1468,
+ "agomez": 27127,
+ "agon": 26775,
+ "agon": 14901,
+ "agony": 36977,
+ "agor": 38920,
+ "agos": 32657,
+ "agov": 34227,
+ "agp": 46048,
+ "agr": 36639,
+ "agra": 26660,
+ "agra": 29830,
+ "agram": 2447,
+ "agre": 3180,
+ "agreat": 37594,
+ "agree": 5953,
+ "agreed": 12774,
+ "agreeing": 40720,
+ "agreement": 8286,
+ "agreements": 25865,
+ "agrees": 17854,
+ "agri": 20527,
+ "agri": 30326,
+ "agricul": 7234,
+ "agricultural": 15440,
+ "agriculture": 9720,
+ "agro": 33178,
+ "agro": 44589,
+ "agron": 41314,
+ "agroup": 40099,
+ "ags": 16926,
+ "agt": 39681,
+ "agu": 3922,
+ "agu": 36544,
+ "agua": 18482,
+ "aguchi": 49206,
+ "ague": 2095,
+ "aguero": 42964,
+ "agues": 7000,
+ "aguil": 27946,
+ "aguilar": 44715,
+ "ah": 1772,
+ "ah": 1288,
+ "aha": 12082,
+ "aha": 8429,
+ "ahah": 38661,
+ "ahaha": 32423,
+ "ahahaha": 42620,
+ "aham": 36036,
+ "ahan": 45061,
+ "ahan": 19255,
+ "ahar": 31038,
+ "ahar": 38760,
+ "ahe": 27688,
+ "ahead": 3158,
+ "ahem": 39995,
+ "ahh": 13152,
+ "ahhh": 14769,
+ "ahhhh": 21054,
+ "ahhhhh": 36392,
+ "ahi": 45349,
+ "ahi": 24154,
+ "ahl": 30433,
+ "ahmad": 32167,
+ "ahmad": 16902,
+ "ahmadi": 38656,
+ "ahmadiyya": 44865,
+ "ahmed": 19491,
+ "ahmed": 12081,
+ "ahmedabad": 26966,
+ "ahn": 33405,
+ "aho": 28114,
+ "aho": 38444,
+ "ahora": 43113,
+ "ahouse": 33197,
+ "ahoy": 38652,
+ "ahs": 16937,
+ "ahu": 11908,
+ "ahu": 16515,
+ "ai": 2014,
+ "ai": 2215,
+ "aia": 27046,
+ "aib": 34780,
+ "aic": 29454,
+ "aid": 13723,
+ "aid": 5182,
+ "aida": 33830,
+ "aidan": 48814,
+ "aidan": 26945,
+ "aide": 31558,
+ "aide": 9746,
+ "aided": 48707,
+ "aiden": 40020,
+ "aides": 49082,
+ "aids": 11759,
+ "aig": 27295,
+ "aig": 46989,
+ "aii": 22478,
+ "aik": 42575,
+ "aiken": 46342,
+ "ail": 1457,
+ "ail": 9154,
+ "ailed": 38919,
+ "ailing": 29999,
+ "ails": 27024,
+ "aim": 6787,
+ "aim": 11255,
+ "aime": 39872,
+ "aimed": 20247,
+ "aimee": 36318,
+ "aiming": 21768,
+ "aimo": 36706,
+ "aims": 13326,
+ "ain": 8326,
+ "ain": 2210,
+ "aine": 48983,
+ "aine": 17634,
+ "ains": 27621,
+ "aint": 29543,
+ "aint": 13099,
+ "ainted": 39933,
+ "aioli": 43949,
+ "air": 1281,
+ "air": 1922,
+ "aira": 35085,
+ "aira": 46444,
+ "airasia": 48020,
+ "airbnb": 23098,
+ "airborne": 22755,
+ "airbus": 15324,
+ "aircraft": 7706,
+ "airdrop": 38434,
+ "aire": 7682,
+ "aired": 21938,
+ "aires": 17034,
+ "airfield": 40525,
+ "airforce": 23511,
+ "airing": 20453,
+ "airline": 14847,
+ "airlines": 8929,
+ "airmen": 44499,
+ "airplane": 16451,
+ "airplanes": 33319,
+ "airplay": 47024,
+ "airpollution": 47362,
+ "airport": 48337,
+ "airport": 3259,
+ "airports": 21543,
+ "airs": 18539,
+ "airshow": 27139,
+ "airsoft": 30134,
+ "airspace": 49280,
+ "airstrikes": 37220,
+ "airtel": 34784,
+ "airtime": 46617,
+ "airwaves": 43910,
+ "airways": 14299,
+ "airy": 44453,
+ "ais": 7616,
+ "ais": 11393,
+ "aise": 30505,
+ "aish": 21946,
+ "aisha": 40211,
+ "aishwar": 29687,
+ "aishwarya": 44019,
+ "aisle": 26917,
+ "ait": 25613,
+ "ait": 40814,
+ "aj": 3990,
+ "aj": 6342,
+ "aja": 42343,
+ "aja": 19633,
+ "ajax": 21933,
+ "ajay": 22494,
+ "ajay": 28726,
+ "ajaydevgn": 35515,
+ "aje": 48818,
+ "aje": 33315,
+ "ajes": 38791,
+ "aji": 26102,
+ "aji": 21153,
+ "ajit": 42261,
+ "ajith": 24118,
+ "ajo": 26958,
+ "aju": 36855,
+ "ak": 819,
+ "ak": 1196,
+ "aka": 19154,
+ "aka": 3412,
+ "akaif": 45736,
+ "akan": 43678,
+ "akan": 38244,
+ "akapoor": 40064,
+ "akarta": 48603,
+ "akb": 41962,
+ "akbar": 27180,
+ "ake": 10558,
+ "ake": 5776,
+ "aked": 6115,
+ "aker": 14245,
+ "aker": 3074,
+ "akers": 5788,
+ "akes": 4764,
+ "akest": 46679,
+ "akh": 14821,
+ "akh": 30660,
+ "akhan": 28158,
+ "akhi": 41660,
+ "akhilesh": 48495,
+ "akhtar": 45458,
+ "aki": 18173,
+ "aki": 6592,
+ "akin": 24630,
+ "akin": 13601,
+ "aking": 1809,
+ "akins": 48568,
+ "akira": 34001,
+ "akis": 27732,
+ "akistan": 46221,
+ "akley": 39908,
+ "ako": 44027,
+ "ako": 14541,
+ "akon": 47105,
+ "akos": 44659,
+ "akrish": 37434,
+ "akron": 26115,
+ "aks": 2953,
+ "aksh": 28226,
+ "akshay": 21483,
+ "akshay": 38914,
+ "akshaykumar": 23624,
+ "akshi": 42634,
+ "aku": 18151,
+ "aku": 20815,
+ "aky": 11977,
+ "al": 526,
+ "al": 566,
+ "ala": 12783,
+ "ala": 3449,
+ "alab": 6365,
+ "alabam": 45880,
+ "alabama": 8422,
+ "alach": 24622,
+ "alad": 23074,
+ "aladdin": 29951,
+ "alai": 47072,
+ "alain": 28999,
+ "alam": 16612,
+ "alam": 16012,
+ "alamo": 41922,
+ "alamo": 34632,
+ "alan": 9563,
+ "alan": 5773,
+ "alana": 43405,
+ "aland": 34304,
+ "aland": 6819,
+ "alar": 34333,
+ "alarm": 11321,
+ "alarming": 37209,
+ "alarms": 31236,
+ "alarts": 31422,
+ "alas": 7276,
+ "alas": 22412,
+ "alaska": 9562,
+ "alaskan": 33898,
+ "alastair": 42062,
+ "alay": 30289,
+ "alay": 36450,
+ "alaya": 36397,
+ "alb": 45248,
+ "alba": 25254,
+ "alban": 10882,
+ "albania": 29170,
+ "albanian": 47721,
+ "albans": 44119,
+ "albany": 17359,
+ "albat": 42797,
+ "albeit": 38984,
+ "alber": 6413,
+ "albert": 34174,
+ "albert": 9507,
+ "alberta": 11048,
+ "alberto": 22714,
+ "albi": 18512,
+ "albino": 48062,
+ "albion": 24071,
+ "albu": 2216,
+ "album": 40712,
+ "album": 2431,
+ "albums": 10705,
+ "albuquerque": 31079,
+ "alcat": 35361,
+ "alche": 37909,
+ "alchemist": 38913,
+ "alchemy": 39501,
+ "alco": 6848,
+ "alco": 45446,
+ "alcohol": 9426,
+ "alcoholic": 25098,
+ "ald": 4539,
+ "ald": 2928,
+ "alda": 46440,
+ "alde": 33114,
+ "alden": 17155,
+ "alden": 27710,
+ "aldenrichards": 20051,
+ "alder": 18220,
+ "alder": 46571,
+ "aldi": 23204,
+ "aldo": 9933,
+ "aldridge": 38084,
+ "alds": 14285,
+ "aldu": 6505,
+ "aldub": 10532,
+ "aldub": 15247,
+ "ale": 1440,
+ "ale": 1336,
+ "alea": 26518,
+ "aleague": 38909,
+ "alec": 29804,
+ "alec": 19954,
+ "alecoscino": 47948,
+ "aled": 4970,
+ "alee": 24515,
+ "alej": 23440,
+ "alejandro": 32950,
+ "alek": 26906,
+ "alek": 43310,
+ "aleksand": 48429,
+ "alem": 11825,
+ "aleppo": 19258,
+ "aler": 25674,
+ "aler": 27335,
+ "alert": 4662,
+ "alerts": 22144,
+ "ales": 44171,
+ "ales": 5962,
+ "aless": 21864,
+ "alessandro": 37344,
+ "alestine": 31945,
+ "alex": 2959,
+ "alex": 4134,
+ "alexa": 16273,
+ "alexand": 10696,
+ "alexander": 25527,
+ "alexander": 7563,
+ "alexandra": 19054,
+ "alexandre": 35711,
+ "alexandria": 21171,
+ "alexis": 35023,
+ "alexis": 14243,
+ "aley": 21635,
+ "alf": 27098,
+ "alfa": 23482,
+ "alfar": 38870,
+ "alfie": 28598,
+ "alfon": 31947,
+ "alfonso": 41784,
+ "alfre": 20982,
+ "alfred": 16553,
+ "alfredo": 32291,
+ "algae": 25654,
+ "algar": 36291,
+ "algarve": 40290,
+ "alge": 24336,
+ "algebra": 33694,
+ "alger": 18568,
+ "algeria": 25257,
+ "algon": 33007,
+ "algori": 14912,
+ "algorithm": 23295,
+ "algorithms": 26039,
+ "alham": 23352,
+ "alhamdulil": 35129,
+ "alhamdulillah": 38982,
+ "ali": 835,
+ "ali": 3558,
+ "alia": 2492,
+ "aliaa": 36468,
+ "alian": 3464,
+ "alias": 40026,
+ "alibaba": 39231,
+ "alic": 25265,
+ "alice": 23759,
+ "alice": 9192,
+ "alici": 31630,
+ "alicia": 20914,
+ "alie": 8697,
+ "alien": 22846,
+ "alien": 9639,
+ "aliens": 14883,
+ "alier": 39493,
+ "alies": 38086,
+ "alife": 41347,
+ "alife": 21100,
+ "alig": 21272,
+ "alight": 36157,
+ "align": 31160,
+ "aligned": 29292,
+ "alignment": 27267,
+ "alik": 31141,
+ "alike": 12665,
+ "alim": 42075,
+ "alin": 42746,
+ "alin": 40063,
+ "alina": 39529,
+ "aline": 21799,
+ "aling": 5169,
+ "alion": 19049,
+ "alis": 21308,
+ "alis": 20114,
+ "alisa": 38918,
+ "alisation": 42143,
+ "alise": 36718,
+ "alised": 25099,
+ "alism": 5607,
+ "alison": 28653,
+ "alison": 16970,
+ "alist": 44900,
+ "alist": 3320,
+ "alistair": 40551,
+ "alistic": 22302,
+ "alists": 5653,
+ "alit": 45566,
+ "alities": 27925,
+ "ality": 1694,
+ "alive": 40467,
+ "alive": 4716,
+ "aliz": 30979,
+ "alization": 8026,
+ "alize": 10268,
+ "alized": 6141,
+ "alizer": 38922,
+ "alizes": 26181,
+ "alizing": 13023,
+ "alk": 30246,
+ "alk": 21577,
+ "alkal": 33450,
+ "alkaline": 39210,
+ "all": 813,
+ "all": 615,
+ "alla": 13884,
+ "alla": 14000,
+ "allabout": 43996,
+ "allah": 6378,
+ "allan": 36552,
+ "allan": 15404,
+ "allblacks": 47728,
+ "allday": 35862,
+ "alle": 4870,
+ "alle": 29478,
+ "alled": 7379,
+ "alleg": 7456,
+ "allegations": 16992,
+ "alleged": 12133,
+ "allegedly": 14177,
+ "alleges": 45051,
+ "allegh": 41479,
+ "allegheny": 47851,
+ "allegi": 28832,
+ "allegiance": 30955,
+ "allen": 16712,
+ "allen": 6386,
+ "allenge": 31387,
+ "aller": 10116,
+ "aller": 30630,
+ "allergic": 28809,
+ "allergies": 28247,
+ "allergy": 24408,
+ "allery": 32542,
+ "alles": 43354,
+ "allevi": 31682,
+ "alleviate": 44799,
+ "alley": 36205,
+ "alley": 10329,
+ "allez": 49137,
+ "alli": 4123,
+ "alli": 15268,
+ "alliance": 45404,
+ "alliance": 8945,
+ "alliances": 48403,
+ "allianz": 45740,
+ "allie": 25040,
+ "allied": 20045,
+ "allies": 17277,
+ "alligator": 28574,
+ "allin": 45007,
+ "allin": 22395,
+ "alline": 48182,
+ "alling": 2992,
+ "allis": 45309,
+ "allison": 34602,
+ "allison": 16578,
+ "allman": 42611,
+ "allo": 8107,
+ "allo": 18389,
+ "allocated": 42716,
+ "allocation": 35139,
+ "allon": 46693,
+ "allot": 26363,
+ "allotment": 33750,
+ "allow": 5645,
+ "allow": 6722,
+ "allowance": 35696,
+ "allowed": 7885,
+ "allowing": 12458,
+ "allows": 9966,
+ "alloy": 22467,
+ "alls": 1997,
+ "allstar": 31247,
+ "allstar": 22974,
+ "allstars": 31198,
+ "allthe": 29253,
+ "allu": 20157,
+ "alluarjun": 39333,
+ "allure": 41814,
+ "ally": 7461,
+ "ally": 769,
+ "alm": 28303,
+ "alma": 32933,
+ "alma": 18337,
+ "alman": 29394,
+ "almanac": 41268,
+ "almighty": 21898,
+ "almond": 15646,
+ "almonds": 30468,
+ "almost": 47534,
+ "almost": 2671,
+ "aln": 47203,
+ "alo": 3435,
+ "alo": 6183,
+ "aloe": 30728,
+ "alog": 15813,
+ "alogue": 9101,
+ "aloha": 23160,
+ "aloils": 49002,
+ "alom": 22236,
+ "alon": 14097,
+ "alon": 42846,
+ "alone": 4702,
+ "along": 8300,
+ "along": 2528,
+ "alongside": 8646,
+ "alonso": 25704,
+ "aloo": 46187,
+ "alore": 14323,
+ "alot": 16945,
+ "alou": 43180,
+ "aloud": 30028,
+ "alove": 46669,
+ "alove": 37045,
+ "alp": 32020,
+ "alp": 39342,
+ "alpac": 30128,
+ "alpaca": 42561,
+ "alph": 6720,
+ "alpha": 11807,
+ "alpha": 8624,
+ "alphabe": 45796,
+ "alphabet": 22335,
+ "alphon": 37865,
+ "alpine": 17055,
+ "alps": 18191,
+ "already": 2426,
+ "alright": 10866,
+ "als": 23982,
+ "als": 938,
+ "alsace": 49388,
+ "also": 1446,
+ "alt": 9995,
+ "alt": 10006,
+ "alta": 24470,
+ "alta": 25378,
+ "altaf": 47342,
+ "altam": 45624,
+ "altar": 16385,
+ "alter": 4949,
+ "alter": 21393,
+ "altered": 25201,
+ "altern": 47463,
+ "alternate": 15926,
+ "alternati": 16699,
+ "alternative": 37327,
+ "alternative": 8248,
+ "alternatives": 25041,
+ "alth": 23463,
+ "alth": 5863,
+ "although": 9421,
+ "alti": 35531,
+ "alties": 17276,
+ "altitude": 23241,
+ "altman": 48100,
+ "alto": 35053,
+ "alto": 17518,
+ "altogether": 45689,
+ "alton": 41331,
+ "alton": 36550,
+ "altrin": 38458,
+ "altrincham": 44718,
+ "alty": 5546,
+ "alu": 4776,
+ "alu": 27991,
+ "alum": 5404,
+ "alum": 10553,
+ "alumin": 14563,
+ "alumini": 22908,
+ "aluminium": 23631,
+ "aluminum": 15251,
+ "alumna": 30313,
+ "alumni": 6646,
+ "alumnus": 23633,
+ "alums": 30155,
+ "alv": 20928,
+ "alvar": 25196,
+ "alvarez": 26924,
+ "alvaro": 41941,
+ "alves": 38547,
+ "alvin": 27023,
+ "alway": 14046,
+ "alway": 43764,
+ "always": 24997,
+ "always": 1466,
+ "alwx": 32768,
+ "aly": 6468,
+ "aly": 12910,
+ "alyn": 49150,
+ "alyss": 29490,
+ "alyssa": 18898,
+ "alz": 12936,
+ "alz": 41128,
+ "alzheim": 15212,
+ "alzheimer": 21151,
+ "alzheimers": 34592,
+ "am": 548,
+ "am": 687,
+ "ama": 18206,
+ "ama": 1696,
+ "amad": 45095,
+ "amade": 37366,
+ "amag": 32049,
+ "amal": 15315,
+ "amal": 36753,
+ "aman": 19890,
+ "aman": 10110,
+ "amand": 14560,
+ "amanda": 10036,
+ "amar": 6424,
+ "amar": 19607,
+ "amara": 48522,
+ "amari": 42565,
+ "amarillo": 40449,
+ "amarine": 45591,
+ "amarketing": 30788,
+ "amas": 22716,
+ "amas": 15667,
+ "amat": 38664,
+ "amat": 25455,
+ "amate": 12453,
+ "amateur": 14287,
+ "amaya": 47210,
+ "amaz": 1185,
+ "amaze": 24846,
+ "amazed": 18944,
+ "amazing": 15949,
+ "amazing": 1370,
+ "amazingly": 20368,
+ "amazon": 13630,
+ "amazon": 4140,
+ "amb": 9042,
+ "amb": 16853,
+ "amba": 27003,
+ "ambani": 45967,
+ "ambas": 5634,
+ "ambassad": 5758,
+ "ambassador": 6795,
+ "ambassadors": 16832,
+ "ambed": 42089,
+ "ambedkar": 48131,
+ "amber": 18292,
+ "amber": 9986,
+ "ambi": 11844,
+ "ambient": 23447,
+ "ambigu": 35702,
+ "ambition": 20673,
+ "ambitions": 34152,
+ "ambitious": 18666,
+ "ambro": 17585,
+ "ambrose": 24253,
+ "ambu": 34423,
+ "ambul": 13944,
+ "ambulance": 15555,
+ "ambush": 40725,
+ "amc": 24942,
+ "amc": 16921,
+ "amd": 20845,
+ "ame": 3995,
+ "ame": 780,
+ "amed": 5660,
+ "ameen": 24229,
+ "amel": 31988,
+ "amel": 10960,
+ "ameli": 21599,
+ "amelia": 21433,
+ "amell": 48198,
+ "amen": 18716,
+ "amen": 12335,
+ "amend": 12425,
+ "amendment": 15019,
+ "amendments": 40901,
+ "amenities": 30096,
+ "ament": 27528,
+ "amer": 17081,
+ "amer": 16147,
+ "ameri": 40422,
+ "americ": 1283,
+ "america": 2224,
+ "americafirst": 43216,
+ "american": 8746,
+ "american": 2151,
+ "americana": 26221,
+ "americanair": 42538,
+ "americani": 39726,
+ "americans": 6676,
+ "americas": 33343,
+ "americas": 18142,
+ "ames": 5469,
+ "ameter": 23393,
+ "amethy": 30291,
+ "amethyst": 31485,
+ "amex": 46390,
+ "amg": 21324,
+ "amher": 32311,
+ "amherst": 39065,
+ "ami": 6100,
+ "ami": 3065,
+ "amic": 25824,
+ "amic": 21383,
+ "amid": 18908,
+ "amid": 11953,
+ "amide": 30952,
+ "amidst": 25172,
+ "amie": 36901,
+ "amig": 40294,
+ "amiga": 35329,
+ "amigo": 44991,
+ "amigos": 28176,
+ "amii": 35462,
+ "amiibo": 38871,
+ "amily": 36732,
+ "amin": 14337,
+ "amin": 20235,
+ "amina": 47531,
+ "amination": 30355,
+ "amine": 35823,
+ "aming": 3507,
+ "amino": 33464,
+ "amir": 26029,
+ "amir": 21973,
+ "amis": 29829,
+ "amish": 24958,
+ "amit": 15083,
+ "amit": 25255,
+ "amitabh": 48124,
+ "amitshah": 32374,
+ "aml": 43185,
+ "amma": 29786,
+ "amman": 29243,
+ "ammo": 33474,
+ "ammunition": 35060,
+ "amn": 24073,
+ "amne": 14596,
+ "amnesia": 41741,
+ "amnesty": 46330,
+ "amnesty": 21177,
+ "amo": 4833,
+ "amo": 11156,
+ "amodi": 9826,
+ "amon": 17492,
+ "amon": 24046,
+ "among": 12310,
+ "among": 4265,
+ "amongst": 12520,
+ "amoo": 26977,
+ "amor": 19977,
+ "amor": 15973,
+ "amore": 38937,
+ "amore": 22691,
+ "amores": 36338,
+ "amos": 18133,
+ "amoto": 25492,
+ "amount": 6403,
+ "amounts": 16747,
+ "amour": 29908,
+ "amovie": 41062,
+ "amp": 3521,
+ "amp": 6259,
+ "amped": 22640,
+ "amphi": 16379,
+ "amphibious": 45206,
+ "amphitheater": 41285,
+ "amphitheatre": 44039,
+ "ample": 34162,
+ "amples": 14536,
+ "ampli": 15647,
+ "amplifier": 31743,
+ "amplify": 45308,
+ "amps": 19252,
+ "ampton": 29410,
+ "ampton": 9347,
+ "amr": 30916,
+ "amreading": 16546,
+ "amrit": 33849,
+ "ams": 1396,
+ "amster": 9110,
+ "amsterdam": 9441,
+ "amtrak": 27855,
+ "amu": 11347,
+ "amu": 32336,
+ "amur": 35014,
+ "amura": 35487,
+ "amus": 36269,
+ "amuse": 21421,
+ "amuse": 44367,
+ "amused": 30212,
+ "amusement": 32570,
+ "amusic": 20266,
+ "amusing": 31789,
+ "amwriting": 9660,
+ "amy": 10547,
+ "amy": 5187,
+ "an": 514,
+ "an": 550,
+ "ana": 6588,
+ "ana": 1388,
+ "anab": 34742,
+ "anada": 27948,
+ "anag": 12115,
+ "anagh": 40774,
+ "anaheim": 23728,
+ "anak": 34814,
+ "anak": 38658,
+ "anal": 2785,
+ "analo": 34179,
+ "analog": 19963,
+ "analogue": 46031,
+ "analy": 4611,
+ "analyse": 47246,
+ "analyses": 39695,
+ "analysis": 5296,
+ "analyst": 14198,
+ "analysts": 28075,
+ "analytical": 34550,
+ "analytics": 8558,
+ "analyze": 28519,
+ "analyzing": 32107,
+ "anam": 29525,
+ "anan": 37215,
+ "anand": 25073,
+ "anand": 22083,
+ "anap": 41566,
+ "anarch": 46405,
+ "anarchi": 39879,
+ "anarchy": 27707,
+ "anas": 31382,
+ "anas": 12633,
+ "anast": 48902,
+ "anasta": 22915,
+ "anastasi": 36534,
+ "anastasia": 37975,
+ "anat": 10045,
+ "anath": 31277,
+ "anatom": 33759,
+ "anatomy": 15376,
+ "anc": 1124,
+ "anc": 17758,
+ "anca": 14583,
+ "ance": 7165,
+ "ance": 884,
+ "anced": 5071,
+ "ancer": 17415,
+ "ancers": 37296,
+ "ances": 3515,
+ "ancestor": 43904,
+ "ancestors": 24405,
+ "ancestral": 41615,
+ "ancestry": 30922,
+ "anch": 9489,
+ "anche": 34679,
+ "ancho": 26610,
+ "anchor": 20030,
+ "anchor": 13201,
+ "anchorage": 31950,
+ "anchored": 45926,
+ "anchors": 37830,
+ "anci": 4192,
+ "ancient": 31495,
+ "ancient": 5810,
+ "ancies": 21647,
+ "ancing": 7797,
+ "anco": 15459,
+ "ancy": 16282,
+ "ancy": 3633,
+ "and": 672,
+ "and": 537,
+ "anda": 2911,
+ "andalu": 31443,
+ "andco": 36302,
+ "ande": 26889,
+ "ande": 30354,
+ "ander": 3740,
+ "ander": 3935,
+ "anders": 10880,
+ "andersen": 32661,
+ "anderson": 26683,
+ "anderson": 6510,
+ "andes": 24052,
+ "andfriends": 36871,
+ "andhi": 21617,
+ "andhra": 32452,
+ "andi": 28870,
+ "andi": 14354,
+ "andie": 46318,
+ "andme": 42831,
+ "ando": 35950,
+ "ando": 5986,
+ "andolan": 48965,
+ "andon": 36488,
+ "andor": 45243,
+ "andover": 44177,
+ "andr": 22661,
+ "andra": 46795,
+ "andra": 21730,
+ "andre": 2657,
+ "andre": 9400,
+ "andrea": 10895,
+ "andreas": 20444,
+ "andrei": 42137,
+ "andres": 25197,
+ "andretti": 44291,
+ "andrew": 11717,
+ "andrew": 4847,
+ "andrews": 14506,
+ "andri": 37208,
+ "andro": 4417,
+ "andro": 17980,
+ "android": 24284,
+ "android": 5191,
+ "androidgames": 46572,
+ "andromeda": 42942,
+ "andré": 35609,
+ "ands": 32257,
+ "andthe": 22111,
+ "andu": 44200,
+ "andum": 47266,
+ "andy": 9447,
+ "andy": 2888,
+ "ane": 5846,
+ "ane": 3051,
+ "anec": 33965,
+ "anem": 41395,
+ "anemone": 49019,
+ "aneous": 48273,
+ "anes": 15381,
+ "anese": 48778,
+ "anesthe": 30622,
+ "anesthesia": 43353,
+ "anew": 39084,
+ "anew": 47341,
+ "anews": 20919,
+ "aney": 22387,
+ "anfield": 26993,
+ "ang": 883,
+ "ang": 2704,
+ "anga": 11641,
+ "angames": 43178,
+ "angan": 28264,
+ "angas": 46180,
+ "ange": 2960,
+ "ange": 3039,
+ "angel": 5029,
+ "angel": 5130,
+ "angela": 12354,
+ "angeles": 7382,
+ "angeli": 15265,
+ "angelic": 41038,
+ "angelica": 38582,
+ "angelina": 28890,
+ "angelo": 14342,
+ "angelou": 41328,
+ "angels": 7809,
+ "anger": 32737,
+ "anger": 6788,
+ "angerous": 39716,
+ "angers": 29756,
+ "angh": 34030,
+ "angi": 28003,
+ "angi": 24301,
+ "angie": 18859,
+ "angle": 21749,
+ "angle": 6946,
+ "angled": 32322,
+ "angler": 22284,
+ "anglers": 41608,
+ "angles": 18627,
+ "anglesey": 31850,
+ "anglia": 32076,
+ "anglic": 28322,
+ "anglican": 33284,
+ "angling": 36824,
+ "anglo": 39515,
+ "anglo": 30408,
+ "ango": 19090,
+ "angola": 36636,
+ "angor": 41740,
+ "angp": 19992,
+ "angry": 33910,
+ "angry": 9054,
+ "angs": 18441,
+ "angst": 41714,
+ "angu": 11209,
+ "angular": 43584,
+ "angular": 24981,
+ "angularjs": 48608,
+ "angus": 19688,
+ "ani": 1326,
+ "ani": 3624,
+ "ania": 9866,
+ "anian": 9945,
+ "anians": 39393,
+ "anic": 23113,
+ "anie": 26697,
+ "anie": 7671,
+ "anil": 28589,
+ "anil": 34619,
+ "anim": 2190,
+ "animal": 10697,
+ "animal": 4668,
+ "animalrights": 42859,
+ "animals": 4995,
+ "animate": 40076,
+ "animated": 13360,
+ "animation": 10344,
+ "animations": 42870,
+ "animator": 42591,
+ "anime": 23314,
+ "anime": 6469,
+ "anin": 45735,
+ "aning": 30972,
+ "anir": 27089,
+ "anirud": 35278,
+ "anirudhofficial": 45917,
+ "anis": 40986,
+ "anis": 47556,
+ "anism": 20947,
+ "anist": 16729,
+ "anistan": 9727,
+ "aniston": 47344,
+ "anit": 23683,
+ "anita": 18544,
+ "anium": 14794,
+ "anj": 22443,
+ "anja": 43440,
+ "anjali": 38834,
+ "anjo": 47353,
+ "ank": 13339,
+ "ank": 10029,
+ "anka": 45324,
+ "ankara": 34309,
+ "ankle": 14777,
+ "ankles": 48688,
+ "ann": 850,
+ "ann": 5424,
+ "anna": 13821,
+ "anna": 2160,
+ "annab": 22336,
+ "annabelle": 47661,
+ "annah": 39166,
+ "annah": 14327,
+ "annak": 41720,
+ "annan": 32166,
+ "annapolis": 34491,
+ "annas": 48467,
+ "anne": 9139,
+ "anne": 4083,
+ "anned": 27352,
+ "anner": 12642,
+ "annes": 24343,
+ "annette": 36821,
+ "annex": 42958,
+ "annex": 46389,
+ "anni": 2438,
+ "anni": 13728,
+ "annie": 37270,
+ "annie": 12173,
+ "annies": 43184,
+ "annihil": 32734,
+ "annis": 24742,
+ "anniv": 31399,
+ "anniver": 29671,
+ "annivers": 42836,
+ "anniversaire": 30882,
+ "anniversary": 3048,
+ "anno": 9901,
+ "anno": 26871,
+ "annon": 26385,
+ "annot": 30411,
+ "announ": 1806,
+ "announce": 3682,
+ "announced": 4103,
+ "announcement": 6932,
+ "announcements": 23735,
+ "announcer": 33626,
+ "announces": 6500,
+ "announcing": 11593,
+ "annoy": 45138,
+ "annoyed": 29863,
+ "annoying": 15248,
+ "annu": 21698,
+ "annual": 2906,
+ "annually": 23703,
+ "anny": 34313,
+ "anny": 5291,
+ "ano": 5617,
+ "ano": 2658,
+ "anom": 21612,
+ "anomaly": 46811,
+ "anon": 47079,
+ "anon": 13667,
+ "anonym": 38605,
+ "anonymous": 15036,
+ "anoo": 25690,
+ "anor": 13243,
+ "anor": 16596,
+ "anos": 20132,
+ "another": 29274,
+ "another": 1380,
+ "anova": 24116,
+ "ans": 24586,
+ "ans": 885,
+ "ansari": 40748,
+ "ansel": 40356,
+ "answ": 3369,
+ "answe": 14391,
+ "answer": 4518,
+ "answered": 14499,
+ "answering": 18280,
+ "answers": 8692,
+ "ant": 1103,
+ "ant": 773,
+ "anta": 3023,
+ "antag": 41745,
+ "antal": 39355,
+ "antalya": 47440,
+ "antan": 32899,
+ "antarc": 21338,
+ "antarctic": 27077,
+ "antarctica": 22587,
+ "ante": 19311,
+ "ante": 9769,
+ "antebellum": 41683,
+ "antelope": 39177,
+ "anten": 35517,
+ "antenna": 26370,
+ "anter": 46508,
+ "antes": 14927,
+ "antgrasso": 39074,
+ "anth": 3737,
+ "anth": 29741,
+ "antha": 47981,
+ "anthe": 34167,
+ "anthem": 12504,
+ "anthi": 45261,
+ "anthology": 21009,
+ "anthony": 17477,
+ "anthony": 6113,
+ "anthro": 10019,
+ "anthropo": 18538,
+ "anthropology": 32407,
+ "anthus": 37639,
+ "anti": 3120,
+ "anti": 3564,
+ "antibio": 18954,
+ "antibiotic": 34387,
+ "antibiotics": 29499,
+ "antibody": 49018,
+ "antic": 8260,
+ "anticip": 11435,
+ "anticipate": 38280,
+ "anticipated": 18605,
+ "anticipating": 48067,
+ "anticipation": 26983,
+ "antics": 37126,
+ "antidote": 45476,
+ "antifa": 35926,
+ "antigua": 39910,
+ "antine": 17641,
+ "antino": 27818,
+ "antioxid": 23010,
+ "antioxidant": 37452,
+ "antioxidants": 34208,
+ "antiqu": 21745,
+ "antique": 46517,
+ "antique": 9060,
+ "antiques": 17365,
+ "antis": 19748,
+ "antisemitism": 36630,
+ "antit": 37833,
+ "antitrust": 49343,
+ "antlers": 47720,
+ "antly": 5265,
+ "anto": 16826,
+ "anto": 24486,
+ "antoine": 25188,
+ "anton": 5497,
+ "anton": 19644,
+ "antoni": 39958,
+ "antonio": 30497,
+ "antonio": 7842,
+ "antony": 30707,
+ "antrim": 40252,
+ "ants": 1589,
+ "antv": 47520,
+ "antw": 44460,
+ "antwer": 26970,
+ "antwerp": 33797,
+ "antz": 25684,
+ "anu": 8537,
+ "anu": 17152,
+ "anup": 29617,
+ "anus": 27084,
+ "anush": 22765,
+ "anushka": 42080,
+ "anushka": 39822,
+ "anushkasharma": 44203,
+ "anwar": 34261,
+ "anxi": 9021,
+ "anxiety": 11103,
+ "anxious": 27793,
+ "any": 1307,
+ "any": 1504,
+ "anya": 11173,
+ "anybody": 10071,
+ "anyi": 41632,
+ "anymore": 7372,
+ "anyone": 2302,
+ "anything": 3582,
+ "anytime": 13924,
+ "anyway": 8931,
+ "anyways": 19778,
+ "anywhere": 8863,
+ "anz": 14445,
+ "anz": 19425,
+ "anza": 14669,
+ "anzac": 31977,
+ "ao": 7313,
+ "ao": 5703,
+ "aoa": 47119,
+ "aoc": 31918,
+ "aofficial": 30840,
+ "aoki": 33602,
+ "aol": 40643,
+ "aon": 30928,
+ "aon": 48476,
+ "aor": 32044,
+ "aos": 46860,
+ "ap": 688,
+ "ap": 2728,
+ "apa": 36954,
+ "apa": 13537,
+ "apac": 34320,
+ "apache": 23921,
+ "apal": 38017,
+ "apan": 36562,
+ "apar": 9161,
+ "apark": 32528,
+ "apart": 6474,
+ "apart": 7803,
+ "aparthe": 25121,
+ "apartheid": 26597,
+ "apartment": 8285,
+ "apartments": 15791,
+ "aparty": 26767,
+ "apat": 31755,
+ "apathy": 18145,
+ "apc": 20300,
+ "apd": 44563,
+ "ape": 6098,
+ "ape": 2609,
+ "apec": 47530,
+ "aper": 13681,
+ "aper": 5858,
+ "apers": 15846,
+ "apes": 9550,
+ "apeu": 19040,
+ "apex": 41935,
+ "apex": 23712,
+ "aph": 16341,
+ "aph": 29491,
+ "apha": 47104,
+ "apho": 21758,
+ "aphra": 44147,
+ "api": 23342,
+ "api": 14674,
+ "apia": 44259,
+ "apic": 40679,
+ "aping": 18456,
+ "apink": 35725,
+ "apis": 37575,
+ "apk": 27648,
+ "apo": 4089,
+ "apo": 19758,
+ "apocaly": 13932,
+ "apocalypse": 17571,
+ "apocalyptic": 35675,
+ "apol": 5023,
+ "apolice": 45663,
+ "apolis": 9598,
+ "apollo": 48213,
+ "apollo": 11554,
+ "apolo": 31094,
+ "apolog": 25530,
+ "apologe": 42908,
+ "apologi": 14977,
+ "apologies": 21959,
+ "apologise": 39608,
+ "apologize": 22879,
+ "apologizes": 35298,
+ "apology": 20768,
+ "apor": 21871,
+ "apore": 6679,
+ "apost": 20309,
+ "apostle": 33051,
+ "apostles": 48457,
+ "app": 882,
+ "app": 2231,
+ "appa": 4884,
+ "appa": 13110,
+ "appalach": 30523,
+ "appalachian": 36806,
+ "appalling": 44797,
+ "appar": 26698,
+ "apparatus": 37716,
+ "apparel": 13972,
+ "apparent": 23963,
+ "apparently": 5287,
+ "appe": 3748,
+ "appe": 45949,
+ "appeal": 9625,
+ "appealing": 25909,
+ "appeals": 22447,
+ "appear": 5544,
+ "appear": 9308,
+ "appearance": 7238,
+ "appearances": 17214,
+ "appeared": 11561,
+ "appearing": 18759,
+ "appears": 8743,
+ "appell": 43833,
+ "appen": 37201,
+ "appen": 26589,
+ "apper": 18780,
+ "appet": 21686,
+ "appeti": 24179,
+ "appetite": 24481,
+ "appetizer": 36065,
+ "applau": 24713,
+ "applaud": 42152,
+ "applause": 22650,
+ "apple": 8629,
+ "apple": 3055,
+ "applemusic": 21390,
+ "apples": 14032,
+ "appleton": 45250,
+ "appli": 15495,
+ "appliance": 33677,
+ "appliances": 22134,
+ "applic": 4235,
+ "applicable": 37927,
+ "applicants": 28035,
+ "application": 7241,
+ "applications": 7341,
+ "applied": 12636,
+ "applies": 24910,
+ "apply": 4356,
+ "applying": 17965,
+ "appo": 5433,
+ "appoint": 36190,
+ "appointed": 11087,
+ "appointment": 10890,
+ "appointments": 23439,
+ "appoints": 25132,
+ "apprais": 36972,
+ "appraisal": 46108,
+ "appreci": 3474,
+ "appreciate": 6263,
+ "appreciated": 9264,
+ "appreciates": 36573,
+ "appreciating": 39352,
+ "appreciation": 9212,
+ "appreciationday": 37438,
+ "appreciative": 45074,
+ "appren": 10582,
+ "apprentic": 15662,
+ "apprentice": 19122,
+ "apprentice": 17985,
+ "apprentices": 38252,
+ "apprenticeship": 26939,
+ "apprenticeships": 35425,
+ "appro": 2398,
+ "approach": 7781,
+ "approach": 6241,
+ "approached": 36499,
+ "approaches": 14962,
+ "approaching": 12164,
+ "appropri": 8446,
+ "appropriate": 10768,
+ "appropriately": 30383,
+ "appropriation": 49110,
+ "approval": 13549,
+ "approve": 19064,
+ "approved": 9412,
+ "approves": 18107,
+ "approx": 18266,
+ "approxim": 14201,
+ "approximately": 16128,
+ "apps": 7020,
+ "appstore": 31377,
+ "appt": 48112,
+ "appy": 34420,
+ "apr": 39396,
+ "apr": 11177,
+ "apra": 37027,
+ "apric": 25923,
+ "apricot": 30815,
+ "april": 23548,
+ "april": 2484,
+ "apro": 42712,
+ "apro": 49051,
+ "apron": 29502,
+ "aps": 8868,
+ "apse": 31843,
+ "apt": 17921,
+ "aptly": 47313,
+ "apu": 22166,
+ "apur": 36900,
+ "apur": 45193,
+ "aq": 14018,
+ "aq": 26862,
+ "aqu": 4458,
+ "aqua": 18613,
+ "aquaculture": 41885,
+ "aquaman": 35098,
+ "aquari": 37605,
+ "aquarium": 16814,
+ "aquarius": 38879,
+ "aquatic": 22658,
+ "aque": 35927,
+ "aque": 37268,
+ "aqui": 36826,
+ "aquino": 33796,
+ "ar": 516,
+ "ar": 625,
+ "ara": 24161,
+ "ara": 3340,
+ "arab": 5405,
+ "arab": 12028,
+ "arabia": 11746,
+ "arabian": 24663,
+ "arabic": 16709,
+ "arabs": 39155,
+ "arac": 47620,
+ "arach": 37689,
+ "arag": 41502,
+ "araj": 45142,
+ "arak": 23416,
+ "aram": 19223,
+ "aram": 21473,
+ "arama": 49066,
+ "aran": 20839,
+ "aran": 19641,
+ "aras": 36399,
+ "arat": 30856,
+ "arav": 35836,
+ "arbit": 20267,
+ "arbitr": 22702,
+ "arbitration": 34845,
+ "arbor": 33516,
+ "arbor": 24878,
+ "arboretum": 41719,
+ "arc": 4997,
+ "arc": 11592,
+ "arca": 25189,
+ "arca": 37612,
+ "arcade": 13331,
+ "arcadia": 38372,
+ "arch": 2458,
+ "arch": 8557,
+ "archa": 45619,
+ "archae": 10121,
+ "archaeological": 26163,
+ "archaeologists": 45035,
+ "archaeology": 14868,
+ "archan": 33359,
+ "archbishop": 23994,
+ "arche": 22474,
+ "archer": 21824,
+ "archers": 38407,
+ "archery": 23935,
+ "arches": 30771,
+ "archi": 4479,
+ "archie": 20557,
+ "archipel": 39750,
+ "archipelago": 43025,
+ "architec": 3359,
+ "architect": 12192,
+ "architects": 13290,
+ "architectural": 15360,
+ "architecture": 39038,
+ "architecture": 4920,
+ "archival": 39249,
+ "archive": 42257,
+ "archive": 10548,
+ "archived": 42379,
+ "archives": 9411,
+ "archy": 15643,
+ "arctic": 29716,
+ "arctic": 9138,
+ "ard": 3793,
+ "ard": 746,
+ "arden": 44600,
+ "arden": 27057,
+ "ardi": 23932,
+ "ardi": 19837,
+ "ardo": 35735,
+ "ardo": 9394,
+ "ards": 1654,
+ "ardu": 20906,
+ "arduino": 25398,
+ "are": 1076,
+ "are": 631,
+ "area": 2445,
+ "areas": 5429,
+ "arec": 18136,
+ "areclipse": 36030,
+ "ared": 5369,
+ "arel": 12798,
+ "arella": 24784,
+ "arelli": 48619,
+ "aren": 4033,
+ "aren": 4318,
+ "arena": 5463,
+ "arenas": 47860,
+ "arent": 37487,
+ "arer": 14857,
+ "arers": 33159,
+ "ares": 12224,
+ "arest": 11708,
+ "aret": 22247,
+ "areth": 47725,
+ "aretha": 42090,
+ "areyou": 37607,
+ "arez": 13108,
+ "arg": 27285,
+ "argent": 7812,
+ "argentina": 9789,
+ "argentine": 32582,
+ "argon": 40737,
+ "argos": 37443,
+ "argu": 7440,
+ "arguably": 30899,
+ "argue": 19788,
+ "argued": 48153,
+ "argues": 30045,
+ "arguing": 26549,
+ "argument": 16224,
+ "arguments": 24693,
+ "argus": 44300,
+ "argy": 21066,
+ "argyle": 36179,
+ "argyll": 40667,
+ "ari": 1221,
+ "ari": 3681,
+ "aria": 8883,
+ "arial": 42431,
+ "arian": 29980,
+ "arian": 6953,
+ "ariana": 14892,
+ "arianag": 23025,
+ "arianagrande": 23321,
+ "arianism": 44351,
+ "arians": 19104,
+ "arias": 22567,
+ "arie": 18774,
+ "ariel": 47959,
+ "ariel": 21025,
+ "aries": 5213,
+ "arif": 46621,
+ "arily": 12993,
+ "arin": 29564,
+ "arin": 18612,
+ "arina": 29271,
+ "arine": 29586,
+ "aring": 2142,
+ "ario": 8862,
+ "arios": 25392,
+ "aris": 15227,
+ "arise": 26490,
+ "arist": 12110,
+ "aristo": 25666,
+ "aristotle": 49156,
+ "arities": 31069,
+ "arity": 16608,
+ "arium": 11809,
+ "arius": 21482,
+ "ariz": 6516,
+ "arized": 40167,
+ "arizon": 28936,
+ "arizona": 7106,
+ "arjun": 24565,
+ "arjun": 20477,
+ "arjuna": 43835,
+ "ark": 11921,
+ "ark": 12010,
+ "arkansas": 12227,
+ "arkham": 36381,
+ "arl": 48542,
+ "arlington": 44940,
+ "arlington": 17865,
+ "arly": 3637,
+ "arm": 5671,
+ "arm": 4793,
+ "arma": 15887,
+ "arma": 38716,
+ "armad": 37897,
+ "armada": 34938,
+ "armagh": 44313,
+ "armani": 31314,
+ "armb": 37096,
+ "armchair": 45757,
+ "armed": 40471,
+ "armed": 8202,
+ "armen": 13145,
+ "armenia": 22008,
+ "armenian": 24891,
+ "armies": 46686,
+ "armin": 45481,
+ "arming": 19766,
+ "armist": 38150,
+ "armistice": 46765,
+ "armor": 16167,
+ "armored": 28214,
+ "armory": 38610,
+ "armour": 18503,
+ "armoured": 42514,
+ "arms": 5706,
+ "armstrong": 15005,
+ "army": 13541,
+ "army": 3133,
+ "armys": 27311,
+ "arn": 9348,
+ "arn": 37597,
+ "arnau": 45556,
+ "arne": 43509,
+ "arney": 35962,
+ "arnold": 49096,
+ "arnold": 13609,
+ "arns": 46692,
+ "aro": 7514,
+ "aro": 11551,
+ "aroa": 48209,
+ "arom": 16831,
+ "aroma": 40143,
+ "aroma": 26390,
+ "aromas": 47439,
+ "aromatherapy": 42584,
+ "aromatic": 39669,
+ "aron": 30855,
+ "aron": 28926,
+ "aroo": 47581,
+ "arora": 31897,
+ "arosa": 44264,
+ "arose": 44262,
+ "around": 35615,
+ "around": 1630,
+ "arqu": 35654,
+ "arquitec": 41703,
+ "arr": 39106,
+ "arr": 42489,
+ "arra": 32918,
+ "arra": 43827,
+ "arrahman": 44554,
+ "arran": 45722,
+ "arrang": 16711,
+ "arrange": 15410,
+ "arrange": 26311,
+ "arranged": 22451,
+ "arrangement": 23822,
+ "arrangements": 23792,
+ "arranging": 35321,
+ "array": 17293,
+ "arre": 4374,
+ "arrell": 28846,
+ "arrest": 9320,
+ "arrested": 5845,
+ "arresting": 43930,
+ "arrests": 20683,
+ "arri": 2115,
+ "arrival": 9073,
+ "arrivals": 19583,
+ "arrive": 8851,
+ "arrived": 3514,
+ "arrives": 9905,
+ "arriving": 10884,
+ "arro": 15729,
+ "arrog": 26997,
+ "arrogance": 47025,
+ "arrogant": 40582,
+ "arrow": 30920,
+ "arrow": 11149,
+ "arrowhead": 46393,
+ "arrows": 24768,
+ "arroyo": 45237,
+ "ars": 42815,
+ "ars": 864,
+ "arse": 22665,
+ "arsen": 5330,
+ "arsenal": 45234,
+ "arsenal": 6084,
+ "arsene": 32117,
+ "arson": 29937,
+ "art": 1486,
+ "art": 794,
+ "arta": 12031,
+ "arte": 13482,
+ "arte": 12947,
+ "artem": 40387,
+ "artemis": 45256,
+ "arten": 37043,
+ "arter": 29449,
+ "artery": 40062,
+ "artes": 48629,
+ "artforsale": 48239,
+ "artgallery": 31982,
+ "arth": 7146,
+ "arth": 20265,
+ "arthistory": 39313,
+ "arthr": 20807,
+ "arthritis": 22916,
+ "arthro": 43255,
+ "arthur": 35660,
+ "arthur": 8550,
+ "arti": 1635,
+ "arti": 34601,
+ "artic": 3003,
+ "articho": 30937,
+ "artichoke": 39647,
+ "article": 3550,
+ "articles": 11939,
+ "articul": 40343,
+ "articulate": 45444,
+ "artif": 8950,
+ "artifact": 37718,
+ "artifacts": 30249,
+ "artificial": 19357,
+ "artificial": 12040,
+ "artificialintelligence": 20799,
+ "artillery": 24465,
+ "artin": 33168,
+ "artin": 48540,
+ "artis": 41794,
+ "artisan": 36389,
+ "artisan": 21535,
+ "artisans": 40140,
+ "artist": 14326,
+ "artist": 2456,
+ "artiste": 41402,
+ "artistic": 12421,
+ "artiston": 48443,
+ "artistry": 38570,
+ "artists": 4899,
+ "artistson": 32127,
+ "artistsontwitter": 39469,
+ "artlovers": 35617,
+ "arto": 28464,
+ "artof": 31751,
+ "artoftheday": 43990,
+ "arton": 46744,
+ "arts": 22040,
+ "arts": 3812,
+ "artsy": 31588,
+ "arturo": 38591,
+ "artwit": 36713,
+ "artwork": 4188,
+ "artworks": 26215,
+ "arty": 45417,
+ "arty": 25916,
+ "aru": 13757,
+ "aru": 23907,
+ "aruba": 40131,
+ "arugula": 40770,
+ "arum": 48732,
+ "arun": 16105,
+ "arun": 31877,
+ "arunach": 47260,
+ "arunjaitley": 44874,
+ "arus": 22644,
+ "arvin": 16971,
+ "arvind": 21209,
+ "arvind": 41079,
+ "arvindkejriwal": 22971,
+ "arvo": 45726,
+ "arwx": 29824,
+ "ary": 4617,
+ "ary": 856,
+ "arya": 23594,
+ "aryan": 34966,
+ "as": 587,
+ "as": 601,
+ "asa": 39676,
+ "asa": 11914,
+ "asad": 42376,
+ "asaki": 22455,
+ "asam": 40603,
+ "asan": 22379,
+ "asan": 17841,
+ "asana": 42363,
+ "asant": 25536,
+ "asants": 37766,
+ "asap": 24199,
+ "asap": 10822,
+ "asar": 24733,
+ "asar": 49299,
+ "asb": 31186,
+ "asbe": 32113,
+ "asbestos": 33765,
+ "asc": 22720,
+ "asc": 23305,
+ "ascen": 20767,
+ "ascension": 35499,
+ "ascent": 36625,
+ "asci": 12753,
+ "asco": 25578,
+ "asco": 17488,
+ "ascot": 23723,
+ "ascri": 15506,
+ "asd": 36988,
+ "asda": 29391,
+ "asdf": 36857,
+ "asdfghj": 42758,
+ "asdfghjkl": 47660,
+ "ase": 8083,
+ "ase": 894,
+ "asean": 24472,
+ "aseball": 46903,
+ "ased": 2134,
+ "asen": 41085,
+ "aser": 39615,
+ "aser": 7209,
+ "ases": 3762,
+ "asf": 25863,
+ "asg": 34813,
+ "ash": 2067,
+ "ash": 2612,
+ "asha": 40572,
+ "asha": 13472,
+ "ashamed": 20633,
+ "ashby": 46531,
+ "ashe": 48523,
+ "ashe": 31752,
+ "asher": 37585,
+ "ashes": 12587,
+ "asheville": 28897,
+ "ashford": 37796,
+ "ashi": 15563,
+ "ashi": 15934,
+ "ashish": 33145,
+ "ashland": 39938,
+ "ashleigh": 49356,
+ "ashley": 17825,
+ "ashley": 8957,
+ "asho": 20273,
+ "ashok": 38141,
+ "ashore": 31194,
+ "ashram": 43445,
+ "ashton": 43264,
+ "ashton": 12228,
+ "ashtra": 18118,
+ "asi": 3596,
+ "asi": 12562,
+ "asia": 5741,
+ "asian": 21737,
+ "asian": 7128,
+ "asiangames": 49108,
+ "asians": 36771,
+ "asics": 31097,
+ "aside": 13676,
+ "asif": 37302,
+ "asim": 46050,
+ "asin": 48432,
+ "asin": 44347,
+ "asing": 4194,
+ "asingly": 15803,
+ "asion": 31753,
+ "asis": 12398,
+ "ask": 11027,
+ "ask": 2765,
+ "asked": 3993,
+ "asking": 5914,
+ "asks": 7953,
+ "asl": 41650,
+ "asleep": 10749,
+ "asley": 28206,
+ "asli": 44290,
+ "asm": 13851,
+ "asma": 38497,
+ "asmsg": 19839,
+ "aso": 30343,
+ "aso": 27932,
+ "asober": 43749,
+ "asocial": 48557,
+ "ason": 1163,
+ "asone": 31249,
+ "asons": 4249,
+ "asos": 37924,
+ "asot": 47968,
+ "asp": 17814,
+ "asp": 36666,
+ "asparag": 20301,
+ "asparagus": 20604,
+ "aspe": 10894,
+ "aspect": 19681,
+ "aspects": 18203,
+ "aspen": 35695,
+ "aspen": 25712,
+ "asper": 32991,
+ "asph": 28019,
+ "asphalt": 30574,
+ "aspir": 12669,
+ "aspirations": 36127,
+ "aspire": 24836,
+ "aspiring": 21862,
+ "asports": 43695,
+ "asr": 48052,
+ "asroma": 41000,
+ "ass": 12664,
+ "ass": 5301,
+ "assa": 47715,
+ "assad": 18699,
+ "assam": 19930,
+ "assan": 26352,
+ "assange": 27565,
+ "assas": 9603,
+ "assassin": 14366,
+ "assassin": 20029,
+ "assassinated": 40488,
+ "assassination": 24907,
+ "assassins": 34918,
+ "assassinscre": 36428,
+ "assassinscreed": 46082,
+ "assau": 7908,
+ "assaul": 19596,
+ "assault": 9679,
+ "assaulted": 30785,
+ "assaulting": 44143,
+ "asse": 3166,
+ "asse": 38600,
+ "assel": 37582,
+ "assemb": 5531,
+ "assemble": 26169,
+ "assembled": 22627,
+ "assemblies": 47406,
+ "assembling": 38670,
+ "assembly": 34542,
+ "assembly": 7059,
+ "assen": 38651,
+ "asser": 25665,
+ "asses": 21596,
+ "assess": 9209,
+ "assess": 23211,
+ "assessed": 44160,
+ "assessing": 31364,
+ "assessment": 10590,
+ "assessments": 32753,
+ "asset": 48463,
+ "asset": 13039,
+ "assets": 13170,
+ "assi": 2907,
+ "assi": 39540,
+ "assie": 31624,
+ "assign": 14190,
+ "assigned": 25767,
+ "assignment": 17342,
+ "assignments": 34257,
+ "assim": 36394,
+ "assimil": 43467,
+ "assist": 26558,
+ "assist": 10286,
+ "assistance": 11685,
+ "assistant": 6799,
+ "assistants": 31054,
+ "assisted": 18095,
+ "assisting": 24243,
+ "assists": 12675,
+ "assn": 44208,
+ "asso": 17617,
+ "assoc": 18891,
+ "associ": 3566,
+ "associate": 11777,
+ "associated": 11164,
+ "associates": 17358,
+ "association": 5578,
+ "associations": 33209,
+ "assor": 38604,
+ "assorted": 36701,
+ "assortment": 43112,
+ "asst": 24767,
+ "assu": 8328,
+ "assume": 19294,
+ "assumed": 37661,
+ "assuming": 29422,
+ "assump": 41182,
+ "assumption": 40773,
+ "assumptions": 45948,
+ "assurance": 28408,
+ "assure": 39161,
+ "assured": 25591,
+ "assures": 41988,
+ "assy": 29940,
+ "assy": 12963,
+ "ast": 1761,
+ "ast": 1242,
+ "asta": 43269,
+ "aste": 25033,
+ "aste": 25579,
+ "aster": 11013,
+ "aster": 9526,
+ "asteroid": 32253,
+ "asters": 33139,
+ "asth": 16684,
+ "asthma": 24610,
+ "asthour": 41238,
+ "astic": 15876,
+ "asting": 29984,
+ "astle": 46141,
+ "asto": 47275,
+ "aston": 24760,
+ "aston": 13879,
+ "astoni": 21962,
+ "astonishing": 27110,
+ "astonmartin": 40760,
+ "astor": 26391,
+ "astor": 47086,
+ "astoria": 34798,
+ "astounding": 37748,
+ "astr": 37609,
+ "astra": 47205,
+ "astra": 36079,
+ "astral": 45889,
+ "astri": 31243,
+ "astrid": 46499,
+ "astro": 8563,
+ "astro": 15318,
+ "astrology": 28526,
+ "astron": 7982,
+ "astronaut": 18376,
+ "astronauts": 29733,
+ "astronom": 23264,
+ "astronomer": 40036,
+ "astronomers": 44268,
+ "astronomical": 39775,
+ "astronomy": 17472,
+ "astrophotography": 38559,
+ "astros": 17598,
+ "asts": 10452,
+ "astu": 43137,
+ "astur": 45795,
+ "asu": 13157,
+ "asu": 16001,
+ "asun": 36044,
+ "asure": 3813,
+ "asus": 27269,
+ "aswell": 42978,
+ "asx": 38906,
+ "asy": 8524,
+ "asy": 2333,
+ "asylum": 15638,
+ "asym": 32539,
+ "at": 527,
+ "at": 536,
+ "ata": 4236,
+ "atable": 23909,
+ "atal": 24877,
+ "atal": 24797,
+ "atan": 33446,
+ "atar": 20128,
+ "atar": 7995,
+ "atari": 21549,
+ "atas": 30057,
+ "atay": 39518,
+ "atc": 28383,
+ "atch": 15938,
+ "atd": 33890,
+ "ate": 992,
+ "ate": 671,
+ "ateam": 42784,
+ "ateau": 16359,
+ "atec": 37352,
+ "atech": 31306,
+ "ated": 14589,
+ "ated": 943,
+ "atedly": 24698,
+ "atee": 32839,
+ "ateful": 5419,
+ "atelier": 29932,
+ "ately": 3862,
+ "atem": 17116,
+ "aten": 47984,
+ "atene": 30405,
+ "ateneo": 33904,
+ "ater": 18597,
+ "ater": 5877,
+ "ateral": 18819,
+ "aters": 22364,
+ "ates": 20370,
+ "ates": 1150,
+ "atest": 1705,
+ "ateur": 43677,
+ "atf": 28013,
+ "ath": 1374,
+ "ath": 1649,
+ "atha": 22530,
+ "atham": 23383,
+ "athan": 41260,
+ "athan": 26701,
+ "athe": 8963,
+ "athed": 47402,
+ "atheism": 25823,
+ "atheist": 22571,
+ "atheists": 47155,
+ "athen": 29112,
+ "athena": 30705,
+ "athens": 13524,
+ "ather": 6171,
+ "ather": 1817,
+ "athered": 34091,
+ "athers": 17266,
+ "athi": 28918,
+ "athing": 36069,
+ "athle": 3310,
+ "athlete": 7388,
+ "athletes": 7125,
+ "athletic": 33182,
+ "athletic": 9028,
+ "athletics": 7019,
+ "athlon": 14670,
+ "athome": 38217,
+ "athon": 4951,
+ "aths": 28835,
+ "athy": 34488,
+ "athy": 13183,
+ "ati": 591,
+ "ati": 6751,
+ "atia": 10908,
+ "atic": 20248,
+ "atic": 2647,
+ "atically": 13558,
+ "atics": 15666,
+ "atie": 30137,
+ "aties": 40060,
+ "atif": 41592,
+ "atiku": 37912,
+ "atile": 15474,
+ "atility": 23373,
+ "atime": 20158,
+ "atin": 36903,
+ "atin": 23047,
+ "atine": 39741,
+ "ating": 25653,
+ "ating": 1074,
+ "atio": 35401,
+ "ation": 2265,
+ "ation": 656,
+ "ational": 14205,
+ "ational": 3108,
+ "ationals": 44593,
+ "ationday": 20082,
+ "ations": 986,
+ "atis": 45456,
+ "atis": 41142,
+ "atism": 45638,
+ "ative": 18422,
+ "ative": 1648,
+ "atively": 11929,
+ "atives": 5629,
+ "ativity": 25166,
+ "atkins": 27734,
+ "atkinson": 28908,
+ "atl": 5411,
+ "atl": 10629,
+ "atla": 36043,
+ "atlan": 6818,
+ "atlanta": 39964,
+ "atlanta": 6839,
+ "atlantic": 28804,
+ "atlantic": 8189,
+ "atlantis": 27790,
+ "atlas": 15775,
+ "atle": 21170,
+ "atleast": 33231,
+ "atleti": 46067,
+ "atletico": 27501,
+ "atm": 14127,
+ "atmo": 8271,
+ "atmosphere": 10506,
+ "atmospheric": 24223,
+ "ato": 7987,
+ "ato": 4364,
+ "atoday": 26799,
+ "atom": 22418,
+ "atom": 24031,
+ "atomic": 18996,
+ "atoms": 41434,
+ "aton": 31525,
+ "aton": 10012,
+ "atop": 17455,
+ "ator": 10748,
+ "ator": 1962,
+ "atore": 28314,
+ "atorial": 32040,
+ "atories": 35678,
+ "atorium": 41306,
+ "ators": 3389,
+ "atory": 5920,
+ "atos": 41643,
+ "atour": 42967,
+ "atown": 24000,
+ "atp": 38105,
+ "atp": 19817,
+ "atr": 43247,
+ "atra": 20227,
+ "atra": 14401,
+ "atravel": 36981,
+ "atre": 46057,
+ "atri": 13882,
+ "atri": 38889,
+ "atric": 32238,
+ "atric": 13652,
+ "atrics": 36253,
+ "atrist": 41879,
+ "atrium": 29725,
+ "atrix": 43003,
+ "atro": 18724,
+ "atroc": 36197,
+ "atrocities": 37551,
+ "atry": 28334,
+ "ats": 46890,
+ "ats": 1032,
+ "atsu": 26531,
+ "att": 1017,
+ "att": 7103,
+ "atta": 7282,
+ "atta": 9146,
+ "attach": 43676,
+ "attach": 35653,
+ "attached": 11038,
+ "attachment": 28638,
+ "attack": 24971,
+ "attack": 3815,
+ "attacked": 12366,
+ "attacker": 39288,
+ "attackers": 47701,
+ "attacking": 16813,
+ "attacks": 7321,
+ "attain": 46459,
+ "attar": 37110,
+ "attemp": 4933,
+ "attempt": 7409,
+ "attempted": 17408,
+ "attempting": 18195,
+ "attempts": 15610,
+ "atten": 4084,
+ "atten": 32408,
+ "attenborough": 45860,
+ "attend": 9841,
+ "attend": 5802,
+ "attendance": 11928,
+ "attendant": 35424,
+ "attended": 8140,
+ "attendees": 14648,
+ "attending": 6696,
+ "attends": 22248,
+ "attention": 4936,
+ "atters": 30675,
+ "atthe": 21489,
+ "atti": 49265,
+ "atti": 16235,
+ "attic": 26766,
+ "attire": 21222,
+ "attitude": 10648,
+ "attitudes": 27611,
+ "attle": 14685,
+ "attle": 5030,
+ "attn": 25677,
+ "attor": 8856,
+ "attorney": 10372,
+ "attorneys": 29113,
+ "attrac": 7154,
+ "attract": 17010,
+ "attracted": 28493,
+ "attracting": 31909,
+ "attraction": 16807,
+ "attractions": 22307,
+ "attractive": 12231,
+ "attracts": 31024,
+ "attribu": 24624,
+ "attributed": 37520,
+ "attributes": 40763,
+ "attu": 43173,
+ "atty": 36705,
+ "atu": 15191,
+ "atu": 24295,
+ "atuesday": 34841,
+ "atul": 1744,
+ "atul": 43948,
+ "atum": 48295,
+ "atur": 14986,
+ "aturday": 29027,
+ "ature": 25305,
+ "ature": 4490,
+ "atures": 7358,
+ "atus": 14795,
+ "atv": 19598,
+ "atwood": 45680,
+ "atwork": 39680,
+ "atx": 34849,
+ "atx": 20136,
+ "aty": 40974,
+ "aty": 33107,
+ "atz": 30432,
+ "au": 627,
+ "au": 2566,
+ "aua": 45906,
+ "aub": 45938,
+ "auberg": 49382,
+ "aubre": 25899,
+ "aubrey": 34110,
+ "auburn": 42269,
+ "auburn": 14534,
+ "auc": 24489,
+ "auch": 43024,
+ "auck": 14588,
+ "auckland": 16072,
+ "auction": 48160,
+ "auction": 6462,
+ "auctioned": 41073,
+ "auctions": 24876,
+ "aucus": 47374,
+ "aud": 16107,
+ "aud": 19711,
+ "audi": 5091,
+ "audi": 10277,
+ "audible": 33227,
+ "audience": 6863,
+ "audiences": 22328,
+ "audio": 13792,
+ "audio": 5766,
+ "audiobook": 26282,
+ "audit": 12505,
+ "audit": 17625,
+ "auditi": 37377,
+ "audition": 18673,
+ "auditions": 21134,
+ "auditor": 38050,
+ "auditorium": 15063,
+ "audre": 16075,
+ "audrey": 18812,
+ "audu": 27934,
+ "audubon": 40275,
+ "auer": 33460,
+ "auf": 28924,
+ "aug": 15397,
+ "aug": 5720,
+ "auga": 22797,
+ "augh": 28310,
+ "augh": 14005,
+ "augmente": 48356,
+ "augmented": 32708,
+ "augu": 2610,
+ "august": 24353,
+ "august": 3171,
+ "augusta": 26144,
+ "augustine": 27397,
+ "augustus": 36835,
+ "auk": 19058,
+ "aul": 20695,
+ "aul": 34391,
+ "ault": 47253,
+ "ault": 10219,
+ "aun": 10608,
+ "aun": 38721,
+ "aunt": 12685,
+ "auntie": 23783,
+ "aunty": 29528,
+ "aur": 8156,
+ "aur": 17282,
+ "aura": 27728,
+ "aure": 36010,
+ "aureli": 35980,
+ "auror": 30067,
+ "aurora": 13500,
+ "aus": 10624,
+ "aus": 7630,
+ "ausa": 37384,
+ "ausbiz": 46543,
+ "ausch": 33926,
+ "auschwitz": 36523,
+ "ausopen": 27831,
+ "ausp": 35039,
+ "auspicious": 38806,
+ "auspol": 8241,
+ "aussi": 19762,
+ "aussie": 40230,
+ "aussie": 14424,
+ "aussies": 35727,
+ "aust": 26301,
+ "aust": 25418,
+ "austen": 29885,
+ "auster": 25030,
+ "austerity": 26982,
+ "austin": 12845,
+ "austin": 5125,
+ "austinmahone": 34678,
+ "austr": 2518,
+ "australi": 13798,
+ "australia": 3444,
+ "australian": 23630,
+ "australian": 6258,
+ "australians": 31488,
+ "austri": 8946,
+ "austria": 11960,
+ "austrian": 20638,
+ "ausv": 35206,
+ "ausvotes": 34661,
+ "aut": 12343,
+ "auth": 2381,
+ "auth": 38247,
+ "authent": 18158,
+ "authentic": 41266,
+ "authentic": 10369,
+ "authentication": 39746,
+ "authenticity": 35734,
+ "autho": 34552,
+ "author": 14447,
+ "author": 4358,
+ "authored": 37928,
+ "authori": 19207,
+ "authorities": 12729,
+ "authority": 10524,
+ "authorization": 48854,
+ "authorized": 28463,
+ "authors": 10765,
+ "auti": 8200,
+ "autism": 36256,
+ "autism": 11244,
+ "autisma": 43324,
+ "autistic": 29360,
+ "auto": 3917,
+ "auto": 5668,
+ "autobiography": 31509,
+ "autodesk": 40415,
+ "autograph": 10657,
+ "autograph": 13722,
+ "autographed": 16309,
+ "autographs": 17376,
+ "autoimmune": 45509,
+ "autom": 4114,
+ "automate": 43203,
+ "automated": 19022,
+ "automatic": 12126,
+ "automatically": 20725,
+ "automation": 12328,
+ "automobi": 44813,
+ "automobile": 25258,
+ "automotive": 12607,
+ "auton": 13100,
+ "autonews": 43975,
+ "autonom": 17870,
+ "autonomous": 20722,
+ "autonomy": 39223,
+ "autopsy": 44436,
+ "autos": 31118,
+ "autoshow": 46788,
+ "auts": 21140,
+ "autu": 5445,
+ "autum": 31783,
+ "autumn": 28940,
+ "autumn": 6110,
+ "autumnal": 35481,
+ "aux": 18154,
+ "aux": 8909,
+ "auxiliary": 37778,
+ "av": 722,
+ "av": 8484,
+ "ava": 12385,
+ "avage": 31505,
+ "avail": 1651,
+ "avail": 16686,
+ "availability": 17551,
+ "available": 1685,
+ "aval": 18012,
+ "avalan": 23970,
+ "avalanche": 25815,
+ "avalley": 45082,
+ "avalon": 30436,
+ "avan": 27971,
+ "avan": 33351,
+ "avant": 24305,
+ "avar": 33423,
+ "avatar": 18219,
+ "ave": 10062,
+ "ave": 4860,
+ "avec": 25828,
+ "aved": 47918,
+ "avel": 46817,
+ "avel": 48088,
+ "aven": 5963,
+ "aven": 32971,
+ "aveng": 21935,
+ "avenger": 24799,
+ "avengers": 39413,
+ "avengers": 12016,
+ "avengersendgame": 49342,
+ "avent": 22700,
+ "avenue": 7042,
+ "aver": 8788,
+ "aver": 11403,
+ "average": 6254,
+ "averaged": 37310,
+ "averages": 48982,
+ "averaging": 35266,
+ "avery": 20313,
+ "aves": 14023,
+ "avfc": 21304,
+ "avg": 19452,
+ "avgeek": 11114,
+ "avi": 3324,
+ "avi": 11297,
+ "avia": 38710,
+ "avian": 24115,
+ "aviation": 27717,
+ "aviation": 7617,
+ "aviator": 38921,
+ "aviators": 48011,
+ "avici": 46192,
+ "avicii": 49158,
+ "avid": 19118,
+ "avier": 14598,
+ "avila": 45339,
+ "aville": 40689,
+ "avin": 46204,
+ "avis": 45163,
+ "avis": 19765,
+ "aviv": 22130,
+ "aviva": 47122,
+ "aviz": 27607,
+ "avl": 44749,
+ "avo": 4496,
+ "avo": 32400,
+ "avoc": 12291,
+ "avocado": 14135,
+ "avocados": 48911,
+ "avoi": 16797,
+ "avoid": 30448,
+ "avoid": 5983,
+ "avoidance": 47983,
+ "avoided": 32103,
+ "avoiding": 22086,
+ "avoids": 48220,
+ "avon": 22790,
+ "avon": 17348,
+ "avril": 37763,
+ "avs": 31896,
+ "avut": 44472,
+ "avy": 29973,
+ "aw": 808,
+ "aw": 5557,
+ "awa": 4820,
+ "awa": 6872,
+ "await": 20769,
+ "awaited": 20092,
+ "awaiting": 14872,
+ "awaits": 15635,
+ "awak": 9776,
+ "awak": 41387,
+ "awake": 14695,
+ "awaken": 35412,
+ "awakening": 17017,
+ "awakens": 23191,
+ "awal": 42447,
+ "awal": 35090,
+ "awan": 48869,
+ "awan": 20420,
+ "awar": 5745,
+ "award": 36310,
+ "award": 2047,
+ "awarded": 7368,
+ "awarding": 37089,
+ "awards": 34528,
+ "awards": 2320,
+ "aware": 4427,
+ "aware": 7196,
+ "awareness": 19217,
+ "awareness": 4823,
+ "awarenessmonth": 34278,
+ "awarenessweek": 35294,
+ "away": 21088,
+ "away": 1520,
+ "aways": 12782,
+ "awaz": 18586,
+ "awd": 34846,
+ "awe": 1693,
+ "awe": 14106,
+ "aweather": 42142,
+ "aweather": 28681,
+ "awec": 38916,
+ "aweed": 29724,
+ "awesom": 16727,
+ "awesome": 30390,
+ "awesome": 1848,
+ "awesomeness": 22430,
+ "awful": 13617,
+ "awg": 46350,
+ "awgs": 35275,
+ "awh": 39566,
+ "awhile": 19171,
+ "awi": 15167,
+ "awil": 47271,
+ "awilliams": 42163,
+ "awk": 8888,
+ "awk": 40943,
+ "awkward": 42337,
+ "awkward": 10304,
+ "awn": 46222,
+ "awp": 43300,
+ "aws": 19658,
+ "awsome": 47196,
+ "awson": 36286,
+ "aww": 11568,
+ "awww": 15634,
+ "awwww": 26460,
+ "awx": 28385,
+ "ax": 3165,
+ "ax": 9203,
+ "axe": 19861,
+ "axel": 47889,
+ "axel": 32131,
+ "axes": 45970,
+ "axi": 30672,
+ "axial": 46550,
+ "axis": 19614,
+ "axle": 39003,
+ "axx": 47411,
+ "ay": 658,
+ "ay": 551,
+ "aya": 5917,
+ "ayala": 39827,
+ "ayama": 41194,
+ "ayan": 37781,
+ "ayan": 16269,
+ "ayana": 37400,
+ "ayas": 40904,
+ "ayat": 44902,
+ "ayat": 35720,
+ "aye": 21661,
+ "aye": 12446,
+ "ayer": 24852,
+ "ayers": 42783,
+ "ayesha": 46570,
+ "ayi": 33025,
+ "ayles": 44706,
+ "ayne": 35669,
+ "ayo": 21929,
+ "ayo": 18708,
+ "ayr": 23002,
+ "ayr": 36473,
+ "ayrshire": 32687,
+ "ays": 785,
+ "ayu": 40769,
+ "ayurve": 27185,
+ "ayurveda": 38986,
+ "ayush": 44831,
+ "ayy": 32514,
+ "ayyy": 41052,
+ "az": 854,
+ "az": 5468,
+ "aza": 22883,
+ "azad": 37838,
+ "azalea": 34087,
+ "azam": 34727,
+ "azar": 27911,
+ "azcardinals": 48846,
+ "aze": 41157,
+ "aze": 28485,
+ "azer": 19169,
+ "azerbai": 20649,
+ "azerbaijan": 23888,
+ "azhar": 47019,
+ "azi": 23914,
+ "azi": 18452,
+ "azine": 29140,
+ "azione": 48335,
+ "aziz": 41205,
+ "aziz": 29630,
+ "azo": 41227,
+ "azon": 36854,
+ "azores": 42826,
+ "azte": 33270,
+ "aztec": 34749,
+ "aztecs": 49387,
+ "azu": 27701,
+ "azu": 46963,
+ "azul": 39807,
+ "azure": 18514,
+ "azwx": 30262,
+ "azy": 24783,
+ "azz": 9817,
+ "azz": 26453,
+ "azza": 22255,
+ "azzi": 18758,
+ "azzle": 39974,
+ "azzo": 26779,
+ "azzur": 37055,
+ "azzy": 44534,
+ "añ": 23716,
+ "años": 41634,
+ "b": 65,
+ "b": 321,
+ "ba": 932,
+ "ba": 1792,
+ "baa": 33004,
+ "baahu": 34145,
+ "baahubali": 38663,
+ "bab": 1202,
+ "bab": 19039,
+ "baba": 12631,
+ "babe": 31177,
+ "babe": 7716,
+ "babes": 14253,
+ "babies": 6635,
+ "babs": 36217,
+ "babu": 21623,
+ "baby": 7268,
+ "baby": 1794,
+ "babygirl": 39554,
+ "babylon": 31928,
+ "babymetal": 45013,
+ "babys": 22266,
+ "babysitting": 34186,
+ "bac": 2791,
+ "bac": 25867,
+ "bacca": 40708,
+ "bach": 11773,
+ "bach": 8758,
+ "bachchan": 17690,
+ "bachel": 11283,
+ "bachelor": 45508,
+ "bachelor": 16766,
+ "bachelore": 26009,
+ "bachelorette": 29093,
+ "bacher": 49211,
+ "back": 1663,
+ "back": 893,
+ "backbone": 35635,
+ "backdrop": 20802,
+ "backed": 12721,
+ "backer": 22183,
+ "backers": 32934,
+ "background": 5994,
+ "backgrounds": 28215,
+ "backing": 14935,
+ "backlash": 31519,
+ "backpack": 14894,
+ "backpacking": 29524,
+ "backpacks": 37063,
+ "backs": 7562,
+ "backseat": 48812,
+ "backstage": 9236,
+ "backstreet": 46337,
+ "backthe": 26127,
+ "backto": 18703,
+ "backtoschool": 28730,
+ "backtothe": 43059,
+ "backup": 14415,
+ "backward": 37964,
+ "backwards": 21283,
+ "backyard": 12608,
+ "bacon": 48666,
+ "bacon": 7104,
+ "bacter": 11814,
+ "bacteria": 16556,
+ "bacterial": 26101,
+ "bad": 2564,
+ "bad": 2103,
+ "bada": 37475,
+ "badan": 39149,
+ "badass": 11616,
+ "baddest": 38112,
+ "baden": 36690,
+ "bader": 42254,
+ "badge": 11301,
+ "badger": 32686,
+ "badger": 22363,
+ "badgers": 22521,
+ "badges": 20084,
+ "badlands": 43192,
+ "badly": 13684,
+ "badminton": 21412,
+ "badoo": 33192,
+ "bados": 25755,
+ "bae": 32834,
+ "bae": 6855,
+ "baek": 18557,
+ "baek": 32702,
+ "baekhyun": 21572,
+ "baes": 46332,
+ "baf": 13616,
+ "baff": 35693,
+ "bafta": 29199,
+ "bag": 3408,
+ "bag": 3365,
+ "bage": 9698,
+ "bagel": 28777,
+ "bagels": 37489,
+ "baggage": 31402,
+ "bagged": 34047,
+ "bagh": 21659,
+ "bagh": 37271,
+ "baghdad": 30763,
+ "bago": 25105,
+ "bags": 6136,
+ "bagu": 27749,
+ "baguette": 45334,
+ "bah": 8372,
+ "bah": 16685,
+ "baha": 29592,
+ "baham": 43718,
+ "bahamas": 21224,
+ "bahan": 28704,
+ "bahn": 33452,
+ "bahrain": 12503,
+ "bai": 6232,
+ "bai": 23339,
+ "bail": 22933,
+ "bail": 16986,
+ "bailey": 27535,
+ "bailey": 10180,
+ "bain": 40784,
+ "bain": 21593,
+ "bair": 29059,
+ "baird": 40474,
+ "bait": 18010,
+ "baj": 20713,
+ "baja": 40418,
+ "baja": 28374,
+ "bajo": 32619,
+ "bak": 4059,
+ "bak": 23742,
+ "bakar": 41414,
+ "bake": 20736,
+ "bake": 11878,
+ "baked": 10364,
+ "baker": 27303,
+ "baker": 7743,
+ "bakers": 35293,
+ "bakers": 40231,
+ "bakersfield": 40149,
+ "bakery": 13377,
+ "bakes": 43057,
+ "bakhta": 44912,
+ "bakhtawar": 46937,
+ "bakhtawarbz": 47118,
+ "baking": 11467,
+ "baku": 46417,
+ "baku": 31852,
+ "bal": 1398,
+ "bal": 2282,
+ "bala": 20291,
+ "balaji": 48694,
+ "balance": 42894,
+ "balance": 6827,
+ "balanced": 15273,
+ "balances": 37733,
+ "balancing": 23541,
+ "balboa": 45098,
+ "balcony": 16169,
+ "bald": 11153,
+ "bald": 14875,
+ "baldhead": 29191,
+ "baldwin": 16242,
+ "bale": 48573,
+ "bale": 18873,
+ "bales": 42879,
+ "bali": 16432,
+ "bali": 10900,
+ "balkan": 48499,
+ "balkans": 42987,
+ "ball": 3807,
+ "ball": 1069,
+ "balla": 42246,
+ "ballad": 33472,
+ "ballarat": 46645,
+ "ballard": 31750,
+ "baller": 49194,
+ "baller": 25655,
+ "ballerina": 34962,
+ "ballers": 34173,
+ "ballet": 10703,
+ "balli": 29406,
+ "ballin": 47444,
+ "ballin": 33057,
+ "balling": 47588,
+ "ballis": 46675,
+ "ballistic": 36667,
+ "ballo": 8871,
+ "ballon": 36469,
+ "balloon": 13634,
+ "balloons": 18130,
+ "ballot": 14185,
+ "ballots": 35051,
+ "ballpark": 26080,
+ "ballroom": 15493,
+ "balls": 6927,
+ "bally": 17275,
+ "bally": 29451,
+ "balm": 24962,
+ "balmain": 45929,
+ "balo": 12395,
+ "baloch": 23173,
+ "balochistan": 21918,
+ "balot": 44615,
+ "balotelli": 45721,
+ "bals": 44154,
+ "balsam": 29121,
+ "balsamic": 32654,
+ "balt": 24441,
+ "balti": 8400,
+ "baltic": 23817,
+ "baltimore": 38502,
+ "baltimore": 9582,
+ "balu": 38093,
+ "bam": 6383,
+ "bam": 12686,
+ "bama": 20021,
+ "bambam": 34538,
+ "bambi": 46596,
+ "bamboo": 49322,
+ "bamboo": 16748,
+ "ban": 1159,
+ "ban": 2777,
+ "bana": 18428,
+ "banan": 38410,
+ "banana": 8922,
+ "bananas": 19121,
+ "banc": 39252,
+ "band": 4613,
+ "band": 1963,
+ "banda": 31865,
+ "bandai": 42054,
+ "bandana": 39265,
+ "bandcamp": 32229,
+ "banded": 37804,
+ "bandic": 44400,
+ "bandit": 27639,
+ "bandits": 33940,
+ "bandra": 41393,
+ "bands": 7858,
+ "bandung": 29512,
+ "bandwagon": 36432,
+ "bandwidth": 48859,
+ "bane": 9597,
+ "banerjee": 48102,
+ "banff": 29565,
+ "bang": 3524,
+ "bang": 6907,
+ "bangalore": 14697,
+ "banger": 24872,
+ "bangers": 38311,
+ "banging": 33033,
+ "bangkok": 12351,
+ "bangla": 10339,
+ "bangla": 45928,
+ "bangladesh": 11245,
+ "bangle": 37634,
+ "bangor": 31190,
+ "bangs": 27992,
+ "bangtan": 39131,
+ "bani": 19732,
+ "banjo": 27014,
+ "bank": 7061,
+ "bank": 2723,
+ "banker": 27316,
+ "bankers": 30599,
+ "bankholiday": 48868,
+ "banking": 9566,
+ "bankno": 49201,
+ "bankof": 39120,
+ "bankrup": 21904,
+ "bankrupt": 23077,
+ "bankrupt": 37288,
+ "bankruptcy": 23978,
+ "banks": 6367,
+ "banksy": 33350,
+ "bann": 5304,
+ "banned": 12012,
+ "banner": 9185,
+ "banners": 23145,
+ "banning": 26246,
+ "bannon": 29710,
+ "bano": 42947,
+ "banquet": 14254,
+ "bans": 15146,
+ "bant": 23301,
+ "bant": 46657,
+ "banter": 25535,
+ "bao": 39487,
+ "bao": 20408,
+ "bap": 7415,
+ "bap": 23754,
+ "bapti": 15477,
+ "baptism": 36765,
+ "baptist": 13274,
+ "baptiste": 45770,
+ "baptized": 45400,
+ "bar": 1040,
+ "bar": 2411,
+ "bara": 19345,
+ "barack": 18670,
+ "barack": 22481,
+ "barackobama": 18885,
+ "barak": 47419,
+ "barak": 16260,
+ "barang": 38446,
+ "barb": 24173,
+ "barb": 20913,
+ "barbados": 26992,
+ "barbar": 7906,
+ "barbara": 10937,
+ "barbarian": 42530,
+ "barbe": 18372,
+ "barbecue": 23501,
+ "barber": 19517,
+ "barber": 12296,
+ "barbershop": 37707,
+ "barbican": 47668,
+ "barbie": 16923,
+ "barca": 22942,
+ "barcel": 6134,
+ "barcelon": 47820,
+ "barcelona": 6412,
+ "barclay": 48877,
+ "barclay": 45276,
+ "barclays": 29538,
+ "bard": 39812,
+ "bard": 17514,
+ "bare": 16023,
+ "bare": 14318,
+ "barefoot": 30327,
+ "barely": 12684,
+ "bargain": 15076,
+ "bargaining": 41282,
+ "bargains": 34126,
+ "barge": 28272,
+ "bari": 21428,
+ "bari": 28016,
+ "barista": 31078,
+ "barit": 46300,
+ "bark": 32333,
+ "bark": 16560,
+ "barker": 20618,
+ "barking": 32676,
+ "barkley": 30266,
+ "barley": 22607,
+ "barlow": 25483,
+ "barn": 10490,
+ "barn": 10942,
+ "barnab": 43272,
+ "barnard": 44332,
+ "barne": 42527,
+ "barnes": 13102,
+ "barnet": 41943,
+ "barnett": 27650,
+ "barney": 24563,
+ "barns": 43759,
+ "barnsley": 37109,
+ "barnsley": 32153,
+ "baro": 17422,
+ "baro": 30817,
+ "baron": 48371,
+ "baron": 19349,
+ "baroness": 45056,
+ "barons": 45596,
+ "baroque": 25065,
+ "barr": 39473,
+ "barr": 22492,
+ "barra": 28442,
+ "barra": 33542,
+ "barrabest": 41376,
+ "barrac": 40835,
+ "barracks": 35822,
+ "barre": 13840,
+ "barre": 38257,
+ "barred": 33261,
+ "barrel": 11703,
+ "barrels": 22059,
+ "barren": 46743,
+ "barrett": 18701,
+ "barri": 8660,
+ "barric": 29189,
+ "barrie": 27090,
+ "barrier": 15706,
+ "barriers": 16321,
+ "barrington": 48954,
+ "barron": 34881,
+ "barrow": 42568,
+ "barrow": 24983,
+ "barry": 18028,
+ "barry": 8461,
+ "barrymore": 49310,
+ "bars": 8616,
+ "barstool": 44826,
+ "bart": 14838,
+ "bart": 12870,
+ "bartender": 33498,
+ "barthol": 48989,
+ "bartlett": 37130,
+ "bartol": 38209,
+ "barton": 48853,
+ "barton": 20345,
+ "baru": 16356,
+ "barun": 38278,
+ "barunsob": 41398,
+ "barça": 32788,
+ "bas": 1244,
+ "bas": 11420,
+ "basa": 26142,
+ "base": 2776,
+ "base": 4579,
+ "baseball": 23479,
+ "baseball": 3470,
+ "based": 35196,
+ "based": 2812,
+ "basel": 42803,
+ "basel": 20903,
+ "baseline": 40648,
+ "baseman": 45910,
+ "basement": 14792,
+ "bases": 20496,
+ "bash": 20462,
+ "bash": 10972,
+ "bashing": 37545,
+ "bashir": 42799,
+ "basic": 40452,
+ "basic": 7696,
+ "basically": 9125,
+ "basics": 15825,
+ "basil": 19225,
+ "basil": 14936,
+ "basilica": 27879,
+ "basin": 16117,
+ "basing": 47321,
+ "basis": 12278,
+ "baske": 3713,
+ "basket": 10338,
+ "basketball": 40023,
+ "basketball": 3835,
+ "baskets": 27787,
+ "basking": 39769,
+ "basque": 37175,
+ "bass": 22831,
+ "bass": 5992,
+ "bassett": 45992,
+ "bassist": 26496,
+ "bast": 28092,
+ "basti": 8559,
+ "bastille": 41874,
+ "bat": 2121,
+ "bat": 6575,
+ "bata": 39277,
+ "batb": 33962,
+ "batch": 9413,
+ "bate": 25034,
+ "bate": 28277,
+ "bateman": 41635,
+ "bates": 21727,
+ "batgirl": 46460,
+ "bath": 6064,
+ "bath": 5713,
+ "bathing": 20144,
+ "bathro": 21201,
+ "bathroom": 8470,
+ "bathrooms": 26434,
+ "baths": 19442,
+ "bathtub": 39942,
+ "bathurst": 36365,
+ "bati": 23362,
+ "bati": 37589,
+ "batman": 27811,
+ "batman": 7223,
+ "baton": 24331,
+ "bats": 14984,
+ "batsman": 35432,
+ "batt": 2407,
+ "batt": 48595,
+ "battalion": 20820,
+ "batter": 12654,
+ "batter": 31855,
+ "battered": 34375,
+ "batteries": 16666,
+ "battersea": 35839,
+ "battery": 7870,
+ "batting": 17401,
+ "battle": 7344,
+ "battle": 3528,
+ "battled": 37837,
+ "battlefield": 16055,
+ "battlefront": 42214,
+ "battleof": 47560,
+ "battles": 14213,
+ "battleship": 35165,
+ "battling": 17268,
+ "bau": 6055,
+ "bau": 34840,
+ "bauer": 22903,
+ "baugh": 41301,
+ "baum": 19840,
+ "bautista": 31881,
+ "bav": 21075,
+ "bavaria": 39977,
+ "bavarian": 44458,
+ "baw": 19808,
+ "bax": 21216,
+ "baxter": 26168,
+ "bay": 3631,
+ "bay": 2174,
+ "baya": 31573,
+ "bayan": 43895,
+ "bayarea": 28260,
+ "bayer": 48548,
+ "bayer": 29183,
+ "bayern": 14666,
+ "baylor": 21721,
+ "bayou": 33955,
+ "bays": 40156,
+ "baz": 10430,
+ "baz": 25268,
+ "bazaar": 20070,
+ "bazar": 49298,
+ "bb": 1174,
+ "bb": 3529,
+ "bba": 27762,
+ "bball": 15664,
+ "bbb": 33535,
+ "bbc": 5123,
+ "bbc": 5188,
+ "bbcc": 39052,
+ "bbce": 33818,
+ "bbcnews": 29370,
+ "bbcone": 28259,
+ "bbcqt": 37343,
+ "bbcr": 35802,
+ "bbcra": 17115,
+ "bbcradi": 49213,
+ "bbcradio": 22876,
+ "bbcsport": 49321,
+ "bbcspringwatch": 37358,
+ "bbctwo": 40395,
+ "bbcworld": 47340,
+ "bbe": 37559,
+ "bbed": 9077,
+ "bber": 7933,
+ "bbers": 36494,
+ "bbhutto": 28085,
+ "bbhuttozardari": 28135,
+ "bbi": 37047,
+ "bbin": 38553,
+ "bbing": 9787,
+ "bbins": 42504,
+ "bbl": 21961,
+ "bble": 26570,
+ "bble": 5924,
+ "bbled": 37626,
+ "bbles": 18093,
+ "bblo": 21231,
+ "bbloggers": 26614,
+ "bbly": 43031,
+ "bbm": 25382,
+ "bbmas": 22145,
+ "bbn": 28427,
+ "bbnaija": 20984,
+ "bbo": 21892,
+ "bbq": 41270,
+ "bbq": 6726,
+ "bbs": 10002,
+ "bbuk": 45978,
+ "bby": 11166,
+ "bby": 3810,
+ "bc": 3116,
+ "bc": 2162,
+ "bcc": 41509,
+ "bcci": 36138,
+ "bce": 36510,
+ "bcfc": 34359,
+ "bch": 36684,
+ "bcn": 25766,
+ "bcoz": 46373,
+ "bcpoli": 24389,
+ "bcs": 24909,
+ "bcu": 28299,
+ "bd": 24358,
+ "bd": 11165,
+ "bday": 33022,
+ "bday": 5781,
+ "bdg": 48418,
+ "bds": 26732,
+ "be": 571,
+ "be": 655,
+ "bea": 21886,
+ "bea": 20925,
+ "beach": 6068,
+ "beach": 2117,
+ "beaches": 12183,
+ "beachlife": 43824,
+ "beacon": 36883,
+ "beacon": 18858,
+ "beacons": 39395,
+ "bead": 31621,
+ "bead": 23557,
+ "beaded": 26661,
+ "beads": 14099,
+ "beagle": 30044,
+ "beak": 36498,
+ "beal": 45769,
+ "beale": 39717,
+ "beam": 35339,
+ "beam": 13663,
+ "beams": 23993,
+ "bean": 16471,
+ "bean": 5328,
+ "beanie": 21534,
+ "beans": 8302,
+ "bear": 6375,
+ "bear": 4298,
+ "bearable": 38608,
+ "bearcats": 33242,
+ "beard": 26157,
+ "beard": 9052,
+ "bearded": 28459,
+ "beardown": 43687,
+ "beards": 33020,
+ "bearer": 30686,
+ "bearers": 47986,
+ "bearing": 18370,
+ "bearings": 42083,
+ "bearish": 34829,
+ "bears": 6182,
+ "beasley": 43349,
+ "beast": 20847,
+ "beast": 6957,
+ "beastmode": 43076,
+ "beasts": 21771,
+ "beat": 3774,
+ "beat": 3018,
+ "beaten": 10864,
+ "beater": 41974,
+ "beati": 44386,
+ "beating": 10078,
+ "beatles": 11961,
+ "beatport": 31421,
+ "beatrice": 36922,
+ "beats": 6289,
+ "beatthe": 40550,
+ "beatty": 39903,
+ "beatz": 33363,
+ "beau": 1016,
+ "beau": 14298,
+ "beaufort": 45423,
+ "beaumont": 32857,
+ "beaut": 24559,
+ "beauti": 1154,
+ "beauties": 14874,
+ "beautiful": 13662,
+ "beautiful": 1215,
+ "beautifully": 10627,
+ "beauty": 12881,
+ "beauty": 2488,
+ "beav": 23260,
+ "beaver": 26432,
+ "beaver": 22874,
+ "beavers": 34513,
+ "beavs": 43909,
+ "bebe": 23331,
+ "bec": 6899,
+ "bec": 10773,
+ "became": 5464,
+ "because": 32714,
+ "because": 1631,
+ "becca": 27088,
+ "bech": 44055,
+ "beck": 8256,
+ "beck": 10396,
+ "becker": 26918,
+ "beckett": 27249,
+ "beckham": 18764,
+ "becky": 32406,
+ "becky": 18921,
+ "become": 2989,
+ "becomes": 6766,
+ "becoming": 6208,
+ "bed": 4152,
+ "bed": 2722,
+ "bedding": 31761,
+ "bedford": 20779,
+ "bedi": 39181,
+ "bedro": 18415,
+ "bedroom": 8411,
+ "bedrooms": 23996,
+ "beds": 13914,
+ "bedside": 47473,
+ "bedtime": 22115,
+ "bee": 6097,
+ "bee": 5028,
+ "beech": 32733,
+ "beech": 27596,
+ "beef": 21703,
+ "beef": 6529,
+ "beek": 37915,
+ "been": 33986,
+ "been": 1025,
+ "beep": 33432,
+ "beer": 8885,
+ "beer": 2544,
+ "beers": 10907,
+ "bees": 36249,
+ "bees": 9100,
+ "beet": 12582,
+ "beet": 28621,
+ "beethoven": 23656,
+ "beetle": 16534,
+ "beetles": 36317,
+ "beetro": 29251,
+ "beetroot": 31638,
+ "beets": 36087,
+ "before": 20898,
+ "before": 1348,
+ "beg": 2219,
+ "beg": 22401,
+ "began": 8636,
+ "begg": 36769,
+ "begging": 25371,
+ "begin": 19197,
+ "begin": 4947,
+ "beginner": 24351,
+ "beginners": 21930,
+ "beginning": 5791,
+ "beginnings": 22581,
+ "begins": 4635,
+ "begs": 43531,
+ "begun": 10514,
+ "beh": 21971,
+ "beh": 41612,
+ "beha": 5737,
+ "behalf": 11470,
+ "behave": 28825,
+ "behaved": 41617,
+ "behavi": 6149,
+ "behaving": 40745,
+ "behavior": 10461,
+ "behavioral": 25135,
+ "behaviors": 37741,
+ "behaviour": 14655,
+ "behavioural": 46019,
+ "behe": 42329,
+ "behin": 2335,
+ "behind": 2403,
+ "behindthe": 21104,
+ "behindthescenes": 26253,
+ "behold": 15929,
+ "bei": 38991,
+ "bei": 23227,
+ "beige": 26677,
+ "beij": 11547,
+ "beijing": 11796,
+ "bein": 39117,
+ "bein": 24168,
+ "being": 13481,
+ "being": 1265,
+ "beings": 17998,
+ "beingsalmankhan": 19637,
+ "beir": 20176,
+ "beirut": 22352,
+ "beit": 26963,
+ "bek": 46846,
+ "bek": 26135,
+ "bekind": 46691,
+ "bel": 1308,
+ "bel": 3543,
+ "bela": 30555,
+ "belarus": 30849,
+ "belated": 20256,
+ "belfast": 35100,
+ "belfast": 10015,
+ "belgi": 7001,
+ "belgian": 15008,
+ "belgium": 10239,
+ "belgrade": 30502,
+ "beli": 1859,
+ "beli": 45842,
+ "belichick": 46132,
+ "belie": 20854,
+ "beliebers": 27714,
+ "belief": 14802,
+ "beliefs": 20575,
+ "believ": 4972,
+ "believe": 15819,
+ "believe": 2649,
+ "believed": 13380,
+ "believein": 24294,
+ "believeinfilm": 37375,
+ "believer": 26057,
+ "believers": 28434,
+ "believes": 12017,
+ "believing": 19551,
+ "belinda": 44415,
+ "belize": 27990,
+ "bell": 5417,
+ "bell": 3718,
+ "bella": 18282,
+ "bella": 10418,
+ "bellamy": 34461,
+ "bellator": 31985,
+ "belle": 13587,
+ "belle": 11496,
+ "belles": 40678,
+ "bellevue": 32715,
+ "belli": 43335,
+ "bellletstalk": 42695,
+ "bello": 21954,
+ "bells": 12811,
+ "bellum": 35493,
+ "belly": 25901,
+ "belly": 10404,
+ "belmont": 25612,
+ "belo": 8379,
+ "belo": 41649,
+ "belong": 16453,
+ "belong": 13596,
+ "belonged": 39893,
+ "belonging": 28193,
+ "belongs": 14395,
+ "beloved": 9363,
+ "below": 3788,
+ "bels": 43127,
+ "belt": 36416,
+ "belt": 7373,
+ "belts": 21888,
+ "belvedere": 48003,
+ "ben": 1465,
+ "ben": 3518,
+ "bena": 46249,
+ "bench": 17770,
+ "bench": 8771,
+ "benches": 36349,
+ "benchmark": 31775,
+ "bend": 22100,
+ "bend": 13332,
+ "bender": 22551,
+ "bendigo": 48197,
+ "bending": 33897,
+ "bene": 12091,
+ "bene": 47151,
+ "beneath": 16850,
+ "bened": 13216,
+ "benedic": 24402,
+ "benedict": 47896,
+ "benedict": 18027,
+ "benef": 3260,
+ "benefici": 38593,
+ "beneficial": 24660,
+ "beneficiaries": 42160,
+ "benefit": 6399,
+ "benefited": 48266,
+ "benefiting": 29474,
+ "benefits": 5465,
+ "benefitting": 47222,
+ "benevol": 47060,
+ "benfica": 33873,
+ "beng": 6962,
+ "bengal": 17404,
+ "bengal": 16374,
+ "bengali": 33774,
+ "bengals": 23737,
+ "bengaluru": 21707,
+ "benghazi": 25967,
+ "benin": 40296,
+ "benitez": 46711,
+ "benjam": 10550,
+ "benjamin": 38647,
+ "benjamin": 12131,
+ "benji": 43548,
+ "benn": 39097,
+ "bennet": 48536,
+ "bennett": 12186,
+ "benny": 42369,
+ "benny": 20595,
+ "beno": 35268,
+ "benoit": 44373,
+ "benson": 19578,
+ "bent": 9809,
+ "bent": 18369,
+ "bentley": 16859,
+ "benton": 30812,
+ "benz": 27937,
+ "benz": 13470,
+ "ber": 867,
+ "ber": 1516,
+ "bera": 32802,
+ "bere": 17458,
+ "bered": 9193,
+ "beren": 33654,
+ "beret": 41658,
+ "berg": 12022,
+ "berg": 3294,
+ "bergen": 22918,
+ "berger": 35933,
+ "berger": 13873,
+ "bergh": 35120,
+ "bergman": 42597,
+ "bergs": 43592,
+ "berk": 15633,
+ "berke": 14639,
+ "berkeley": 46049,
+ "berkeley": 16667,
+ "berkshire": 27300,
+ "berlin": 23532,
+ "berlin": 5891,
+ "berman": 21514,
+ "bermu": 21032,
+ "bermuda": 24644,
+ "bern": 9195,
+ "bern": 18382,
+ "bernade": 46242,
+ "bernar": 11962,
+ "bernard": 14579,
+ "bernardino": 35328,
+ "bernardo": 27137,
+ "bernardo": 28696,
+ "bernardokath": 29081,
+ "bernat": 40578,
+ "berni": 18798,
+ "bernie": 40093,
+ "bernie": 10503,
+ "berniesanders": 23745,
+ "bernstein": 33936,
+ "berra": 15089,
+ "berries": 8319,
+ "berry": 15334,
+ "berry": 3488,
+ "bers": 6408,
+ "berser": 39037,
+ "bert": 17340,
+ "bert": 2358,
+ "berta": 45187,
+ "berth": 28317,
+ "bertie": 47182,
+ "berto": 34073,
+ "bertr": 36962,
+ "bertrand": 41594,
+ "berts": 30205,
+ "berty": 35973,
+ "berwick": 40407,
+ "bery": 11411,
+ "bes": 26911,
+ "bes": 3635,
+ "beside": 13519,
+ "besides": 17596,
+ "bespoke": 15612,
+ "bess": 43791,
+ "best": 3419,
+ "best": 949,
+ "bestbuy": 29749,
+ "bestest": 31199,
+ "bestfan": 23880,
+ "bestfanarmy": 24590,
+ "bestfriend": 29832,
+ "bestfriend": 11856,
+ "bestfriends": 23555,
+ "besti": 35210,
+ "bestie": 17188,
+ "besties": 27346,
+ "besto": 28615,
+ "bestof": 27892,
+ "bestof": 39533,
+ "bestseller": 25841,
+ "bestselling": 28632,
+ "bet": 1051,
+ "bet": 4430,
+ "beta": 43188,
+ "beta": 9505,
+ "betes": 10255,
+ "beth": 9993,
+ "beth": 4892,
+ "bethan": 18781,
+ "bethany": 39130,
+ "bethany": 27952,
+ "bethe": 12624,
+ "bethel": 33410,
+ "bethesda": 32527,
+ "bethle": 30760,
+ "bethlehem": 31827,
+ "betis": 45590,
+ "beto": 33721,
+ "betra": 18436,
+ "betrayal": 33171,
+ "betrayed": 35692,
+ "bets": 17107,
+ "betsy": 28946,
+ "bett": 17715,
+ "bett": 20489,
+ "betta": 36387,
+ "bette": 35855,
+ "better": 10320,
+ "better": 1539,
+ "bettertogether": 47392,
+ "betting": 14319,
+ "betts": 38637,
+ "betty": 36175,
+ "betty": 14350,
+ "between": 1957,
+ "beu": 38660,
+ "bev": 40324,
+ "bev": 30968,
+ "bever": 9924,
+ "beverage": 18694,
+ "beverages": 28521,
+ "beverley": 39165,
+ "beverly": 30906,
+ "beverly": 16728,
+ "beverlyhills": 45363,
+ "beware": 14532,
+ "bewithyou": 36787,
+ "bex": 18676,
+ "bex": 24748,
+ "bexhill": 49200,
+ "bey": 3234,
+ "bey": 6767,
+ "beyon": 11447,
+ "beyonce": 16632,
+ "beyoncé": 19219,
+ "beyond": 22246,
+ "beyond": 4432,
+ "bez": 28592,
+ "bez": 46764,
+ "bezos": 45000,
+ "bf": 19858,
+ "bf": 7990,
+ "bfc": 37183,
+ "bff": 11984,
+ "bffs": 31462,
+ "bfi": 34244,
+ "bg": 16674,
+ "bg": 11295,
+ "bgc": 47598,
+ "bgs": 47963,
+ "bgt": 40665,
+ "bh": 9930,
+ "bh": 13603,
+ "bha": 6144,
+ "bha": 33068,
+ "bhafc": 30779,
+ "bhagat": 49136,
+ "bhai": 48370,
+ "bhai": 20508,
+ "bhak": 34501,
+ "bham": 31874,
+ "bham": 23491,
+ "bhan": 27356,
+ "bhand": 48679,
+ "bhar": 9108,
+ "bharat": 27454,
+ "bharat": 17430,
+ "bharti": 46803,
+ "bhat": 23784,
+ "bhatt": 36143,
+ "bhav": 44950,
+ "bhi": 28943,
+ "bhi": 21955,
+ "bhk": 45070,
+ "bhm": 38741,
+ "bho": 19721,
+ "bhopal": 44573,
+ "bhp": 29776,
+ "bhs": 29195,
+ "bhu": 9172,
+ "bhuban": 38729,
+ "bhubanes": 41213,
+ "bhubaneswar": 45888,
+ "bhushan": 40884,
+ "bhutan": 32391,
+ "bhutto": 30153,
+ "bi": 717,
+ "bi": 3035,
+ "bia": 3841,
+ "biaf": 26961,
+ "biafra": 36355,
+ "bian": 19531,
+ "bian": 9027,
+ "bianca": 25854,
+ "bianchi": 45720,
+ "bians": 28141,
+ "bias": 11268,
+ "biased": 22178,
+ "bib": 44607,
+ "bib": 21022,
+ "bibi": 31182,
+ "bibl": 20912,
+ "bible": 26738,
+ "bible": 7583,
+ "bibli": 23465,
+ "biblical": 22841,
+ "biblio": 49131,
+ "bic": 5960,
+ "bic": 10675,
+ "bice": 35589,
+ "biceps": 46735,
+ "bick": 27238,
+ "bicy": 9247,
+ "bicycle": 11652,
+ "bicycles": 31326,
+ "bid": 21035,
+ "bid": 5553,
+ "bidding": 23237,
+ "bide": 45178,
+ "biden": 19451,
+ "bids": 16148,
+ "bie": 5561,
+ "bie": 4173,
+ "bieber": 48725,
+ "bieber": 7535,
+ "bien": 19176,
+ "bien": 25742,
+ "biennale": 33776,
+ "biennial": 36609,
+ "bier": 27226,
+ "bier": 23508,
+ "bies": 7867,
+ "big": 1915,
+ "big": 1205,
+ "bigbaldhead": 30325,
+ "bigbang": 41680,
+ "bigbang": 23734,
+ "bigdata": 9440,
+ "bige": 37762,
+ "bigfoot": 37095,
+ "bigg": 15312,
+ "bigg": 35399,
+ "biggboss": 27056,
+ "bigger": 6806,
+ "biggest": 19483,
+ "biggest": 3505,
+ "biggie": 28392,
+ "biggs": 46507,
+ "bigh": 18106,
+ "bighit": 35508,
+ "bigo": 14278,
+ "bigolive": 20735,
+ "bigotry": 37269,
+ "bigre": 36330,
+ "bih": 33471,
+ "bihar": 22849,
+ "bij": 42478,
+ "bik": 30306,
+ "bike": 11686,
+ "bike": 3701,
+ "biker": 36100,
+ "biker": 23449,
+ "bikers": 29468,
+ "bikes": 9227,
+ "bikin": 12638,
+ "biking": 19157,
+ "bikini": 14531,
+ "bil": 3092,
+ "bil": 20506,
+ "bilateral": 25599,
+ "bilbao": 34802,
+ "bild": 35512,
+ "bile": 25943,
+ "bilingual": 29623,
+ "bilities": 13582,
+ "bility": 4694,
+ "bill": 4444,
+ "bill": 2886,
+ "billboard": 10856,
+ "billboards": 34741,
+ "billed": 37558,
+ "billi": 7693,
+ "billie": 23990,
+ "billing": 31797,
+ "billings": 43615,
+ "billion": 14520,
+ "billion": 5729,
+ "billionaire": 19475,
+ "billionaires": 41590,
+ "billions": 20742,
+ "bills": 9810,
+ "billsmafia": 48845,
+ "billy": 15626,
+ "billy": 6814,
+ "bilt": 44770,
+ "bilt": 26654,
+ "bim": 46737,
+ "bim": 24775,
+ "bin": 4849,
+ "bin": 5346,
+ "binance": 43520,
+ "binary": 23497,
+ "bind": 44513,
+ "binder": 30541,
+ "binding": 21287,
+ "bine": 34848,
+ "bing": 24818,
+ "bing": 5665,
+ "binge": 22600,
+ "bingham": 43785,
+ "bingham": 47296,
+ "bingo": 18418,
+ "bino": 29172,
+ "bino": 24313,
+ "bins": 26934,
+ "bint": 43647,
+ "bio": 2830,
+ "bio": 5162,
+ "biode": 43502,
+ "biodegradable": 47740,
+ "biodiversity": 17428,
+ "biof": 45158,
+ "biographical": 49232,
+ "biography": 15423,
+ "biological": 18821,
+ "biologist": 35149,
+ "biology": 9796,
+ "biom": 13010,
+ "biomar": 44549,
+ "biomass": 36746,
+ "biome": 26218,
+ "biomed": 29280,
+ "biomedical": 33117,
+ "bionic": 46201,
+ "biop": 15009,
+ "biopic": 27942,
+ "bios": 48505,
+ "biotech": 22514,
+ "biotechnology": 40375,
+ "biotic": 33773,
+ "biotics": 41371,
+ "bious": 31845,
+ "bipartisan": 32266,
+ "bipolar": 37097,
+ "bique": 27809,
+ "bir": 921,
+ "bir": 16284,
+ "birch": 31569,
+ "birch": 22907,
+ "bird": 6908,
+ "bird": 3329,
+ "birdie": 29612,
+ "birdies": 45618,
+ "birding": 15851,
+ "birdman": 41915,
+ "birdphotography": 47999,
+ "birds": 41951,
+ "birds": 4337,
+ "birdwatching": 33497,
+ "birk": 48289,
+ "birken": 40661,
+ "birmin": 37482,
+ "birmingham": 38580,
+ "birmingham": 7720,
+ "birth": 1128,
+ "birth": 5397,
+ "birthday": 7381,
+ "birthday": 1166,
+ "birthdays": 17954,
+ "birthplace": 31429,
+ "biryani": 46489,
+ "bis": 5064,
+ "bis": 14461,
+ "biscu": 11532,
+ "biscuit": 18731,
+ "biscuits": 18248,
+ "bisexual": 36829,
+ "bish": 33690,
+ "bish": 31461,
+ "bishop": 20625,
+ "bishop": 8024,
+ "bishops": 31579,
+ "bison": 19741,
+ "bistro": 21770,
+ "bit": 3010,
+ "bit": 2010,
+ "bitcoin": 30848,
+ "bitcoin": 6366,
+ "bite": 41613,
+ "biting": 23016,
+ "bits": 7747,
+ "bitt": 39251,
+ "bius": 45525,
+ "bix": 46579,
+ "biz": 8212,
+ "biz": 5431,
+ "biza": 47013,
+ "bizar": 14886,
+ "bizarre": 16965,
+ "bizhour": 39462,
+ "bizitalk": 34929,
+ "bj": 4592,
+ "bj": 18229,
+ "bjj": 27437,
+ "bjor": 26525,
+ "bjp": 37264,
+ "bjp": 6178,
+ "bk": 15099,
+ "bk": 14083,
+ "bkk": 36433,
+ "bl": 833,
+ "bl": 9467,
+ "bla": 2205,
+ "bla": 19630,
+ "blac": 21008,
+ "black": 2025,
+ "black": 1449,
+ "blackand": 12809,
+ "blackandwhite": 23688,
+ "blackandwhite": 19506,
+ "blackandwhitephotography": 27544,
+ "blackberry": 16470,
+ "blackbird": 38526,
+ "blackburn": 23789,
+ "blackfish": 42193,
+ "blackfriday": 16445,
+ "blackgirl": 43591,
+ "blackhawks": 19203,
+ "blackhistory": 46982,
+ "blackhistorymonth": 20135,
+ "blacklist": 30295,
+ "blacklivesmatter": 23467,
+ "blackmail": 47295,
+ "blackops": 43519,
+ "blackout": 21733,
+ "blackpanther": 36592,
+ "blackpink": 20339,
+ "blackpool": 21031,
+ "blacks": 16351,
+ "blackwell": 42642,
+ "blad": 36635,
+ "bladder": 33593,
+ "blade": 10264,
+ "blades": 16893,
+ "blah": 29212,
+ "blaine": 32457,
+ "blair": 31824,
+ "blair": 14749,
+ "blake": 20229,
+ "blake": 9579,
+ "blame": 10695,
+ "blamed": 32906,
+ "blames": 27841,
+ "blaming": 29287,
+ "blan": 4609,
+ "blanc": 30936,
+ "blanc": 13301,
+ "blanca": 40670,
+ "blanchard": 40177,
+ "blanche": 34875,
+ "blanchett": 49378,
+ "blanco": 26801,
+ "bland": 44372,
+ "bland": 30799,
+ "blank": 15134,
+ "blanket": 12878,
+ "blankets": 24042,
+ "blanks": 48599,
+ "blasio": 35553,
+ "blasphe": 36622,
+ "blast": 46349,
+ "blast": 5964,
+ "blasted": 38976,
+ "blaster": 36341,
+ "blasting": 26178,
+ "blasts": 23067,
+ "blat": 22048,
+ "blatant": 41391,
+ "blatt": 39138,
+ "blau": 45307,
+ "blaz": 43413,
+ "blaze": 15497,
+ "blazer": 17606,
+ "blazers": 16984,
+ "blazing": 25267,
+ "bldg": 22981,
+ "ble": 1447,
+ "ble": 1059,
+ "bleach": 27034,
+ "bleak": 40355,
+ "bled": 12006,
+ "bleed": 23027,
+ "bleed": 24791,
+ "bleedblue": 39160,
+ "bleeding": 20311,
+ "bleeds": 47339,
+ "blen": 25651,
+ "blend": 10780,
+ "blended": 25813,
+ "blender": 25066,
+ "blending": 34307,
+ "blends": 28572,
+ "bler": 31305,
+ "bler": 11979,
+ "blers": 26930,
+ "bles": 5763,
+ "bless": 9640,
+ "bless": 5387,
+ "blessed": 4411,
+ "blessing": 10729,
+ "blessings": 11185,
+ "bleu": 30114,
+ "blew": 18176,
+ "bley": 43176,
+ "bli": 1450,
+ "bli": 28051,
+ "blin": 9678,
+ "blin": 5406,
+ "blind": 17248,
+ "blind": 8351,
+ "blinded": 49149,
+ "blindness": 38812,
+ "blinds": 32449,
+ "bling": 39764,
+ "bling": 7097,
+ "blink": 18976,
+ "bliss": 28531,
+ "bliss": 12893,
+ "blissful": 42145,
+ "blit": 39327,
+ "blitz": 42151,
+ "blitz": 17548,
+ "blizz": 13075,
+ "blizzard": 16111,
+ "blk": 42950,
+ "blk": 22872,
+ "blm": 30957,
+ "bln": 47348,
+ "blo": 1204,
+ "blo": 25505,
+ "blob": 49312,
+ "bloc": 30961,
+ "block": 4638,
+ "block": 4593,
+ "blockade": 33489,
+ "blockbuster": 19939,
+ "blockchain": 6653,
+ "blocked": 9106,
+ "blocker": 44767,
+ "blocking": 12652,
+ "blocks": 10113,
+ "blog": 16376,
+ "blog": 2589,
+ "blogg": 33282,
+ "blogged": 41380,
+ "blogger": 21352,
+ "blogger": 7806,
+ "bloggerrt": 48898,
+ "bloggers": 11627,
+ "blogging": 18090,
+ "blogpost": 41842,
+ "blogs": 16682,
+ "bloke": 24384,
+ "blom": 48996,
+ "blon": 7958,
+ "blond": 32426,
+ "blonde": 10711,
+ "blondes": 45130,
+ "blondie": 39236,
+ "bloo": 2373,
+ "blood": 9231,
+ "blood": 3590,
+ "blooded": 41946,
+ "bloodh": 48480,
+ "bloods": 39539,
+ "bloody": 38568,
+ "bloody": 9468,
+ "bloom": 7311,
+ "bloom": 10257,
+ "bloomberg": 43109,
+ "bloomberg": 21238,
+ "bloomfield": 40342,
+ "blooming": 45175,
+ "blooming": 19266,
+ "bloomington": 34731,
+ "blooms": 21439,
+ "bloss": 10017,
+ "blossom": 14472,
+ "blossoms": 21916,
+ "blot": 41710,
+ "blou": 44506,
+ "blouse": 23525,
+ "blow": 15230,
+ "blow": 10211,
+ "blower": 25832,
+ "blowing": 12087,
+ "blown": 11848,
+ "blowout": 34857,
+ "blows": 21063,
+ "blr": 47250,
+ "bls": 39458,
+ "blu": 1263,
+ "blu": 10273,
+ "blue": 3829,
+ "blue": 1746,
+ "bluebells": 47150,
+ "blueberries": 29551,
+ "blueberry": 18251,
+ "bluebird": 40747,
+ "bluec": 43194,
+ "bluef": 41174,
+ "bluegrass": 26241,
+ "bluejays": 18684,
+ "blueprint": 30594,
+ "blues": 17566,
+ "blues": 5159,
+ "blueslyrix": 47068,
+ "bluet": 13469,
+ "bluetooth": 14052,
+ "bluewave": 40025,
+ "bluff": 27232,
+ "bluffs": 48844,
+ "blum": 34818,
+ "blumen": 38714,
+ "blun": 34472,
+ "blunt": 19305,
+ "blur": 12102,
+ "blur": 27976,
+ "bluray": 36818,
+ "blurred": 38013,
+ "blurry": 21977,
+ "blush": 22889,
+ "blvd": 12578,
+ "bly": 20930,
+ "bly": 4426,
+ "bm": 4773,
+ "bm": 15916,
+ "bma": 42573,
+ "bmc": 27807,
+ "bmi": 40642,
+ "bmo": 39083,
+ "bms": 34074,
+ "bmw": 26637,
+ "bmw": 7869,
+ "bmx": 22535,
+ "bn": 10496,
+ "bn": 7992,
+ "bnb": 20010,
+ "bnha": 49336,
+ "bnp": 47910,
+ "bnw": 35903,
+ "bo": 647,
+ "bo": 2525,
+ "boa": 14732,
+ "boar": 7837,
+ "boar": 35473,
+ "board": 10419,
+ "board": 1972,
+ "boarded": 43052,
+ "boarder": 37414,
+ "boardgame": 47829,
+ "boardgames": 32646,
+ "boarding": 10086,
+ "boardroom": 47937,
+ "boards": 7963,
+ "boardwalk": 29043,
+ "boast": 44467,
+ "boasts": 30309,
+ "boat": 12426,
+ "boat": 4440,
+ "boath": 45461,
+ "boating": 21951,
+ "boats": 10080,
+ "boatsales": 46244,
+ "bob": 8444,
+ "bob": 4423,
+ "boba": 39948,
+ "bobb": 16891,
+ "bobble": 38796,
+ "bobblehead": 33451,
+ "bobby": 17847,
+ "bobby": 7816,
+ "bobc": 26153,
+ "bobcat": 37896,
+ "bobcats": 27568,
+ "bobo": 38939,
+ "bobs": 45533,
+ "boc": 27307,
+ "boc": 39042,
+ "boca": 26094,
+ "bock": 24961,
+ "bod": 17904,
+ "bod": 26340,
+ "boda": 42030,
+ "bode": 28452,
+ "bode": 40429,
+ "bodega": 47350,
+ "bodied": 36892,
+ "bodies": 9799,
+ "bodily": 49119,
+ "body": 7132,
+ "body": 1774,
+ "bodybuilding": 24538,
+ "bodyguard": 35565,
+ "boe": 23476,
+ "boe": 21773,
+ "boeh": 38002,
+ "boehner": 44599,
+ "boeing": 48135,
+ "boeing": 11857,
+ "boer": 44889,
+ "boer": 40768,
+ "bog": 23426,
+ "bog": 28318,
+ "bogo": 35769,
+ "bogota": 47059,
+ "bogus": 42907,
+ "boh": 43238,
+ "bohe": 40541,
+ "bohemi": 21552,
+ "bohemian": 25753,
+ "boho": 25444,
+ "boi": 37129,
+ "boi": 12673,
+ "boil": 31332,
+ "boiled": 23886,
+ "boiler": 28212,
+ "boiler": 25615,
+ "boiling": 32019,
+ "bois": 47742,
+ "bois": 21640,
+ "boise": 23304,
+ "bok": 26671,
+ "bok": 15289,
+ "boko": 30929,
+ "boks": 40216,
+ "bol": 2860,
+ "bol": 8413,
+ "bola": 12840,
+ "bold": 26975,
+ "bold": 8911,
+ "boldand": 48413,
+ "boldly": 44778,
+ "boli": 12722,
+ "bolic": 27343,
+ "bolivia": 28628,
+ "bollah": 36336,
+ "bolly": 25302,
+ "bollywood": 32448,
+ "bollywood": 9604,
+ "bolo": 40236,
+ "bolog": 22818,
+ "bologna": 27513,
+ "bolster": 47304,
+ "bolt": 13131,
+ "bolton": 48757,
+ "bolton": 16598,
+ "bolts": 26028,
+ "bom": 3012,
+ "bom": 19469,
+ "bomb": 18091,
+ "bomb": 6331,
+ "bombar": 25544,
+ "bombardier": 42700,
+ "bombay": 48602,
+ "bombay": 23890,
+ "bombed": 24542,
+ "bomber": 15436,
+ "bombers": 21786,
+ "bombing": 14475,
+ "bombings": 43236,
+ "bombs": 14410,
+ "bombshell": 36340,
+ "bon": 1871,
+ "bon": 4216,
+ "bona": 33342,
+ "bonanza": 40304,
+ "bond": 37022,
+ "bond": 6826,
+ "bonded": 37390,
+ "bondi": 40092,
+ "bonding": 19609,
+ "bonds": 15786,
+ "bone": 22502,
+ "bone": 6195,
+ "bones": 9476,
+ "bonfire": 23151,
+ "bongo": 47519,
+ "boni": 32269,
+ "boni": 46356,
+ "bonita": 42896,
+ "bonjour": 33176,
+ "bonkers": 39865,
+ "bonn": 38969,
+ "bonnar": 47191,
+ "bonnaroo": 48777,
+ "bonne": 25844,
+ "bonnet": 30636,
+ "bonnie": 18555,
+ "bono": 24476,
+ "bons": 42883,
+ "bonsai": 44129,
+ "bonus": 8164,
+ "bonuses": 35144,
+ "boo": 824,
+ "boo": 7317,
+ "boogie": 22639,
+ "book": 2828,
+ "book": 1116,
+ "bookboost": 31257,
+ "bookclub": 34438,
+ "bookday": 26327,
+ "booked": 12584,
+ "booker": 21302,
+ "bookfest": 39381,
+ "booking": 10145,
+ "bookings": 18345,
+ "booklet": 27405,
+ "bookmark": 33596,
+ "bookof": 45629,
+ "bookreview": 27362,
+ "books": 44382,
+ "books": 2161,
+ "bookshelf": 34821,
+ "bookshop": 24705,
+ "bookstore": 17999,
+ "bookstores": 46416,
+ "bookworm": 20743,
+ "boom": 9609,
+ "boom": 7121,
+ "boomer": 33819,
+ "boomer": 31766,
+ "boomers": 37988,
+ "booming": 33487,
+ "boon": 24979,
+ "boon": 35821,
+ "boone": 23453,
+ "boop": 45047,
+ "boost": 44639,
+ "boost": 6260,
+ "boosted": 37631,
+ "booster": 20877,
+ "boosters": 46859,
+ "boosting": 28480,
+ "boosts": 29247,
+ "boot": 10843,
+ "boot": 8087,
+ "bootcamp": 22051,
+ "booted": 42564,
+ "booth": 47895,
+ "booth": 3971,
+ "booths": 32653,
+ "booties": 46188,
+ "bootleg": 38139,
+ "boots": 7319,
+ "booze": 24341,
+ "bop": 19720,
+ "bor": 1141,
+ "bor": 15093,
+ "bora": 24736,
+ "bord": 36891,
+ "bordeaux": 22009,
+ "border": 16304,
+ "border": 6177,
+ "borderlands": 38676,
+ "borders": 13900,
+ "bore": 14084,
+ "bore": 24638,
+ "bored": 8933,
+ "boredom": 31460,
+ "boretum": 38902,
+ "borg": 14770,
+ "borgh": 17180,
+ "boring": 12519,
+ "boris": 31212,
+ "boris": 15704,
+ "borisjohnson": 44481,
+ "born": 17695,
+ "born": 2683,
+ "borne": 42910,
+ "borne": 9328,
+ "borneo": 33332,
+ "bornon": 41811,
+ "bornonthisday": 42757,
+ "boro": 26796,
+ "boro": 7974,
+ "borough": 22761,
+ "borough": 6203,
+ "borrow": 22293,
+ "borrowed": 28224,
+ "borrowing": 41045,
+ "borussia": 36764,
+ "bos": 14885,
+ "bos": 9644,
+ "bosa": 46946,
+ "bosch": 42009,
+ "bosch": 19466,
+ "bosco": 36960,
+ "bose": 23142,
+ "bosh": 42244,
+ "bosni": 42924,
+ "bosnia": 31396,
+ "boss": 17935,
+ "boss": 4206,
+ "bosses": 23906,
+ "boston": 11540,
+ "boston": 4399,
+ "bostonmarathon": 44533,
+ "bot": 4136,
+ "bot": 6947,
+ "botan": 12554,
+ "botanic": 32560,
+ "botanical": 21026,
+ "botany": 22612,
+ "botd": 34451,
+ "both": 36575,
+ "both": 2212,
+ "bother": 21125,
+ "bothered": 27997,
+ "botox": 43449,
+ "bots": 13721,
+ "botswana": 27584,
+ "bott": 3520,
+ "bott": 37225,
+ "bottle": 37306,
+ "bottle": 5392,
+ "bottled": 29331,
+ "bottlen": 46439,
+ "bottles": 9754,
+ "bottling": 42006,
+ "bottom": 32314,
+ "bottom": 5931,
+ "bottoms": 31524,
+ "bou": 3728,
+ "bou": 23165,
+ "bouchard": 47930,
+ "boudo": 48827,
+ "bought": 4142,
+ "boul": 24830,
+ "boulder": 18260,
+ "boule": 17652,
+ "boulevard": 19504,
+ "boun": 5993,
+ "bounce": 14316,
+ "bouncing": 32060,
+ "bouncy": 43415,
+ "bound": 15140,
+ "bound": 4567,
+ "boundaries": 18690,
+ "boundary": 21344,
+ "bounds": 37469,
+ "bounty": 21142,
+ "bouquet": 20961,
+ "bour": 2934,
+ "bour": 35486,
+ "bourbon": 48118,
+ "bourbon": 14652,
+ "bourdain": 48095,
+ "bourg": 20690,
+ "bourgeo": 45672,
+ "bourn": 39143,
+ "bourne": 13789,
+ "bourne": 5192,
+ "bournemouth": 20911,
+ "bout": 19982,
+ "bout": 8123,
+ "bouti": 10926,
+ "boutique": 12179,
+ "bow": 2297,
+ "bow": 4040,
+ "bowden": 48538,
+ "bowed": 49130,
+ "bowel": 36880,
+ "bowen": 25368,
+ "bower": 40414,
+ "bowers": 42238,
+ "bowie": 13036,
+ "bowing": 46398,
+ "bowl": 26719,
+ "bowl": 3814,
+ "bowled": 39987,
+ "bowler": 25528,
+ "bowlers": 42632,
+ "bowles": 41611,
+ "bowling": 10390,
+ "bowls": 17787,
+ "bowman": 22052,
+ "bows": 17000,
+ "bowser": 38234,
+ "bowski": 48311,
+ "box": 2774,
+ "box": 2063,
+ "boxed": 24190,
+ "boxer": 40394,
+ "boxer": 15363,
+ "boxers": 31019,
+ "boxes": 8350,
+ "boxing": 33669,
+ "boxing": 5554,
+ "boy": 2927,
+ "boy": 1876,
+ "boyband": 31568,
+ "boyce": 44480,
+ "boycot": 46208,
+ "boycott": 31615,
+ "boycott": 19559,
+ "boyd": 18295,
+ "boyfriend": 7328,
+ "boyfriends": 36541,
+ "boyle": 22802,
+ "boys": 25223,
+ "boys": 2034,
+ "boyz": 16152,
+ "bp": 23410,
+ "bp": 11558,
+ "bpa": 43855,
+ "bpd": 48587,
+ "bpl": 28901,
+ "bpm": 40338,
+ "bps": 37794,
+ "br": 711,
+ "br": 7532,
+ "bra": 1195,
+ "bra": 5860,
+ "brac": 6663,
+ "brace": 8376,
+ "brace": 9183,
+ "bracelet": 8969,
+ "bracelets": 20027,
+ "braces": 19249,
+ "brack": 25676,
+ "bracket": 14780,
+ "brackets": 36183,
+ "brad": 4848,
+ "brad": 9405,
+ "bradbury": 45097,
+ "braden": 46842,
+ "bradford": 15062,
+ "bradley": 31905,
+ "bradley": 10952,
+ "brador": 24062,
+ "bradshaw": 37556,
+ "brady": 42494,
+ "brady": 11117,
+ "brae": 42874,
+ "brae": 40040,
+ "brag": 30110,
+ "bragg": 38545,
+ "bragging": 38199,
+ "brah": 20276,
+ "brahms": 45114,
+ "brai": 25048,
+ "braid": 31067,
+ "braided": 39997,
+ "braids": 34221,
+ "brain": 9454,
+ "brain": 4812,
+ "brains": 17129,
+ "brainstorming": 36607,
+ "braised": 28363,
+ "brake": 14937,
+ "brakes": 23456,
+ "bral": 31309,
+ "bram": 14815,
+ "bram": 39456,
+ "brampton": 35124,
+ "bran": 3684,
+ "bran": 28348,
+ "brance": 36072,
+ "brance": 15413,
+ "branch": 7998,
+ "branches": 15843,
+ "brand": 3910,
+ "brand": 2896,
+ "branded": 18097,
+ "brandi": 41003,
+ "branding": 10841,
+ "brando": 41892,
+ "brandon": 20423,
+ "brandon": 9166,
+ "brands": 8681,
+ "brandt": 22552,
+ "brandy": 26232,
+ "brane": 32340,
+ "branson": 28280,
+ "brant": 28951,
+ "brant": 47592,
+ "braries": 46377,
+ "brary": 24520,
+ "bras": 22611,
+ "brasil": 18991,
+ "brass": 24348,
+ "brass": 11655,
+ "brat": 26717,
+ "brat": 26631,
+ "brate": 41864,
+ "braun": 39129,
+ "braun": 29309,
+ "brave": 25461,
+ "brave": 7769,
+ "braved": 47663,
+ "bravely": 42303,
+ "bravery": 25831,
+ "braves": 14422,
+ "braving": 43258,
+ "bravo": 38613,
+ "bravo": 13006,
+ "braw": 37871,
+ "brawl": 26066,
+ "braxton": 37451,
+ "bray": 26256,
+ "bray": 22993,
+ "braz": 4625,
+ "brazil": 47459,
+ "brazil": 6305,
+ "brazili": 45697,
+ "brazilian": 12111,
+ "brb": 25316,
+ "brc": 40393,
+ "bre": 887,
+ "bre": 7782,
+ "brea": 7318,
+ "brea": 46538,
+ "breach": 21363,
+ "breaches": 45173,
+ "bread": 18886,
+ "bread": 5066,
+ "breads": 43064,
+ "break": 2206,
+ "break": 2568,
+ "breakable": 30691,
+ "breakaway": 42732,
+ "breakdown": 14519,
+ "breaker": 14814,
+ "breakers": 22270,
+ "breakfa": 45931,
+ "breakfast": 30210,
+ "breakfast": 3290,
+ "breaking": 14698,
+ "breaking": 2755,
+ "breakingbad": 38032,
+ "breakingnews": 23837,
+ "breakout": 16752,
+ "breaks": 7263,
+ "breakthrough": 18802,
+ "breakup": 38931,
+ "breast": 12930,
+ "breast": 9475,
+ "breastcancer": 40813,
+ "breastcancer": 30065,
+ "breastfeeding": 29033,
+ "breasts": 37637,
+ "breath": 9508,
+ "breath": 9576,
+ "breathe": 11364,
+ "breathing": 14959,
+ "breathtaking": 14709,
+ "brecht": 34622,
+ "breck": 44598,
+ "bred": 46929,
+ "bred": 16008,
+ "bree": 7892,
+ "bree": 37138,
+ "breed": 28030,
+ "breed": 13791,
+ "breeders": 37472,
+ "breeding": 16544,
+ "breeds": 29021,
+ "breen": 48013,
+ "brees": 46721,
+ "breeze": 13125,
+ "breezy": 21451,
+ "breit": 23864,
+ "breitbart": 37926,
+ "brek": 35494,
+ "bremen": 39861,
+ "bren": 5209,
+ "brenda": 23786,
+ "brendan": 35134,
+ "brendan": 15414,
+ "brendon": 36756,
+ "brennan": 22372,
+ "brenner": 42941,
+ "brent": 31439,
+ "brent": 16355,
+ "brentwood": 33108,
+ "brero": 47781,
+ "bres": 32561,
+ "bret": 38020,
+ "bret": 32548,
+ "brethren": 43134,
+ "breton": 32290,
+ "brett": 22591,
+ "brett": 12394,
+ "brev": 42882,
+ "brevi": 39475,
+ "brew": 5048,
+ "brew": 7253,
+ "brewco": 33582,
+ "brewed": 23238,
+ "brewer": 20756,
+ "breweries": 35277,
+ "brewers": 17618,
+ "brewery": 8850,
+ "brewing": 8275,
+ "brewingco": 45155,
+ "brews": 21663,
+ "brewster": 40274,
+ "brex": 22726,
+ "brexit": 27666,
+ "brexit": 5801,
+ "brgy": 35983,
+ "bri": 1036,
+ "bri": 18636,
+ "bria": 35890,
+ "brian": 9824,
+ "brian": 4989,
+ "brianna": 32308,
+ "briar": 46119,
+ "bribe": 40042,
+ "bribery": 41792,
+ "bric": 27055,
+ "brice": 40190,
+ "brick": 13937,
+ "brick": 9518,
+ "bricks": 21029,
+ "brics": 48196,
+ "brid": 16995,
+ "bridal": 36875,
+ "bridal": 14284,
+ "bride": 18342,
+ "bride": 8964,
+ "brides": 18067,
+ "bridesma": 28356,
+ "bridesmaid": 43399,
+ "bridesmaids": 47754,
+ "bridg": 20623,
+ "bridge": 8647,
+ "bridge": 2465,
+ "bridgeport": 45201,
+ "bridges": 11811,
+ "bridget": 27073,
+ "bridgewater": 38732,
+ "bridging": 38109,
+ "brie": 26622,
+ "brief": 9435,
+ "brief": 8954,
+ "briefed": 47326,
+ "briefing": 12991,
+ "briefly": 26980,
+ "briefs": 29557,
+ "brien": 13504,
+ "brier": 43995,
+ "brig": 11081,
+ "briga": 46448,
+ "brigade": 16032,
+ "briggs": 28108,
+ "brigh": 6710,
+ "bright": 10383,
+ "bright": 4852,
+ "brighten": 18208,
+ "brightening": 43929,
+ "brighter": 18507,
+ "brightest": 26159,
+ "brightly": 36298,
+ "brightness": 42280,
+ "brighton": 28416,
+ "brighton": 9470,
+ "brigitte": 44421,
+ "brill": 27342,
+ "brill": 28601,
+ "brilli": 3821,
+ "brilliance": 28146,
+ "brilliant": 4106,
+ "brilliantly": 26803,
+ "brin": 25620,
+ "bring": 11596,
+ "bring": 2430,
+ "bringback": 28969,
+ "bringbackour": 45403,
+ "bringing": 4777,
+ "brings": 5138,
+ "brink": 39296,
+ "brink": 28796,
+ "brioche": 45818,
+ "bris": 9385,
+ "bris": 15783,
+ "brisban": 30431,
+ "brisbane": 42932,
+ "brisbane": 12407,
+ "brisk": 43646,
+ "brisket": 31920,
+ "bristol": 18159,
+ "bristol": 8010,
+ "brit": 2318,
+ "brit": 20066,
+ "britain": 40802,
+ "britain": 6272,
+ "britanni": 31373,
+ "britannia": 36188,
+ "brite": 33827,
+ "briti": 8155,
+ "british": 8651,
+ "british": 3504,
+ "britishmuseum": 41858,
+ "britney": 37192,
+ "britney": 21853,
+ "britneyspears": 42990,
+ "brits": 21832,
+ "britt": 10811,
+ "britt": 25976,
+ "brittany": 38187,
+ "brittany": 18818,
+ "britton": 37422,
+ "brium": 46079,
+ "brixton": 30056,
+ "bro": 927,
+ "bro": 4410,
+ "broad": 3491,
+ "broad": 12623,
+ "broadband": 21050,
+ "broadcast": 8967,
+ "broadcaster": 29005,
+ "broadcasting": 14403,
+ "broadcasts": 46742,
+ "broader": 36029,
+ "broadway": 34599,
+ "broadway": 9092,
+ "broc": 15587,
+ "broccoli": 19094,
+ "broch": 21419,
+ "brochure": 25275,
+ "brock": 14841,
+ "brock": 16745,
+ "brodie": 42150,
+ "brody": 29608,
+ "broke": 42165,
+ "broke": 6509,
+ "broken": 26126,
+ "broken": 5107,
+ "broker": 34032,
+ "broker": 20449,
+ "brokerage": 41327,
+ "brokers": 28271,
+ "brom": 18972,
+ "brom": 33296,
+ "bromance": 35353,
+ "bromley": 35715,
+ "bron": 4011,
+ "bron": 10243,
+ "bronco": 43488,
+ "bronco": 34370,
+ "broncos": 12516,
+ "bronson": 37042,
+ "bronte": 48936,
+ "bronx": 48310,
+ "bronx": 17183,
+ "brony": 21084,
+ "bronze": 8459,
+ "broo": 5204,
+ "brooch": 21207,
+ "brook": 4782,
+ "brook": 7322,
+ "brooke": 28576,
+ "brooke": 12549,
+ "brookes": 39707,
+ "brooklyn": 23253,
+ "brooklyn": 6983,
+ "brooks": 42779,
+ "brooks": 9991,
+ "broom": 32046,
+ "broom": 28008,
+ "broome": 49335,
+ "bros": 7776,
+ "broth": 29994,
+ "brotha": 33974,
+ "brother": 12697,
+ "brother": 3157,
+ "brotherhood": 19059,
+ "brothers": 4548,
+ "brou": 27874,
+ "brough": 21033,
+ "brought": 4222,
+ "brov": 42881,
+ "brow": 6547,
+ "brow": 15895,
+ "broward": 34719,
+ "brown": 6315,
+ "brown": 2866,
+ "browne": 28440,
+ "brownie": 23045,
+ "brownies": 22312,
+ "browning": 32241,
+ "browns": 14051,
+ "brows": 14998,
+ "browse": 19060,
+ "browser": 19768,
+ "browsing": 29318,
+ "brox": 43539,
+ "brs": 47485,
+ "brt": 46936,
+ "bru": 1698,
+ "bru": 31028,
+ "bruce": 21223,
+ "bruce": 7085,
+ "bruh": 17575,
+ "bruins": 14736,
+ "bruise": 48048,
+ "bruised": 46502,
+ "brum": 23862,
+ "brum": 28078,
+ "brun": 6870,
+ "brunch": 9113,
+ "brune": 29057,
+ "brunei": 41898,
+ "brunette": 35528,
+ "bruno": 14568,
+ "brunomars": 41156,
+ "brunswick": 24012,
+ "brush": 27969,
+ "brush": 8594,
+ "brushed": 30298,
+ "brushes": 21550,
+ "brushing": 35072,
+ "brussels": 11020,
+ "brut": 39499,
+ "brutal": 42144,
+ "brutal": 14556,
+ "brutality": 31348,
+ "brutally": 28132,
+ "brute": 47552,
+ "brux": 49093,
+ "bry": 6587,
+ "bry": 28228,
+ "bryan": 16134,
+ "bryan": 10412,
+ "bryant": 12256,
+ "bryce": 19895,
+ "bryn": 36569,
+ "bryn": 42877,
+ "bryson": 38990,
+ "bs": 11783,
+ "bs": 1329,
+ "bsa": 46619,
+ "bsb": 23070,
+ "bsbi": 41728,
+ "bsbibotany": 42086,
+ "bsc": 32031,
+ "bsd": 41848,
+ "bse": 46341,
+ "bsf": 48314,
+ "bsgo": 48474,
+ "bsp": 47977,
+ "bst": 19698,
+ "bsu": 46385,
+ "bt": 3317,
+ "bt": 4205,
+ "btc": 10315,
+ "btcc": 30759,
+ "btn": 44681,
+ "bto": 35516,
+ "btob": 29379,
+ "btr": 39767,
+ "bts": 15154,
+ "bts": 4007,
+ "btsarmy": 30302,
+ "btsbbmas": 35297,
+ "btsx": 44971,
+ "btv": 38541,
+ "btw": 9520,
+ "btwn": 28284,
+ "bu": 609,
+ "bu": 5831,
+ "bub": 27704,
+ "bub": 33158,
+ "bubb": 9739,
+ "bubba": 28149,
+ "bubble": 28687,
+ "bubble": 10799,
+ "bubblegum": 48078,
+ "bubbles": 17648,
+ "bubbly": 31034,
+ "buc": 8207,
+ "buccane": 32830,
+ "buccaneers": 38058,
+ "buch": 22623,
+ "bucha": 43582,
+ "buchan": 27237,
+ "buchanan": 28975,
+ "bucharest": 37013,
+ "buck": 6061,
+ "buck": 11433,
+ "bucket": 22596,
+ "bucket": 10498,
+ "bucketlist": 30778,
+ "buckets": 27168,
+ "buckeye": 34549,
+ "buckeyes": 30741,
+ "buckingham": 28736,
+ "buckle": 21948,
+ "buckley": 25905,
+ "bucks": 6103,
+ "bucky": 35916,
+ "bucs": 20011,
+ "bud": 2942,
+ "bud": 10737,
+ "buda": 18520,
+ "buda": 49012,
+ "budapest": 19202,
+ "budd": 7296,
+ "buddha": 13981,
+ "buddhism": 23744,
+ "buddhist": 18697,
+ "buddies": 14543,
+ "budding": 31992,
+ "buddy": 40948,
+ "buddy": 6557,
+ "budge": 32005,
+ "budget": 46758,
+ "budget": 5639,
+ "budgeting": 43789,
+ "budgets": 36419,
+ "buds": 14665,
+ "budweiser": 40900,
+ "buen": 15640,
+ "buena": 30876,
+ "buenas": 48529,
+ "bueno": 46202,
+ "buenos": 26055,
+ "buf": 44417,
+ "buff": 5456,
+ "buff": 21416,
+ "buffal": 25836,
+ "buffalo": 31231,
+ "buffalo": 8054,
+ "buffalob": 38831,
+ "buffalobills": 44352,
+ "buffe": 13724,
+ "buffer": 33050,
+ "buffet": 17829,
+ "buffett": 34081,
+ "buffs": 28906,
+ "buffy": 33356,
+ "bug": 14453,
+ "bug": 8162,
+ "bugatti": 35451,
+ "buggy": 28963,
+ "bugs": 13850,
+ "buh": 31406,
+ "buhari": 14661,
+ "buick": 22000,
+ "buil": 1354,
+ "build": 22739,
+ "build": 3289,
+ "builder": 14474,
+ "builders": 17694,
+ "building": 21206,
+ "building": 2307,
+ "buildings": 8866,
+ "builds": 16449,
+ "buildthe": 41497,
+ "built": 45824,
+ "built": 3874,
+ "buk": 28084,
+ "buk": 24317,
+ "buka": 47778,
+ "bukit": 39888,
+ "bul": 2572,
+ "bul": 10200,
+ "bula": 18726,
+ "bulaga": 41575,
+ "bular": 32187,
+ "bulb": 22373,
+ "bulbs": 24808,
+ "bulgar": 15424,
+ "bulgaria": 20295,
+ "bulgarian": 38693,
+ "bulge": 47603,
+ "bulk": 19643,
+ "bull": 4537,
+ "bull": 6029,
+ "bulldo": 37675,
+ "bulldog": 34828,
+ "bulldog": 15611,
+ "bulldogs": 13916,
+ "bullet": 14340,
+ "bullet": 12465,
+ "bulletin": 19638,
+ "bulletproof": 43212,
+ "bullets": 22117,
+ "bullied": 34689,
+ "bullies": 39050,
+ "bullion": 49114,
+ "bullish": 22142,
+ "bullock": 33198,
+ "bullpen": 38081,
+ "bulls": 10313,
+ "bully": 43111,
+ "bully": 20190,
+ "bullying": 13548,
+ "bum": 27683,
+ "bum": 14226,
+ "bumble": 25585,
+ "bumble": 39303,
+ "bumblebee": 36911,
+ "bummed": 48456,
+ "bump": 9783,
+ "bump": 15877,
+ "bumped": 22495,
+ "bumper": 17881,
+ "bumping": 40196,
+ "bumps": 21115,
+ "bun": 2591,
+ "bun": 13665,
+ "bunch": 7796,
+ "bund": 41905,
+ "bunde": 18841,
+ "bundesliga": 21582,
+ "bundle": 11793,
+ "bundled": 47228,
+ "bundles": 29834,
+ "bundy": 37332,
+ "bung": 44748,
+ "bungal": 29549,
+ "bungalow": 33696,
+ "bunk": 41236,
+ "bunker": 23615,
+ "bunnies": 28998,
+ "bunny": 34198,
+ "bunny": 9258,
+ "buns": 22235,
+ "bunting": 30695,
+ "buon": 31350,
+ "buon": 48498,
+ "bur": 1039,
+ "bur": 17362,
+ "burbank": 34862,
+ "burberry": 30412,
+ "burch": 44588,
+ "burden": 18687,
+ "bure": 11902,
+ "bureau": 32098,
+ "bureau": 15400,
+ "burg": 19505,
+ "burg": 3499,
+ "burge": 20522,
+ "burger": 22356,
+ "burger": 6548,
+ "burgers": 13007,
+ "burgess": 26211,
+ "burgh": 18141,
+ "burgh": 4965,
+ "burgl": 25554,
+ "burglar": 43365,
+ "burglary": 32573,
+ "burgring": 40823,
+ "burgundy": 23650,
+ "buri": 46348,
+ "buri": 42614,
+ "burial": 22012,
+ "buried": 14233,
+ "burk": 48822,
+ "burke": 15340,
+ "burle": 27891,
+ "burlesque": 33732,
+ "burlington": 23370,
+ "burma": 30305,
+ "burmese": 47906,
+ "burn": 7934,
+ "burn": 4285,
+ "burnaby": 47541,
+ "burne": 27246,
+ "burned": 15022,
+ "burner": 23243,
+ "burnett": 28558,
+ "burnham": 36111,
+ "burning": 46107,
+ "burning": 8405,
+ "burnley": 24653,
+ "burnout": 36078,
+ "burns": 10234,
+ "burnt": 15185,
+ "burr": 30879,
+ "burrell": 49045,
+ "burrito": 23473,
+ "burritos": 47245,
+ "burroughs": 41337,
+ "burrows": 44846,
+ "burst": 13005,
+ "bursting": 32566,
+ "bursts": 37026,
+ "burt": 27162,
+ "burton": 42354,
+ "burton": 12704,
+ "burundi": 33595,
+ "bury": 12276,
+ "bury": 3899,
+ "burys": 32362,
+ "bus": 1319,
+ "bus": 2840,
+ "busan": 40172,
+ "busc": 35000,
+ "busch": 20475,
+ "buses": 12879,
+ "bush": 11191,
+ "bush": 6867,
+ "bushes": 37578,
+ "busiest": 32764,
+ "busine": 4598,
+ "busines": 25364,
+ "business": 8346,
+ "business": 1716,
+ "businesses": 7287,
+ "businessman": 25635,
+ "buss": 47764,
+ "bust": 31299,
+ "bust": 9959,
+ "busted": 18643,
+ "buster": 37219,
+ "buster": 12094,
+ "busters": 16362,
+ "busting": 29622,
+ "busy": 39332,
+ "busy": 4354,
+ "but": 2201,
+ "but": 767,
+ "butch": 35102,
+ "butcher": 18732,
+ "butchers": 42334,
+ "bute": 39240,
+ "butes": 14630,
+ "butler": 35867,
+ "butler": 10702,
+ "butt": 12500,
+ "butt": 31523,
+ "butte": 31678,
+ "butter": 5427,
+ "butter": 6952,
+ "butterflies": 16232,
+ "butterfly": 9738,
+ "buttermilk": 40180,
+ "butternut": 36867,
+ "buttery": 45535,
+ "button": 45480,
+ "button": 8007,
+ "buttons": 16188,
+ "butts": 25309,
+ "buu": 42313,
+ "buuren": 47752,
+ "buxton": 41370,
+ "buy": 11632,
+ "buy": 2131,
+ "buyer": 14682,
+ "buyers": 14663,
+ "buying": 6566,
+ "buys": 15560,
+ "buzz": 7866,
+ "buzz": 8706,
+ "buzzard": 47434,
+ "buzzer": 38064,
+ "buzzfeed": 26613,
+ "buzzing": 18511,
+ "bv": 18958,
+ "bv": 35861,
+ "bvb": 22454,
+ "bw": 17672,
+ "bw": 15120,
+ "bway": 26652,
+ "bwfc": 40918,
+ "bwo": 45902,
+ "bx": 33633,
+ "by": 1713,
+ "by": 638,
+ "bye": 20076,
+ "bye": 4460,
+ "byes": 47958,
+ "byl": 34994,
+ "byn": 46917,
+ "byn": 11890,
+ "byo": 28039,
+ "bypass": 26530,
+ "byr": 15534,
+ "byrd": 30369,
+ "byrne": 19676,
+ "byron": 43504,
+ "byron": 19775,
+ "bys": 26740,
+ "bystand": 46138,
+ "byte": 42798,
+ "bytes": 39538,
+ "bythe": 36621,
+ "byu": 41072,
+ "byu": 23770,
+ "byz": 35406,
+ "byzantine": 44081,
+ "bz": 13631,
+ "bé": 40365,
+ "bü": 38706,
+ "c": 66,
+ "c": 322,
+ "ca": 772,
+ "ca": 1684,
+ "caa": 19316,
+ "cab": 3033,
+ "cab": 11912,
+ "cabaret": 26263,
+ "cabbage": 18407,
+ "cabe": 32731,
+ "cabello": 34371,
+ "caber": 29062,
+ "cabernet": 33730,
+ "cabin": 14178,
+ "cabine": 23354,
+ "cabinet": 9937,
+ "cabinets": 33083,
+ "cabins": 48455,
+ "cable": 7925,
+ "cables": 22408,
+ "cabo": 37318,
+ "cabo": 28370,
+ "cabrera": 42338,
+ "cabs": 42048,
+ "cac": 8298,
+ "cac": 23872,
+ "cacao": 38022,
+ "cache": 28993,
+ "caching": 40655,
+ "cactus": 19794,
+ "cad": 6297,
+ "cad": 20166,
+ "caday": 34187,
+ "cadbury": 44698,
+ "caddy": 41521,
+ "cade": 10497,
+ "cade": 17306,
+ "cadet": 22764,
+ "cadets": 19160,
+ "cadillac": 18156,
+ "cae": 49264,
+ "caer": 28298,
+ "caes": 15740,
+ "caesar": 21642,
+ "caesars": 42162,
+ "caf": 3471,
+ "caf": 20867,
+ "cafc": 30748,
+ "cafe": 15201,
+ "cafe": 4979,
+ "cafes": 40166,
+ "cafeteria": 32817,
+ "caffe": 18258,
+ "caffe": 45416,
+ "caffeine": 22487,
+ "café": 15304,
+ "cag": 15714,
+ "cage": 11838,
+ "cages": 37939,
+ "cah": 40519,
+ "cahill": 33185,
+ "cai": 38971,
+ "cai": 36116,
+ "cain": 13747,
+ "caine": 16799,
+ "cair": 15804,
+ "cair": 46659,
+ "cairn": 31264,
+ "cairn": 42467,
+ "cairngor": 44067,
+ "cairns": 32941,
+ "cairo": 19615,
+ "cait": 14116,
+ "caitlin": 47768,
+ "caitlin": 26809,
+ "caitlyn": 35763,
+ "cajun": 43425,
+ "cajun": 33044,
+ "cak": 42986,
+ "cake": 15295,
+ "cake": 2972,
+ "cakeday": 46207,
+ "cakes": 5950,
+ "cal": 1198,
+ "cal": 6372,
+ "cala": 32133,
+ "calab": 31795,
+ "calais": 39886,
+ "calam": 28841,
+ "calc": 45055,
+ "calci": 22824,
+ "calcium": 27815,
+ "calcu": 15328,
+ "calcul": 15734,
+ "calculate": 37656,
+ "calculated": 40688,
+ "calculations": 44605,
+ "calculator": 26093,
+ "calculus": 35104,
+ "calcutta": 42901,
+ "calder": 29372,
+ "calder": 36817,
+ "caldwell": 30484,
+ "cale": 32674,
+ "caleb": 19619,
+ "caled": 28421,
+ "calend": 6057,
+ "calendar": 7122,
+ "calendars": 17229,
+ "calf": 17508,
+ "calgary": 27415,
+ "calgary": 10797,
+ "calhoun": 38929,
+ "cali": 2857,
+ "cali": 16337,
+ "caliber": 32820,
+ "calibr": 32597,
+ "calico": 45379,
+ "calif": 30839,
+ "califor": 3526,
+ "californi": 21303,
+ "california": 3729,
+ "call": 7950,
+ "call": 1620,
+ "calla": 20658,
+ "callahan": 43313,
+ "callaway": 42596,
+ "callback": 44764,
+ "calle": 47699,
+ "calle": 38144,
+ "called": 2726,
+ "caller": 30666,
+ "calli": 16338,
+ "callie": 36512,
+ "calligraphy": 27775,
+ "calling": 4597,
+ "callister": 49026,
+ "callme": 42449,
+ "callof": 41280,
+ "calls": 4572,
+ "callum": 23224,
+ "calm": 34990,
+ "calm": 7011,
+ "calming": 30690,
+ "calorie": 32679,
+ "calories": 18029,
+ "cals": 47714,
+ "calum": 16405,
+ "calvary": 40169,
+ "calvert": 47134,
+ "calves": 31857,
+ "calvin": 27642,
+ "calvin": 17345,
+ "caly": 10244,
+ "calyp": 29851,
+ "cam": 1004,
+ "cam": 5982,
+ "camar": 31991,
+ "camber": 44362,
+ "cambo": 14662,
+ "cambodia": 17347,
+ "cambridge": 24651,
+ "cambridge": 9334,
+ "cambridgeshire": 46139,
+ "camden": 38735,
+ "camden": 17984,
+ "came": 1986,
+ "camel": 27005,
+ "camel": 21914,
+ "camels": 41357,
+ "cameo": 19492,
+ "camer": 4961,
+ "camera": 3934,
+ "cameraman": 43347,
+ "cameras": 12172,
+ "camero": 20320,
+ "cameron": 19634,
+ "cameron": 8057,
+ "camerondallas": 40587,
+ "cameroon": 24061,
+ "camil": 37745,
+ "camila": 19919,
+ "camilla": 38897,
+ "camille": 26741,
+ "camino": 28529,
+ "camo": 28702,
+ "camo": 19716,
+ "camogie": 39547,
+ "camou": 23588,
+ "camoufla": 23667,
+ "camouflage": 29049,
+ "camp": 2854,
+ "camp": 2877,
+ "campa": 2793,
+ "campaig": 9448,
+ "campaign": 44524,
+ "campaign": 3193,
+ "campaigner": 46364,
+ "campaigners": 40272,
+ "campaigning": 19594,
+ "campaigns": 15669,
+ "campan": 31765,
+ "campbell": 29094,
+ "campbell": 8806,
+ "campe": 16672,
+ "campeon": 49109,
+ "campeones": 30105,
+ "camper": 41914,
+ "camper": 24522,
+ "campers": 26619,
+ "campfire": 32530,
+ "campground": 46969,
+ "camping": 9982,
+ "campo": 27600,
+ "campos": 48077,
+ "camps": 12806,
+ "campsite": 44243,
+ "campu": 19687,
+ "campus": 4560,
+ "campuses": 31895,
+ "camra": 46155,
+ "camry": 46472,
+ "cams": 32590,
+ "can": 950,
+ "can": 753,
+ "cana": 28341,
+ "canad": 13193,
+ "canada": 2698,
+ "canadaday": 39800,
+ "canadi": 4329,
+ "canadian": 22160,
+ "canadian": 5255,
+ "canadians": 18989,
+ "canadiens": 40932,
+ "canal": 28585,
+ "canal": 9535,
+ "canals": 38483,
+ "canaria": 47117,
+ "canary": 40409,
+ "canary": 24523,
+ "canberra": 16719,
+ "canc": 43189,
+ "cancel": 12026,
+ "cancel": 21546,
+ "canceled": 25874,
+ "cancell": 28027,
+ "cancellation": 38765,
+ "cancelled": 13270,
+ "cancels": 34089,
+ "cancer": 12690,
+ "cancer": 3148,
+ "cancers": 33201,
+ "cancun": 34721,
+ "cand": 4986,
+ "candace": 45623,
+ "candel": 47834,
+ "candi": 6034,
+ "candice": 30024,
+ "candid": 7884,
+ "candid": 19206,
+ "candidacy": 46248,
+ "candidate": 6475,
+ "candidates": 8619,
+ "candied": 43982,
+ "candies": 46305,
+ "candle": 18995,
+ "candle": 12674,
+ "candlelight": 34724,
+ "candles": 15472,
+ "candy": 20741,
+ "candy": 6417,
+ "cane": 23644,
+ "cane": 14716,
+ "canelo": 43210,
+ "canes": 21902,
+ "cani": 35592,
+ "canine": 27380,
+ "cann": 4139,
+ "cann": 23709,
+ "cannab": 7577,
+ "cannabis": 31837,
+ "cannabis": 8861,
+ "canne": 44252,
+ "canned": 27290,
+ "cannes": 13773,
+ "canni": 26389,
+ "canning": 38621,
+ "cannon": 28771,
+ "cannon": 15661,
+ "cannons": 46269,
+ "cannot": 4785,
+ "canny": 26986,
+ "cano": 31668,
+ "cano": 25937,
+ "canoe": 23503,
+ "canola": 40389,
+ "canon": 17749,
+ "canon": 9310,
+ "canopy": 26061,
+ "cans": 13707,
+ "cant": 13395,
+ "cant": 5784,
+ "canteen": 39230,
+ "canter": 19301,
+ "canterbury": 22271,
+ "canti": 42845,
+ "cantina": 47472,
+ "canton": 37735,
+ "canton": 25363,
+ "cantore": 41769,
+ "cantwait": 33760,
+ "canu": 20171,
+ "canucks": 24321,
+ "canv": 30714,
+ "canvas": 22441,
+ "canvas": 7483,
+ "canvass": 40054,
+ "canvassing": 33783,
+ "cany": 47674,
+ "canyon": 41246,
+ "canyon": 9755,
+ "cao": 29207,
+ "cap": 1289,
+ "cap": 3938,
+ "capabilities": 19512,
+ "capability": 25885,
+ "capable": 14742,
+ "capac": 24665,
+ "capacity": 8970,
+ "capcom": 28342,
+ "cape": 10288,
+ "cape": 6631,
+ "capecod": 41339,
+ "capes": 38785,
+ "capetown": 20059,
+ "capit": 6889,
+ "capita": 41833,
+ "capital": 11198,
+ "capital": 5439,
+ "capitalism": 20068,
+ "capitalist": 37015,
+ "capitals": 29579,
+ "capitol": 43880,
+ "capitol": 11375,
+ "capo": 45477,
+ "capp": 16718,
+ "capped": 24659,
+ "capping": 42656,
+ "cappuccino": 37402,
+ "capri": 48699,
+ "capri": 30982,
+ "capric": 28667,
+ "capricorn": 46314,
+ "caps": 23185,
+ "capsu": 15608,
+ "capsul": 40341,
+ "capsule": 20627,
+ "capsules": 32870,
+ "capt": 45815,
+ "capt": 17369,
+ "captain": 14958,
+ "captain": 4621,
+ "captainamerica": 46229,
+ "captainmarvel": 48492,
+ "captains": 18706,
+ "caption": 11327,
+ "captions": 41878,
+ "captiv": 19776,
+ "captivating": 30580,
+ "captive": 29038,
+ "captivity": 41141,
+ "capture": 8818,
+ "captured": 8020,
+ "captures": 15305,
+ "capturing": 19548,
+ "capu": 44241,
+ "car": 811,
+ "car": 1615,
+ "cara": 20016,
+ "carab": 32251,
+ "carac": 30029,
+ "caracas": 45854,
+ "caramel": 14788,
+ "carameli": 41739,
+ "caramelized": 43854,
+ "carat": 32981,
+ "carav": 13814,
+ "caravan": 18566,
+ "carb": 21379,
+ "carbo": 43235,
+ "carbon": 14038,
+ "carbon": 7549,
+ "carbs": 29313,
+ "carcin": 31587,
+ "carcinoma": 46810,
+ "card": 10793,
+ "card": 2601,
+ "cardam": 49008,
+ "cardboard": 19845,
+ "cardi": 6211,
+ "cardi": 29677,
+ "cardiac": 21256,
+ "cardiff": 22488,
+ "cardiff": 9781,
+ "cardigan": 30501,
+ "cardin": 8457,
+ "cardinal": 46310,
+ "cardinal": 16472,
+ "cardinals": 12837,
+ "cardio": 15003,
+ "cardio": 23455,
+ "cardiology": 37276,
+ "cardiovascular": 29291,
+ "cardo": 40625,
+ "cards": 4094,
+ "care": 2050,
+ "care": 1776,
+ "cared": 27675,
+ "career": 20609,
+ "career": 3061,
+ "careers": 10090,
+ "careful": 11999,
+ "carefully": 15789,
+ "caregi": 22042,
+ "caregiver": 46372,
+ "caregivers": 35909,
+ "careless": 47325,
+ "carers": 26484,
+ "cares": 10968,
+ "caretaker": 48037,
+ "carey": 14895,
+ "cargo": 12490,
+ "cari": 18497,
+ "cari": 37273,
+ "carib": 9757,
+ "caribbean": 10368,
+ "caribou": 42135,
+ "caric": 25337,
+ "caricature": 38857,
+ "carina": 44357,
+ "caring": 13083,
+ "carl": 8273,
+ "carl": 9482,
+ "carla": 25552,
+ "carleton": 46496,
+ "carlin": 47559,
+ "carlisle": 23276,
+ "carlo": 17861,
+ "carlo": 15266,
+ "carlos": 9538,
+ "carlow": 44745,
+ "carls": 39635,
+ "carlson": 24114,
+ "carlton": 18934,
+ "carly": 23166,
+ "carly": 22689,
+ "carlyle": 46555,
+ "carmel": 30757,
+ "carmel": 25601,
+ "carmen": 41427,
+ "carmen": 18834,
+ "carmichael": 41657,
+ "carn": 21597,
+ "carnage": 31385,
+ "carnation": 44577,
+ "carnaval": 47238,
+ "carne": 17053,
+ "carne": 42885,
+ "carnegie": 25287,
+ "carney": 34194,
+ "carni": 8438,
+ "carnival": 36708,
+ "carnival": 10577,
+ "caro": 30317,
+ "caro": 29344,
+ "carol": 4242,
+ "carol": 11489,
+ "carole": 31955,
+ "carolin": 26418,
+ "carolina": 7027,
+ "caroline": 31064,
+ "caroline": 12641,
+ "carols": 33269,
+ "carolyn": 25825,
+ "carou": 32224,
+ "carousel": 36665,
+ "carp": 26085,
+ "carpen": 15584,
+ "carpenter": 18475,
+ "carpet": 6922,
+ "carpets": 34612,
+ "carr": 26951,
+ "carr": 17136,
+ "carra": 32332,
+ "carre": 31114,
+ "carrera": 32952,
+ "carri": 4739,
+ "carriage": 47885,
+ "carriage": 21087,
+ "carrick": 44052,
+ "carrie": 30334,
+ "carrie": 15848,
+ "carried": 12960,
+ "carrier": 12308,
+ "carriers": 26865,
+ "carries": 17982,
+ "carrieunderwood": 47338,
+ "carrington": 48759,
+ "carroll": 41911,
+ "carroll": 14893,
+ "carrot": 15435,
+ "carrots": 19299,
+ "carry": 31863,
+ "carry": 6998,
+ "carrying": 9920,
+ "cars": 3346,
+ "carsforsale": 45222,
+ "carson": 41766,
+ "carson": 13171,
+ "cart": 27705,
+ "cart": 13065,
+ "cartag": 45042,
+ "cartagena": 47157,
+ "carte": 44949,
+ "cartel": 30529,
+ "carter": 27330,
+ "carter": 7260,
+ "cartier": 32951,
+ "carto": 5487,
+ "carton": 41812,
+ "cartoon": 33082,
+ "cartoon": 7651,
+ "cartoonist": 30793,
+ "cartoons": 17673,
+ "cartri": 47084,
+ "cartridge": 29432,
+ "cartridges": 49249,
+ "carts": 27581,
+ "cartunesapp": 32888,
+ "caruso": 45192,
+ "carve": 40152,
+ "carved": 15127,
+ "carver": 28850,
+ "carving": 19428,
+ "carvings": 48123,
+ "cary": 22844,
+ "cas": 1671,
+ "cas": 13831,
+ "casa": 14643,
+ "casablanc": 36572,
+ "casablanca": 41950,
+ "casc": 36714,
+ "casca": 43296,
+ "cascade": 29065,
+ "cascades": 46454,
+ "case": 17698,
+ "case": 2068,
+ "cases": 6888,
+ "casey": 24899,
+ "casey": 12836,
+ "cash": 11050,
+ "cash": 5131,
+ "cashback": 36368,
+ "cashe": 32233,
+ "cashew": 39531,
+ "cashi": 29517,
+ "cashier": 34547,
+ "cashmere": 34566,
+ "casi": 38350,
+ "casino": 10473,
+ "casio": 32261,
+ "cask": 26299,
+ "casm": 35198,
+ "casper": 35892,
+ "cass": 22556,
+ "cassandra": 35289,
+ "casser": 31093,
+ "casserole": 36045,
+ "cassette": 19717,
+ "cassi": 14942,
+ "cassidy": 21757,
+ "cassie": 29323,
+ "cassini": 46554,
+ "cast": 2509,
+ "cast": 1970,
+ "caste": 32693,
+ "casted": 33838,
+ "castel": 43306,
+ "castell": 31792,
+ "caster": 32101,
+ "caster": 8449,
+ "casters": 29721,
+ "castic": 47737,
+ "castillo": 30813,
+ "casting": 7087,
+ "castle": 12496,
+ "castle": 3540,
+ "castles": 24766,
+ "castro": 16950,
+ "casts": 10595,
+ "casu": 15345,
+ "casual": 10129,
+ "casually": 18840,
+ "casualties": 30244,
+ "casualty": 31222,
+ "cat": 1481,
+ "cat": 2368,
+ "cata": 42279,
+ "catal": 12792,
+ "catalan": 30532,
+ "catalina": 36576,
+ "catalo": 34740,
+ "catalog": 20036,
+ "catalogue": 20985,
+ "catalonia": 27039,
+ "catalunya": 44132,
+ "cataly": 15894,
+ "catalyst": 25387,
+ "catan": 45893,
+ "catap": 39514,
+ "catar": 35801,
+ "catastro": 22736,
+ "catastrophe": 41422,
+ "catastrophic": 34448,
+ "catch": 18901,
+ "catch": 3042,
+ "catcher": 15965,
+ "catchers": 39060,
+ "catches": 17213,
+ "catching": 8617,
+ "catchy": 37114,
+ "catday": 32243,
+ "cate": 6357,
+ "cate": 24510,
+ "cated": 31823,
+ "categor": 17006,
+ "categori": 40117,
+ "categories": 19971,
+ "category": 9432,
+ "cater": 16634,
+ "cater": 38101,
+ "catering": 16697,
+ "caterpillar": 27111,
+ "catfish": 26077,
+ "cath": 9196,
+ "cath": 30811,
+ "cathar": 43784,
+ "cathe": 7174,
+ "cathedr": 46370,
+ "cathedral": 7865,
+ "catherine": 35035,
+ "catherine": 12339,
+ "catho": 7595,
+ "cathol": 16315,
+ "catholic": 20382,
+ "catholic": 7757,
+ "catholics": 36808,
+ "cathy": 40326,
+ "cathy": 22731,
+ "cation": 21367,
+ "cato": 33558,
+ "cats": 38800,
+ "cats": 3989,
+ "catsofinstagram": 39901,
+ "catsoftwitter": 17273,
+ "catt": 37339,
+ "cattle": 48799,
+ "cattle": 13644,
+ "caturday": 20892,
+ "catwalk": 36565,
+ "catwoman": 47251,
+ "cau": 1121,
+ "cau": 45529,
+ "caucus": 18847,
+ "caught": 4520,
+ "caul": 23460,
+ "cauley": 41682,
+ "caulfield": 44906,
+ "cauli": 20123,
+ "cauliflower": 23802,
+ "cause": 18982,
+ "cause": 1394,
+ "caused": 8940,
+ "causes": 9775,
+ "causeway": 35034,
+ "causing": 10779,
+ "caution": 15656,
+ "cautious": 36579,
+ "cav": 4942,
+ "cav": 45935,
+ "cava": 48682,
+ "caval": 24537,
+ "cavali": 20783,
+ "cavalier": 44488,
+ "cavaliers": 30194,
+ "cavalry": 32467,
+ "cave": 25441,
+ "cave": 9654,
+ "cavendish": 42945,
+ "caver": 41487,
+ "caves": 22096,
+ "cavi": 27360,
+ "caviar": 31228,
+ "cavill": 40492,
+ "cavity": 43156,
+ "cavs": 16800,
+ "caw": 38405,
+ "caw": 43804,
+ "cawx": 26739,
+ "cay": 11876,
+ "cay": 37399,
+ "cayenne": 43650,
+ "cayman": 33737,
+ "caz": 48451,
+ "cb": 4034,
+ "cb": 8830,
+ "cba": 38472,
+ "cbb": 31487,
+ "cbc": 14096,
+ "cbc": 14523,
+ "cbd": 13176,
+ "cbe": 43639,
+ "cbi": 30875,
+ "cbj": 35608,
+ "cbn": 26579,
+ "cbp": 46723,
+ "cbr": 28762,
+ "cbs": 16788,
+ "cbs": 8009,
+ "cc": 2976,
+ "cc": 2021,
+ "cca": 17987,
+ "ccc": 21856,
+ "ccd": 48556,
+ "ccg": 37755,
+ "cch": 21789,
+ "cchini": 28467,
+ "cci": 32942,
+ "cci": 8196,
+ "ccl": 43773,
+ "ccm": 40435,
+ "cco": 28786,
+ "ccot": 24950,
+ "ccp": 43045,
+ "ccs": 30400,
+ "cctv": 23097,
+ "ccu": 49023,
+ "cd": 4308,
+ "cd": 4480,
+ "cda": 45565,
+ "cdc": 41098,
+ "cdc": 25779,
+ "cdn": 8886,
+ "cdn": 26802,
+ "cdnpoli": 11645,
+ "cdo": 47187,
+ "cdp": 39624,
+ "cds": 20784,
+ "cdt": 18455,
+ "ce": 685,
+ "ce": 629,
+ "cea": 28355,
+ "cean": 34409,
+ "cean": 37295,
+ "cease": 32856,
+ "cease": 25499,
+ "ceasefire": 38291,
+ "cebu": 20146,
+ "cec": 29694,
+ "cec": 40029,
+ "cecil": 26987,
+ "cecil": 27169,
+ "cecilia": 35440,
+ "ced": 25634,
+ "ced": 2323,
+ "cedar": 24167,
+ "cedar": 13799,
+ "cedric": 36608,
+ "cee": 45966,
+ "cee": 15015,
+ "cees": 47914,
+ "ceil": 27275,
+ "ceiling": 12374,
+ "ceilings": 33770,
+ "cek": 45544,
+ "cel": 2269,
+ "cel": 7597,
+ "cele": 1314,
+ "celeb": 38862,
+ "celeb": 19393,
+ "celebr": 1372,
+ "celebrate": 31414,
+ "celebrate": 2694,
+ "celebrated": 9184,
+ "celebrates": 7564,
+ "celebrating": 3382,
+ "celebration": 4615,
+ "celebrations": 10825,
+ "celebratory": 34115,
+ "celebrities": 17071,
+ "celebrity": 23981,
+ "celebrity": 7320,
+ "celebs": 19803,
+ "celed": 25741,
+ "celer": 9621,
+ "celery": 30990,
+ "celeste": 29364,
+ "celesti": 29497,
+ "celestial": 32669,
+ "celi": 25567,
+ "celia": 44489,
+ "celine": 33644,
+ "cell": 9316,
+ "cell": 5533,
+ "cellar": 24282,
+ "cellars": 44976,
+ "cellence": 34687,
+ "cello": 23013,
+ "cellphone": 39029,
+ "cells": 8890,
+ "cellu": 16791,
+ "cellular": 23268,
+ "cels": 24021,
+ "celsius": 47057,
+ "celtic": 21897,
+ "celtic": 10523,
+ "celticfc": 38612,
+ "celtics": 16226,
+ "cem": 41435,
+ "ceme": 10517,
+ "cement": 4369,
+ "cements": 19448,
+ "cemetery": 11660,
+ "cen": 1306,
+ "cen": 30106,
+ "cena": 21591,
+ "cence": 24410,
+ "cency": 41259,
+ "cene": 30038,
+ "censor": 24230,
+ "censor": 44709,
+ "censored": 30951,
+ "censorship": 27284,
+ "census": 23677,
+ "cent": 1784,
+ "cent": 3662,
+ "centenary": 22422,
+ "centennial": 20895,
+ "center": 16651,
+ "center": 2119,
+ "centered": 24584,
+ "centers": 14494,
+ "centi": 48889,
+ "centime": 48687,
+ "centr": 2370,
+ "central": 13448,
+ "central": 3339,
+ "centre": 26310,
+ "centre": 2916,
+ "centred": 47925,
+ "centres": 19354,
+ "centri": 30872,
+ "centric": 19297,
+ "centro": 37178,
+ "cents": 11934,
+ "centu": 16818,
+ "centuri": 36816,
+ "centuries": 19014,
+ "century": 26134,
+ "century": 4275,
+ "ceo": 46340,
+ "ceo": 3559,
+ "ceos": 28332,
+ "cep": 2632,
+ "cep": 48714,
+ "ceph": 44343,
+ "cept": 3678,
+ "ception": 12346,
+ "cer": 1364,
+ "cer": 1925,
+ "cera": 34608,
+ "ceram": 10677,
+ "ceramic": 15112,
+ "ceramics": 22438,
+ "cere": 3984,
+ "cere": 22085,
+ "cereal": 17581,
+ "cereals": 48618,
+ "cerebral": 39073,
+ "ceremon": 15796,
+ "ceremonial": 33281,
+ "ceremonies": 21547,
+ "ceremony": 5193,
+ "cern": 44851,
+ "cers": 13638,
+ "cert": 27522,
+ "certain": 8526,
+ "certain": 7883,
+ "certainly": 10883,
+ "certainty": 20054,
+ "certi": 4888,
+ "certific": 9443,
+ "certificate": 11786,
+ "certificates": 25281,
+ "certification": 14735,
+ "certified": 9288,
+ "cerv": 25738,
+ "cervical": 35953,
+ "ces": 28715,
+ "ces": 1604,
+ "cesar": 37025,
+ "cesar": 28603,
+ "cess": 2314,
+ "cess": 1554,
+ "cessna": 36596,
+ "cest": 27245,
+ "cester": 15769,
+ "cester": 12718,
+ "cet": 14960,
+ "cett": 46708,
+ "ceu": 37457,
+ "cevic": 48369,
+ "cey": 20971,
+ "cf": 10189,
+ "cf": 11171,
+ "cfa": 34521,
+ "cfb": 32931,
+ "cfc": 11577,
+ "cfd": 46171,
+ "cfl": 46320,
+ "cfl": 22332,
+ "cfo": 26937,
+ "cfp": 40756,
+ "cfr": 44033,
+ "cfs": 32835,
+ "cg": 27118,
+ "cg": 14740,
+ "cgc": 38775,
+ "cgi": 30520,
+ "ch": 540,
+ "ch": 634,
+ "cha": 1587,
+ "cha": 4541,
+ "chab": 26670,
+ "chad": 13095,
+ "chad": 12923,
+ "chae": 9460,
+ "chaf": 38123,
+ "chag": 27989,
+ "chai": 31590,
+ "chai": 18919,
+ "chain": 13898,
+ "chain": 3946,
+ "chained": 34402,
+ "chains": 14438,
+ "chainsaw": 37617,
+ "chainz": 39687,
+ "chair": 4728,
+ "chair": 4269,
+ "chaired": 31664,
+ "chairing": 42205,
+ "chairman": 6901,
+ "chairperson": 31584,
+ "chairs": 12033,
+ "chak": 13702,
+ "chak": 41713,
+ "chakra": 38304,
+ "chakra": 33241,
+ "chal": 7397,
+ "chal": 30809,
+ "chale": 38099,
+ "chalet": 37907,
+ "chalk": 31362,
+ "chalk": 17846,
+ "chall": 2073,
+ "challeng": 4138,
+ "challenge": 29462,
+ "challenge": 2836,
+ "challenged": 17380,
+ "challenger": 18228,
+ "challengers": 46404,
+ "challenges": 6280,
+ "challenging": 11754,
+ "chalmers": 47955,
+ "cham": 1290,
+ "cham": 19951,
+ "chamber": 18983,
+ "chamber": 7642,
+ "chamberlain": 32756,
+ "chambers": 16501,
+ "chamele": 34759,
+ "chameleon": 41317,
+ "champ": 36813,
+ "champ": 6602,
+ "champag": 10283,
+ "champagne": 11007,
+ "champi": 1680,
+ "champion": 2643,
+ "champion": 3950,
+ "champions": 4227,
+ "championship": 3429,
+ "championships": 7047,
+ "championsleague": 27638,
+ "champs": 6240,
+ "chan": 1255,
+ "chan": 6704,
+ "chana": 48752,
+ "chanc": 13931,
+ "chance": 32940,
+ "chance": 2594,
+ "chancellor": 15886,
+ "chances": 10870,
+ "chand": 7126,
+ "chand": 41508,
+ "chandelier": 30570,
+ "chandi": 12482,
+ "chandigarh": 34106,
+ "chandler": 17595,
+ "chandra": 27082,
+ "chandra": 25348,
+ "chanel": 16951,
+ "chang": 2233,
+ "chang": 16461,
+ "change": 11608,
+ "change": 1799,
+ "changeable": 41335,
+ "changed": 4907,
+ "changer": 18406,
+ "changers": 35185,
+ "changes": 4938,
+ "changing": 40384,
+ "changing": 5621,
+ "changmin": 47410,
+ "chann": 8804,
+ "channel": 25837,
+ "channel": 3847,
+ "channeling": 28197,
+ "channels": 13961,
+ "channing": 37417,
+ "chant": 18165,
+ "chant": 13521,
+ "chanting": 32111,
+ "chants": 22723,
+ "chanyeol": 18805,
+ "chao": 31815,
+ "chaos": 10853,
+ "chaotic": 33501,
+ "chap": 3825,
+ "chap": 21939,
+ "chapel": 40859,
+ "chapel": 10137,
+ "chaplain": 38348,
+ "chaplin": 32545,
+ "chapman": 17968,
+ "chapp": 20634,
+ "chaps": 36823,
+ "chapter": 6014,
+ "chapters": 22936,
+ "char": 1054,
+ "char": 16017,
+ "chara": 35668,
+ "charac": 2792,
+ "character": 10997,
+ "character": 4009,
+ "characterdesign": 38149,
+ "characteri": 20920,
+ "characteristic": 44747,
+ "characteristics": 26037,
+ "characters": 6564,
+ "charan": 31851,
+ "charcoal": 19268,
+ "chard": 17524,
+ "chardon": 26599,
+ "chardonnay": 28161,
+ "charge": 25032,
+ "charge": 5948,
+ "chargeable": 35664,
+ "charged": 7916,
+ "charger": 13090,
+ "chargers": 17352,
+ "charges": 8962,
+ "charging": 12514,
+ "chariot": 38811,
+ "charis": 24449,
+ "charisma": 45041,
+ "charismatic": 37205,
+ "charitable": 23256,
+ "charities": 18493,
+ "charity": 20008,
+ "charity": 4607,
+ "charitytuesday": 42794,
+ "charl": 47736,
+ "charle": 10217,
+ "charles": 27983,
+ "charles": 5127,
+ "charleston": 15478,
+ "charley": 38027,
+ "charli": 21784,
+ "charli": 49392,
+ "charlie": 16764,
+ "charlie": 6393,
+ "charlotte": 18445,
+ "charlotte": 7871,
+ "charlottesville": 32027,
+ "charlton": 27048,
+ "charm": 10876,
+ "charmed": 39790,
+ "charming": 12177,
+ "charms": 21944,
+ "charred": 44085,
+ "chart": 42685,
+ "chart": 5053,
+ "charted": 27939,
+ "charter": 42345,
+ "charter": 13569,
+ "chartered": 31298,
+ "charters": 46626,
+ "charting": 39841,
+ "charts": 10728,
+ "chas": 10717,
+ "chas": 29838,
+ "chase": 21503,
+ "chase": 3859,
+ "chased": 30342,
+ "chaser": 29560,
+ "chasers": 34158,
+ "chases": 45011,
+ "chasing": 46909,
+ "chasing": 13376,
+ "chassis": 29188,
+ "chast": 42176,
+ "chasu": 41352,
+ "chat": 5355,
+ "chat": 2402,
+ "chatbots": 43994,
+ "chate": 30377,
+ "chateau": 44582,
+ "chateau": 23520,
+ "chath": 46849,
+ "chatham": 32030,
+ "chats": 13263,
+ "chatt": 21618,
+ "chattanoo": 28009,
+ "chattanooga": 29866,
+ "chatted": 34124,
+ "chatter": 33473,
+ "chatter": 41103,
+ "chatting": 12401,
+ "chatur": 33839,
+ "chau": 11263,
+ "chau": 37536,
+ "chauffe": 45440,
+ "chauhan": 46663,
+ "chav": 28997,
+ "chavez": 27480,
+ "chaw": 39639,
+ "chay": 45317,
+ "chaz": 47815,
+ "chc": 36233,
+ "chd": 41645,
+ "che": 983,
+ "che": 3842,
+ "chea": 39580,
+ "chead": 48358,
+ "cheap": 27036,
+ "cheap": 8678,
+ "cheape": 26164,
+ "cheaper": 17776,
+ "cheapest": 26640,
+ "cheat": 18180,
+ "cheated": 34285,
+ "cheating": 19722,
+ "chec": 1113,
+ "check": 7672,
+ "check": 1217,
+ "checked": 10387,
+ "checker": 45883,
+ "checkers": 48181,
+ "checking": 7441,
+ "checklist": 26989,
+ "checkout": 13101,
+ "checkpoint": 27531,
+ "checks": 13737,
+ "ched": 11341,
+ "ched": 2146,
+ "cheddar": 20551,
+ "chee": 5326,
+ "chee": 20944,
+ "cheek": 40000,
+ "cheek": 21227,
+ "cheeks": 23019,
+ "cheeky": 15068,
+ "cheer": 9733,
+ "cheer": 6918,
+ "cheered": 38111,
+ "cheerful": 28882,
+ "cheering": 14289,
+ "cheerleader": 29072,
+ "cheerleaders": 22343,
+ "cheerleading": 36366,
+ "cheers": 6562,
+ "chees": 15182,
+ "cheese": 10738,
+ "cheese": 4108,
+ "cheeseburger": 41200,
+ "cheesecake": 17803,
+ "cheeses": 36076,
+ "cheesy": 22093,
+ "cheetah": 27431,
+ "chef": 12137,
+ "chef": 4895,
+ "chefs": 14486,
+ "chek": 43745,
+ "chel": 3084,
+ "chel": 25970,
+ "chell": 46854,
+ "chelle": 30141,
+ "chelms": 34936,
+ "chelmsford": 39890,
+ "chelse": 19071,
+ "chelsea": 6031,
+ "chelseafc": 25927,
+ "chelten": 18889,
+ "cheltenham": 21589,
+ "chem": 5667,
+ "chem": 13698,
+ "chemi": 7179,
+ "chemical": 39376,
+ "chemical": 9208,
+ "chemicals": 17426,
+ "chemist": 23138,
+ "chemistry": 8841,
+ "chemo": 33095,
+ "chemo": 36348,
+ "chemotherapy": 41412,
+ "chemtrails": 46015,
+ "chen": 5907,
+ "chen": 8983,
+ "cheney": 43522,
+ "cheng": 32512,
+ "cheng": 30190,
+ "chenko": 29073,
+ "chennai": 28948,
+ "chennai": 12791,
+ "cheon": 11498,
+ "cheque": 28168,
+ "cher": 3597,
+ "cher": 3466,
+ "cheri": 26471,
+ "cherish": 20053,
+ "cherished": 42325,
+ "cherno": 35376,
+ "chernobyl": 40554,
+ "chero": 19844,
+ "cherokee": 22860,
+ "cherries": 27248,
+ "cherry": 21470,
+ "cherry": 7325,
+ "chers": 5789,
+ "chery": 38478,
+ "cheryl": 37784,
+ "cheryl": 20600,
+ "ches": 18346,
+ "ches": 1910,
+ "chesa": 28349,
+ "chesapeake": 32909,
+ "cheshire": 17130,
+ "chesney": 48747,
+ "chess": 27170,
+ "chess": 8397,
+ "chest": 18217,
+ "chest": 10563,
+ "chester": 10466,
+ "chester": 3343,
+ "chesterfield": 32975,
+ "chestnut": 21834,
+ "chet": 9663,
+ "chett": 24695,
+ "chev": 7152,
+ "chev": 41145,
+ "chevro": 12850,
+ "chevrolet": 13240,
+ "chevron": 33792,
+ "chevy": 16581,
+ "chew": 32645,
+ "chew": 22642,
+ "chewan": 23689,
+ "chewbacca": 49355,
+ "chewing": 31486,
+ "chewy": 42940,
+ "chey": 26968,
+ "chey": 31208,
+ "cheyenne": 34805,
+ "chez": 49183,
+ "chez": 10556,
+ "chf": 33021,
+ "chfield": 41619,
+ "chhat": 34127,
+ "chhattisgarh": 44246,
+ "chi": 1337,
+ "chi": 4039,
+ "chia": 19147,
+ "chiang": 33764,
+ "chibi": 22306,
+ "chic": 2627,
+ "chic": 9091,
+ "chica": 44190,
+ "chicag": 16778,
+ "chicago": 15038,
+ "chicago": 3530,
+ "chicagof": 40638,
+ "chicagofire": 46576,
+ "chicas": 40664,
+ "chichester": 43823,
+ "chick": 3170,
+ "chick": 11238,
+ "chicken": 26322,
+ "chicken": 3717,
+ "chickens": 21658,
+ "chickpea": 48109,
+ "chicks": 17810,
+ "chico": 30379,
+ "chie": 40046,
+ "chie": 12388,
+ "chief": 16830,
+ "chief": 3455,
+ "chiefs": 11419,
+ "chiev": 47761,
+ "chiff": 27407,
+ "chiffon": 31817,
+ "chig": 42952,
+ "chihu": 22857,
+ "chihuahu": 25437,
+ "chihuahua": 30181,
+ "chik": 45455,
+ "chil": 1333,
+ "child": 4392,
+ "child": 2913,
+ "childcare": 31133,
+ "childhood": 34772,
+ "childhood": 7551,
+ "childish": 31939,
+ "childre": 2135,
+ "children": 11101,
+ "children": 2153,
+ "childrens": 31551,
+ "childrens": 21553,
+ "childs": 39521,
+ "chile": 10022,
+ "chilean": 33186,
+ "chili": 13033,
+ "chill": 6498,
+ "chill": 6382,
+ "chilled": 23540,
+ "chillen": 45160,
+ "chilli": 26787,
+ "chilli": 17067,
+ "chillin": 10347,
+ "chilling": 10179,
+ "chillout": 39842,
+ "chills": 25460,
+ "chilly": 14450,
+ "chim": 10543,
+ "chimney": 26821,
+ "chimp": 44374,
+ "chin": 6555,
+ "chin": 8979,
+ "china": 38943,
+ "china": 2817,
+ "chinatown": 28582,
+ "chine": 4013,
+ "chinese": 30568,
+ "chinese": 4271,
+ "ching": 34621,
+ "ching": 1439,
+ "chino": 47181,
+ "chino": 27440,
+ "chinook": 41577,
+ "chinson": 33786,
+ "chio": 19650,
+ "chip": 19271,
+ "chip": 8730,
+ "chipmun": 46384,
+ "chipot": 17702,
+ "chipotle": 19284,
+ "chipp": 39854,
+ "chippe": 46541,
+ "chipped": 39892,
+ "chipping": 40323,
+ "chips": 8855,
+ "chir": 15564,
+ "chiro": 23413,
+ "chiroprac": 25987,
+ "chiropractic": 34437,
+ "chis": 19920,
+ "chistan": 20523,
+ "chiswick": 47290,
+ "chit": 13515,
+ "chit": 45626,
+ "chita": 49184,
+ "chitec": 39862,
+ "chive": 29222,
+ "chives": 34921,
+ "chk": 47424,
+ "chl": 38592,
+ "chley": 47748,
+ "chlo": 10374,
+ "chloe": 39966,
+ "chloe": 13992,
+ "chlor": 23135,
+ "chman": 35835,
+ "chment": 20848,
+ "chner": 48277,
+ "cho": 1327,
+ "cho": 5150,
+ "choa": 43077,
+ "choc": 32772,
+ "choc": 21983,
+ "choco": 46285,
+ "choco": 32692,
+ "chocol": 3443,
+ "chocolat": 44631,
+ "chocolate": 29389,
+ "chocolate": 3820,
+ "chocolates": 24120,
+ "choi": 23749,
+ "choic": 35606,
+ "choice": 23857,
+ "choice": 4051,
+ "choices": 11016,
+ "choir": 9214,
+ "choirs": 43277,
+ "choke": 30231,
+ "choked": 43521,
+ "choker": 39642,
+ "choking": 39993,
+ "chol": 19802,
+ "cholera": 45999,
+ "cholester": 26861,
+ "cholesterol": 27982,
+ "chom": 25151,
+ "chon": 20416,
+ "chon": 21601,
+ "chondri": 37379,
+ "chong": 26220,
+ "choo": 3869,
+ "choo": 24437,
+ "chool": 29578,
+ "chools": 41958,
+ "choose": 22756,
+ "choose": 5073,
+ "chooses": 29923,
+ "choosing": 13475,
+ "chop": 10458,
+ "chop": 16663,
+ "chopin": 42256,
+ "chopped": 22580,
+ "chopper": 24011,
+ "chopping": 35375,
+ "chopra": 24258,
+ "chops": 26321,
+ "chor": 7567,
+ "chor": 47795,
+ "choral": 26684,
+ "chord": 33005,
+ "chords": 36152,
+ "choreo": 17443,
+ "choreographer": 35952,
+ "choreography": 32749,
+ "chores": 40483,
+ "chori": 25718,
+ "chorizo": 30802,
+ "chorus": 20869,
+ "chos": 26559,
+ "chose": 11090,
+ "chosen": 10044,
+ "chou": 16960,
+ "chou": 42917,
+ "choudhary": 45503,
+ "chow": 20257,
+ "chow": 21657,
+ "chowder": 37886,
+ "chp": 35896,
+ "chr": 36918,
+ "chri": 1135,
+ "chris": 9907,
+ "chris": 2978,
+ "chrisbrown": 41035,
+ "chriss": 46745,
+ "chrissy": 44762,
+ "chrissy": 40485,
+ "christ": 1403,
+ "christ": 6703,
+ "christchurch": 27100,
+ "christen": 31956,
+ "christensen": 42226,
+ "christi": 3328,
+ "christi": 33213,
+ "christian": 11792,
+ "christian": 4729,
+ "christianity": 20000,
+ "christians": 14842,
+ "christie": 16084,
+ "christin": 30189,
+ "christina": 15925,
+ "christine": 42610,
+ "christine": 14712,
+ "christma": 12039,
+ "christmas": 18174,
+ "christmas": 1677,
+ "christmaseve": 44381,
+ "christmass": 44873,
+ "christop": 7917,
+ "christoph": 47844,
+ "christophe": 45486,
+ "christopher": 33349,
+ "christopher": 9630,
+ "christy": 28331,
+ "chro": 13207,
+ "chromatic": 44207,
+ "chrome": 24843,
+ "chrome": 9529,
+ "chromo": 35809,
+ "chron": 5577,
+ "chron": 39781,
+ "chronic": 10115,
+ "chronic": 13677,
+ "chronicle": 20034,
+ "chronicles": 18905,
+ "chrono": 29387,
+ "chronograph": 38397,
+ "chry": 13508,
+ "chrysler": 20078,
+ "chs": 40277,
+ "chs": 8391,
+ "chsnews": 44919,
+ "cht": 11384,
+ "chter": 47811,
+ "chu": 3799,
+ "chu": 13622,
+ "chubby": 29109,
+ "chuck": 13211,
+ "chuck": 9894,
+ "chuckle": 35733,
+ "chucky": 42026,
+ "chuffed": 27233,
+ "chuk": 25878,
+ "chuk": 27221,
+ "chul": 33001,
+ "chum": 46869,
+ "chum": 41767,
+ "chun": 14693,
+ "chun": 25391,
+ "chung": 28418,
+ "chunk": 30275,
+ "chunks": 45538,
+ "chunky": 27978,
+ "chups": 46331,
+ "chur": 2309,
+ "church": 14956,
+ "church": 2735,
+ "churches": 15539,
+ "churchill": 17527,
+ "chus": 36246,
+ "chut": 28788,
+ "chutney": 36261,
+ "chy": 15131,
+ "chy": 8096,
+ "chyna": 43398,
+ "châ": 48669,
+ "ci": 698,
+ "ci": 5798,
+ "cia": 4019,
+ "cial": 1143,
+ "cian": 32323,
+ "ciao": 37677,
+ "ciara": 31369,
+ "cible": 28873,
+ "cic": 14539,
+ "cic": 21517,
+ "cid": 27359,
+ "cide": 34178,
+ "cider": 13547,
+ "cides": 41326,
+ "cie": 19730,
+ "cier": 24067,
+ "cies": 6785,
+ "cif": 35698,
+ "cigar": 26031,
+ "cigar": 16525,
+ "cigare": 13044,
+ "cigarette": 18548,
+ "cigarettes": 22750,
+ "cigars": 20750,
+ "cii": 42408,
+ "cil": 9217,
+ "cil": 2998,
+ "cilan": 33998,
+ "cilantro": 34568,
+ "cili": 18977,
+ "ciliation": 25294,
+ "cim": 30021,
+ "cin": 2396,
+ "cin": 25367,
+ "cina": 39467,
+ "cincin": 13291,
+ "cincinnati": 14197,
+ "cinco": 25131,
+ "cincode": 40930,
+ "cincodemayo": 42542,
+ "cincy": 30015,
+ "cincy": 30286,
+ "cinde": 20660,
+ "cinderella": 21515,
+ "cindy": 34439,
+ "cindy": 18532,
+ "cine": 4015,
+ "cine": 27451,
+ "cinema": 38251,
+ "cinema": 6443,
+ "cinemas": 14845,
+ "cinematic": 25602,
+ "cinemato": 21919,
+ "cinematographer": 39059,
+ "cinematography": 33802,
+ "ciner": 39882,
+ "cing": 4014,
+ "cini": 25699,
+ "cinnam": 12768,
+ "cinnamon": 13460,
+ "cino": 18616,
+ "cio": 44584,
+ "cio": 9954,
+ "cion": 22024,
+ "ciones": 37155,
+ "cious": 38466,
+ "cip": 32884,
+ "cir": 2459,
+ "cir": 41135,
+ "circa": 10411,
+ "circle": 33574,
+ "circle": 7117,
+ "circles": 19411,
+ "circling": 46036,
+ "circu": 5143,
+ "circuit": 35583,
+ "circuit": 9801,
+ "circuits": 33260,
+ "circul": 16618,
+ "circular": 19733,
+ "circulare": 39525,
+ "circulareconomy": 39878,
+ "circulated": 46258,
+ "circulating": 42980,
+ "circulation": 27880,
+ "circum": 13406,
+ "circumstances": 18786,
+ "circus": 11833,
+ "cirque": 36049,
+ "cis": 9459,
+ "cis": 23513,
+ "cisco": 36689,
+ "cisco": 19290,
+ "cise": 19657,
+ "cisely": 33434,
+ "cision": 41957,
+ "cism": 24166,
+ "cist": 40906,
+ "cit": 4420,
+ "cit": 31294,
+ "citadel": 38036,
+ "citation": 33581,
+ "cite": 32641,
+ "cited": 25069,
+ "cites": 34490,
+ "citi": 4280,
+ "citi": 30270,
+ "cities": 5441,
+ "citing": 29088,
+ "citiz": 5816,
+ "citizen": 11720,
+ "citizen": 9814,
+ "citizens": 7949,
+ "citizenship": 17386,
+ "cito": 42636,
+ "citro": 27941,
+ "citroen": 35805,
+ "citrus": 17379,
+ "city": 5002,
+ "city": 1305,
+ "cityfc": 28751,
+ "cityo": 25709,
+ "cityof": 11595,
+ "cityscape": 40808,
+ "ciu": 39693,
+ "cius": 42559,
+ "civ": 40039,
+ "civic": 32240,
+ "civic": 11888,
+ "civil": 6923,
+ "civil": 6450,
+ "civilian": 21187,
+ "civilians": 18076,
+ "civilization": 22503,
+ "civilwar": 34524,
+ "ción": 44700,
+ "cj": 15238,
+ "cj": 15205,
+ "ck": 916,
+ "ck": 868,
+ "cke": 25224,
+ "cke": 40989,
+ "cked": 3441,
+ "cken": 25566,
+ "cker": 15509,
+ "cker": 4744,
+ "ckers": 37073,
+ "cket": 5525,
+ "ckett": 33899,
+ "ckey": 15029,
+ "ckey": 3657,
+ "cki": 36916,
+ "cki": 41055,
+ "cking": 4805,
+ "cko": 28818,
+ "cks": 2031,
+ "cky": 26229,
+ "cky": 3083,
+ "cl": 969,
+ "cl": 6482,
+ "cla": 940,
+ "cla": 20636,
+ "clad": 31606,
+ "cladding": 46411,
+ "clai": 29459,
+ "claim": 4290,
+ "claim": 6607,
+ "claimed": 9010,
+ "claiming": 15286,
+ "claims": 6852,
+ "clair": 31441,
+ "clair": 14039,
+ "claire": 20410,
+ "claire": 10460,
+ "clam": 13588,
+ "clam": 32598,
+ "clamation": 21793,
+ "clamp": 41501,
+ "clams": 38849,
+ "clan": 29252,
+ "clan": 14114,
+ "clancy": 37227,
+ "clans": 38279,
+ "clap": 30037,
+ "clap": 25546,
+ "clapham": 43619,
+ "clapton": 37683,
+ "clar": 3617,
+ "clara": 19468,
+ "clare": 18948,
+ "clare": 15927,
+ "claremont": 47789,
+ "clarence": 29320,
+ "clari": 15175,
+ "clarify": 37004,
+ "clarinet": 41178,
+ "clarity": 21323,
+ "clark": 13340,
+ "clark": 7521,
+ "clarke": 11548,
+ "clarkson": 25706,
+ "clas": 32003,
+ "clash": 38367,
+ "clash": 9359,
+ "clashes": 25193,
+ "clasico": 43567,
+ "class": 2876,
+ "class": 1874,
+ "classes": 6919,
+ "classi": 2507,
+ "classic": 9353,
+ "classic": 2713,
+ "classical": 22179,
+ "classical": 11355,
+ "classicalmusic": 27806,
+ "classiccar": 46906,
+ "classiccars": 21064,
+ "classics": 10634,
+ "classification": 26612,
+ "classified": 22056,
+ "classmate": 37090,
+ "classmates": 30062,
+ "classof": 25345,
+ "classroom": 9001,
+ "classrooms": 25768,
+ "classy": 11615,
+ "clau": 7526,
+ "claude": 17461,
+ "claudi": 39439,
+ "claudia": 21893,
+ "claudio": 31230,
+ "claus": 23317,
+ "clause": 26151,
+ "clave": 24111,
+ "claw": 49230,
+ "claw": 19106,
+ "claws": 29161,
+ "clay": 10402,
+ "clay": 8823,
+ "clays": 26128,
+ "clayton": 46445,
+ "clayton": 19413,
+ "clc": 31380,
+ "cle": 1321,
+ "cle": 2537,
+ "clean": 3572,
+ "clean": 3772,
+ "cleaned": 17468,
+ "cleanenergy": 43538,
+ "cleaner": 15619,
+ "cleaners": 33258,
+ "cleaning": 7210,
+ "cleanliness": 47886,
+ "cleans": 40827,
+ "cleanse": 28717,
+ "cleanser": 44170,
+ "cleansing": 25931,
+ "cleanup": 22353,
+ "clear": 4631,
+ "clear": 3143,
+ "clearance": 17959,
+ "cleared": 14880,
+ "clearer": 37031,
+ "clearing": 15481,
+ "clearly": 7767,
+ "clears": 29092,
+ "clearwater": 32124,
+ "cleary": 44342,
+ "cleats": 33486,
+ "cleavage": 44165,
+ "cled": 12827,
+ "clegg": 42915,
+ "clemens": 45896,
+ "clement": 22592,
+ "clement": 24714,
+ "clemente": 42461,
+ "clementine": 47112,
+ "clements": 49175,
+ "clemson": 38170,
+ "clemson": 19537,
+ "clen": 35547,
+ "cleo": 40344,
+ "cleop": 36287,
+ "cleopatra": 41212,
+ "cler": 11828,
+ "clergy": 42635,
+ "cleric": 43748,
+ "clerk": 22230,
+ "clermont": 47529,
+ "cles": 8077,
+ "cleve": 37599,
+ "clevel": 7701,
+ "cleveland": 30716,
+ "cleveland": 8430,
+ "clever": 30977,
+ "clever": 13385,
+ "clg": 47546,
+ "cli": 1503,
+ "clich": 44407,
+ "click": 16676,
+ "click": 3585,
+ "clicked": 29015,
+ "clicking": 26542,
+ "clicks": 31250,
+ "client": 48528,
+ "client": 7467,
+ "clients": 8114,
+ "clif": 13182,
+ "cliff": 23827,
+ "cliff": 10625,
+ "cliffe": 15170,
+ "clifford": 24226,
+ "cliffs": 20953,
+ "clifton": 23878,
+ "climat": 37283,
+ "climate": 7854,
+ "climate": 4589,
+ "climateaction": 31622,
+ "climatechange": 11055,
+ "climates": 46022,
+ "climax": 37033,
+ "climb": 7421,
+ "climb": 10649,
+ "climbed": 22528,
+ "climber": 36910,
+ "climbers": 47648,
+ "climbing": 9877,
+ "climbs": 29098,
+ "clin": 2879,
+ "clinch": 30404,
+ "clinched": 44064,
+ "cline": 37460,
+ "cling": 37068,
+ "cling": 4760,
+ "clinic": 7926,
+ "clinical": 35133,
+ "clinical": 9148,
+ "clinicians": 45866,
+ "clinics": 23330,
+ "clint": 37542,
+ "clint": 21160,
+ "clinton": 34403,
+ "clinton": 5820,
+ "clio": 46889,
+ "clip": 39712,
+ "clip": 9289,
+ "clipped": 45524,
+ "clipper": 42245,
+ "clippers": 23319,
+ "clipping": 47484,
+ "clips": 16594,
+ "clique": 34983,
+ "clive": 36086,
+ "clive": 21509,
+ "cll": 46091,
+ "cllr": 45743,
+ "cllr": 23034,
+ "clo": 1194,
+ "cloak": 36528,
+ "clock": 19878,
+ "clock": 6716,
+ "clocked": 49049,
+ "clocks": 25895,
+ "clockwise": 46150,
+ "clockwork": 42297,
+ "clon": 24477,
+ "clone": 22854,
+ "clones": 48047,
+ "clooney": 33161,
+ "clos": 48821,
+ "close": 10603,
+ "close": 2660,
+ "closed": 4552,
+ "closely": 13478,
+ "closer": 6377,
+ "closes": 11354,
+ "closest": 14975,
+ "closet": 14221,
+ "closeup": 35439,
+ "closing": 7101,
+ "closure": 13249,
+ "closures": 22923,
+ "cloth": 14559,
+ "clothes": 7080,
+ "clothing": 7425,
+ "clou": 4069,
+ "cloud": 12965,
+ "cloud": 3887,
+ "cloudcomputing": 41390,
+ "clouds": 6244,
+ "cloudy": 13106,
+ "clough": 42909,
+ "clover": 39574,
+ "clover": 22812,
+ "clow": 18386,
+ "clown": 15329,
+ "clowns": 30820,
+ "cls": 44251,
+ "clt": 29651,
+ "clt": 24236,
+ "clu": 996,
+ "club": 9642,
+ "club": 1736,
+ "clubbing": 48128,
+ "clubhouse": 26553,
+ "clubs": 9437,
+ "clue": 14994,
+ "clueless": 35350,
+ "clues": 23764,
+ "clusive": 41362,
+ "cluster": 15595,
+ "clusters": 33217,
+ "clut": 28507,
+ "clutch": 13953,
+ "clutter": 40804,
+ "cly": 12037,
+ "clyde": 39557,
+ "clyde": 18469,
+ "cm": 10190,
+ "cm": 3741,
+ "cma": 30554,
+ "cma": 31388,
+ "cmc": 45839,
+ "cmdr": 48250,
+ "cme": 34946,
+ "cmo": 24589,
+ "cmon": 42904,
+ "cmp": 46355,
+ "cms": 22520,
+ "cmt": 42727,
+ "cmu": 43046,
+ "cn": 3886,
+ "cn": 16200,
+ "cna": 48287,
+ "cnbc": 41242,
+ "cnbc": 24371,
+ "cnblue": 36018,
+ "cnc": 20571,
+ "cnet": 47487,
+ "cnews": 24319,
+ "cng": 41496,
+ "cnn": 22405,
+ "cnn": 8259,
+ "cns": 46095,
+ "cny": 31614,
+ "co": 622,
+ "co": 1320,
+ "coa": 29167,
+ "coach": 3275,
+ "coach": 2312,
+ "coached": 30228,
+ "coachella": 20222,
+ "coaches": 6924,
+ "coaching": 7766,
+ "coal": 10227,
+ "coal": 7919,
+ "coalition": 12920,
+ "coast": 6398,
+ "coast": 3720,
+ "coastal": 38246,
+ "coastal": 10852,
+ "coaster": 15944,
+ "coasters": 31548,
+ "coastguard": 40601,
+ "coastline": 27959,
+ "coasts": 42225,
+ "coat": 28869,
+ "coat": 7356,
+ "coated": 23401,
+ "coates": 36899,
+ "coating": 25369,
+ "coatings": 48706,
+ "coats": 18075,
+ "cob": 20140,
+ "cob": 32863,
+ "cobain": 36866,
+ "cobalt": 30896,
+ "cobb": 22719,
+ "cobble": 47894,
+ "cobra": 21574,
+ "coc": 23036,
+ "coc": 39498,
+ "coca": 21197,
+ "cocac": 26393,
+ "cocacola": 31248,
+ "cocaine": 20534,
+ "coch": 18599,
+ "cochran": 48798,
+ "cochrane": 41752,
+ "coco": 11850,
+ "coco": 13316,
+ "cocoa": 18074,
+ "cocon": 8597,
+ "coconut": 9581,
+ "cod": 16132,
+ "cod": 11915,
+ "code": 11582,
+ "code": 3217,
+ "coded": 33703,
+ "coden": 43914,
+ "coder": 41561,
+ "codes": 14566,
+ "codi": 39711,
+ "coding": 12647,
+ "cody": 23222,
+ "cody": 12666,
+ "coe": 15386,
+ "coed": 41028,
+ "coel": 45633,
+ "coer": 41198,
+ "coeur": 44986,
+ "coffe": 2255,
+ "coffee": 12898,
+ "coffee": 2453,
+ "coffees": 41184,
+ "coffey": 48066,
+ "cofficial": 18757,
+ "coffin": 29907,
+ "cog": 26362,
+ "cog": 35960,
+ "cogn": 12210,
+ "cognac": 44361,
+ "cognition": 46825,
+ "cognitive": 16584,
+ "cohe": 20669,
+ "cohen": 13381,
+ "coherent": 48450,
+ "cohort": 22782,
+ "coil": 25307,
+ "coim": 41528,
+ "coin": 14651,
+ "coin": 4170,
+ "coinci": 14015,
+ "coincidence": 19807,
+ "coins": 10530,
+ "coke": 39602,
+ "coke": 14035,
+ "col": 754,
+ "col": 9371,
+ "cola": 15444,
+ "colbert": 31647,
+ "colby": 32068,
+ "colchester": 31715,
+ "cold": 11146,
+ "cold": 3153,
+ "colder": 23859,
+ "coldest": 31438,
+ "coldplay": 27770,
+ "cole": 9305,
+ "cole": 8166,
+ "coleman": 15774,
+ "coles": 40265,
+ "coles": 30398,
+ "coli": 18877,
+ "coli": 15910,
+ "colin": 20989,
+ "colin": 10238,
+ "coliseum": 21836,
+ "coll": 25982,
+ "coll": 23898,
+ "colla": 2929,
+ "collab": 14013,
+ "collabor": 4437,
+ "collaborate": 21271,
+ "collaborated": 42265,
+ "collaborating": 25545,
+ "collaboration": 6642,
+ "collaborations": 36520,
+ "collaborative": 15841,
+ "collaborator": 48186,
+ "collaborators": 45901,
+ "collage": 11258,
+ "collagen": 36120,
+ "collap": 16881,
+ "collapse": 16520,
+ "collapsed": 25037,
+ "collapses": 43601,
+ "collar": 39662,
+ "collar": 13497,
+ "collateral": 44512,
+ "colle": 1801,
+ "colleague": 13067,
+ "colleagues": 8203,
+ "collec": 1733,
+ "collect": 10186,
+ "collected": 11980,
+ "collecti": 18530,
+ "collectible": 25680,
+ "collectibles": 21519,
+ "collecting": 10325,
+ "collection": 2548,
+ "collections": 12760,
+ "collective": 10162,
+ "collectively": 40687,
+ "collector": 13522,
+ "collectors": 20540,
+ "collects": 31576,
+ "colleen": 31020,
+ "college": 13512,
+ "college": 2229,
+ "colleges": 17357,
+ "collegi": 16311,
+ "collegiate": 18068,
+ "colli": 8262,
+ "collide": 27214,
+ "collie": 30611,
+ "collier": 35748,
+ "collin": 24056,
+ "collin": 32116,
+ "colling": 32319,
+ "collingwood": 45873,
+ "collins": 8684,
+ "collision": 15407,
+ "collo": 25115,
+ "colloqui": 37243,
+ "colloquium": 46514,
+ "collu": 25658,
+ "collusion": 33864,
+ "colo": 7300,
+ "colo": 27288,
+ "cologne": 22216,
+ "cology": 19187,
+ "colom": 8987,
+ "colombia": 12901,
+ "colombian": 28701,
+ "colombo": 33207,
+ "colon": 8280,
+ "colon": 29050,
+ "colonel": 22674,
+ "coloni": 22667,
+ "colonial": 16530,
+ "colonialism": 43385,
+ "colonies": 38738,
+ "colony": 18767,
+ "color": 4036,
+ "color": 3140,
+ "colorado": 34580,
+ "colorado": 6742,
+ "colorec": 41171,
+ "colored": 11775,
+ "colorful": 11444,
+ "colori": 28764,
+ "coloring": 17696,
+ "colorized": 46730,
+ "colors": 5389,
+ "colorstv": 28195,
+ "colorway": 44576,
+ "colossal": 40258,
+ "colosse": 48142,
+ "colossus": 34022,
+ "colour": 10240,
+ "colour": 4769,
+ "coloured": 17111,
+ "colourful": 15562,
+ "colouring": 31803,
+ "colours": 7626,
+ "cols": 35726,
+ "colt": 19726,
+ "colton": 32249,
+ "coltrane": 42333,
+ "colts": 16135,
+ "colum": 4164,
+ "columb": 31043,
+ "columbi": 25947,
+ "columbia": 9410,
+ "columbus": 11273,
+ "column": 10593,
+ "columnist": 28958,
+ "columns": 29056,
+ "com": 610,
+ "com": 2464,
+ "coma": 19620,
+ "comb": 3587,
+ "comb": 16380,
+ "combat": 35083,
+ "combat": 9275,
+ "combating": 46121,
+ "combe": 14363,
+ "combin": 25112,
+ "combination": 11312,
+ "combinations": 34950,
+ "combine": 12919,
+ "combined": 10427,
+ "combines": 22991,
+ "combining": 23561,
+ "combo": 10155,
+ "combos": 48117,
+ "combs": 30694,
+ "combu": 35629,
+ "combustion": 44654,
+ "comcast": 30043,
+ "come": 4225,
+ "come": 891,
+ "comeback": 8234,
+ "comedian": 13848,
+ "comedians": 33758,
+ "comedic": 43360,
+ "comedy": 19346,
+ "comedy": 4749,
+ "comer": 42997,
+ "comer": 20916,
+ "comers": 34436,
+ "comes": 2091,
+ "comet": 21405,
+ "comets": 40636,
+ "comey": 22957,
+ "comfor": 6563,
+ "comfort": 44000,
+ "comfort": 7808,
+ "comfortable": 8652,
+ "comfortably": 30392,
+ "comforting": 33835,
+ "comforts": 42243,
+ "comfy": 15736,
+ "comi": 40781,
+ "comic": 7729,
+ "comic": 4962,
+ "comicart": 46018,
+ "comicbook": 46564,
+ "comicbooks": 22018,
+ "comiccon": 18379,
+ "comicon": 43820,
+ "comics": 4256,
+ "comin": 18164,
+ "coming": 14916,
+ "coming": 1171,
+ "comingsoon": 19894,
+ "comm": 965,
+ "comm": 11413,
+ "comman": 39780,
+ "command": 18391,
+ "command": 11350,
+ "commander": 11265,
+ "commanders": 41667,
+ "commanding": 36933,
+ "commandments": 43409,
+ "commando": 31361,
+ "commands": 38163,
+ "comme": 29692,
+ "commemor": 9495,
+ "commemorate": 21242,
+ "commemorates": 45149,
+ "commemorating": 28734,
+ "commemoration": 29288,
+ "commemorative": 24623,
+ "commen": 15795,
+ "commence": 25059,
+ "commenced": 43908,
+ "commencement": 21666,
+ "commences": 48551,
+ "commend": 37555,
+ "commended": 40702,
+ "comment": 20035,
+ "comment": 5761,
+ "commentary": 14146,
+ "commentator": 32016,
+ "commented": 28328,
+ "commenting": 37292,
+ "comments": 6606,
+ "commer": 4028,
+ "commerce": 8333,
+ "commerci": 15601,
+ "commercial": 31802,
+ "commercial": 6287,
+ "commercials": 30724,
+ "commish": 45399,
+ "commissi": 6000,
+ "commission": 5292,
+ "commissioned": 16565,
+ "commissioner": 10221,
+ "commissioners": 30702,
+ "commissioning": 29585,
+ "commissions": 20668,
+ "commit": 3041,
+ "commit": 11797,
+ "commitment": 7770,
+ "commitments": 32136,
+ "commits": 20241,
+ "committed": 7907,
+ "committee": 5636,
+ "committees": 40504,
+ "committing": 21937,
+ "commod": 9496,
+ "commodities": 30350,
+ "commodity": 29041,
+ "commodore": 31129,
+ "common": 8414,
+ "common": 4176,
+ "commonly": 20344,
+ "commons": 16653,
+ "commonwealth": 16569,
+ "comms": 18832,
+ "commu": 9561,
+ "commun": 1515,
+ "communal": 32809,
+ "communi": 16164,
+ "communic": 4784,
+ "communicate": 19809,
+ "communication": 7999,
+ "communications": 10052,
+ "communion": 28579,
+ "communism": 35387,
+ "communist": 18602,
+ "communities": 6361,
+ "community": 14784,
+ "community": 1927,
+ "commute": 15898,
+ "commuter": 27782,
+ "commuters": 30823,
+ "commuting": 43503,
+ "como": 16236,
+ "comp": 2561,
+ "comp": 11679,
+ "compac": 40014,
+ "compact": 13690,
+ "compan": 1995,
+ "companies": 5361,
+ "companion": 14963,
+ "companions": 37124,
+ "company": 2634,
+ "compar": 7580,
+ "comparable": 27092,
+ "comparative": 33388,
+ "compare": 13771,
+ "compared": 10544,
+ "compares": 25104,
+ "comparing": 20564,
+ "comparison": 14186,
+ "comparisons": 40870,
+ "compart": 30072,
+ "compartment": 40383,
+ "compass": 19438,
+ "compassion": 14463,
+ "compassionate": 30193,
+ "compati": 17295,
+ "compatibility": 41614,
+ "compatible": 21286,
+ "compe": 5254,
+ "compelled": 49375,
+ "compelling": 21766,
+ "compen": 42079,
+ "compens": 15172,
+ "compensation": 18663,
+ "compet": 2932,
+ "compete": 10038,
+ "competed": 27767,
+ "competen": 31853,
+ "competence": 31165,
+ "competency": 49293,
+ "competent": 28113,
+ "competes": 39826,
+ "competing": 13068,
+ "competit": 15892,
+ "competiti": 32581,
+ "competition": 3742,
+ "competitions": 23259,
+ "competitive": 10687,
+ "competitiveness": 43209,
+ "competitor": 26633,
+ "competitors": 23638,
+ "compilation": 20446,
+ "compiled": 34579,
+ "compla": 7428,
+ "complain": 19292,
+ "complained": 42029,
+ "complaining": 20812,
+ "complains": 46363,
+ "complaint": 20391,
+ "complaints": 20020,
+ "comple": 1730,
+ "complement": 36624,
+ "complementary": 48953,
+ "complete": 3263,
+ "completed": 5976,
+ "completely": 5989,
+ "completes": 19321,
+ "completing": 14949,
+ "completion": 15915,
+ "complex": 16099,
+ "complex": 6324,
+ "complexes": 47870,
+ "complexion": 47732,
+ "complexity": 24815,
+ "compli": 5270,
+ "compliance": 14658,
+ "compliant": 29893,
+ "complic": 11460,
+ "complicated": 16621,
+ "complications": 29936,
+ "compliment": 25116,
+ "complimentary": 20948,
+ "compliments": 25477,
+ "comply": 36281,
+ "component": 21284,
+ "components": 16816,
+ "compos": 7783,
+ "compose": 43659,
+ "composed": 19916,
+ "composer": 12104,
+ "composers": 33314,
+ "composing": 40412,
+ "composite": 21606,
+ "composites": 45395,
+ "composition": 17510,
+ "compositions": 44652,
+ "compost": 46002,
+ "compost": 33307,
+ "compound": 19980,
+ "compounds": 33991,
+ "compre": 8483,
+ "compreh": 42976,
+ "comprehen": 12050,
+ "comprehend": 48230,
+ "comprehensive": 13854,
+ "compress": 33353,
+ "compressed": 42359,
+ "compression": 25638,
+ "compressor": 39607,
+ "compri": 29445,
+ "compromise": 26611,
+ "compromised": 38576,
+ "compromising": 45436,
+ "comps": 48665,
+ "compton": 28364,
+ "compu": 11639,
+ "compul": 25869,
+ "compulsory": 39345,
+ "computing": 12732,
+ "comra": 25553,
+ "comrade": 30844,
+ "comrades": 29282,
+ "coms": 30493,
+ "con": 616,
+ "con": 2457,
+ "cona": 30605,
+ "conan": 24750,
+ "conce": 9145,
+ "concealed": 35419,
+ "conceded": 37895,
+ "conceived": 39725,
+ "concentr": 11085,
+ "concentrate": 30846,
+ "concentrated": 36776,
+ "concentration": 18565,
+ "concep": 8389,
+ "concepcion": 47035,
+ "concept": 6353,
+ "conceptart": 31162,
+ "conception": 30510,
+ "conceptions": 40307,
+ "concepts": 16763,
+ "conceptu": 42745,
+ "conceptual": 34070,
+ "concer": 2228,
+ "concern": 12928,
+ "concerned": 12020,
+ "concerning": 21772,
+ "concerns": 11134,
+ "concert": 32180,
+ "concert": 3066,
+ "concerto": 24710,
+ "concerts": 14418,
+ "concession": 38117,
+ "concessions": 43981,
+ "concier": 28859,
+ "concierge": 39850,
+ "conclave": 38098,
+ "conclu": 9627,
+ "conclude": 37525,
+ "concluded": 27825,
+ "concludes": 30634,
+ "conclusion": 20932,
+ "conclusions": 39507,
+ "conco": 43034,
+ "concor": 19913,
+ "concord": 26448,
+ "concordia": 35492,
+ "concours": 36282,
+ "concourse": 37793,
+ "concre": 43658,
+ "concrete": 9637,
+ "concussion": 28321,
+ "condem": 13287,
+ "condemn": 27212,
+ "condemned": 35145,
+ "condemns": 32092,
+ "conden": 24816,
+ "conditi": 11170,
+ "condition": 36978,
+ "condition": 7336,
+ "conditional": 24671,
+ "conditioned": 37014,
+ "conditioner": 31239,
+ "conditioning": 18181,
+ "conditions": 5892,
+ "condo": 19952,
+ "condol": 18661,
+ "condolences": 20836,
+ "condom": 39021,
+ "condomin": 42589,
+ "condoms": 37878,
+ "condor": 47643,
+ "condos": 42342,
+ "condu": 40772,
+ "conduc": 5379,
+ "conduct": 11647,
+ "conducted": 13080,
+ "conducting": 16787,
+ "conductor": 22317,
+ "conducts": 32084,
+ "cone": 39279,
+ "cone": 10266,
+ "cones": 26718,
+ "coney": 41837,
+ "conf": 6477,
+ "confe": 1968,
+ "confeder": 17104,
+ "confederate": 24864,
+ "confederation": 43484,
+ "conferen": 37961,
+ "conference": 2230,
+ "conferences": 22811,
+ "conferencing": 47320,
+ "confess": 38860,
+ "confession": 22572,
+ "confessions": 29404,
+ "confetti": 37923,
+ "confi": 5005,
+ "confidence": 8510,
+ "confident": 12365,
+ "confidential": 28712,
+ "configu": 46746,
+ "configur": 26950,
+ "configuration": 33378,
+ "confin": 45316,
+ "confined": 40973,
+ "confir": 3930,
+ "confirm": 12130,
+ "confirmation": 19645,
+ "confirmed": 6346,
+ "confirming": 38433,
+ "confirms": 11803,
+ "confis": 36285,
+ "confit": 42241,
+ "confl": 8173,
+ "conflic": 19029,
+ "conflict": 10397,
+ "conflicting": 43894,
+ "conflicts": 28713,
+ "confor": 40933,
+ "confron": 20033,
+ "confront": 38382,
+ "confrontation": 41478,
+ "confu": 6890,
+ "confuse": 37503,
+ "confused": 10946,
+ "confusing": 24683,
+ "confusion": 20493,
+ "cong": 24407,
+ "conge": 20013,
+ "congestion": 24432,
+ "congo": 20334,
+ "congr": 1227,
+ "congrats": 1887,
+ "congratul": 1750,
+ "congratulate": 16633,
+ "congratulated": 42004,
+ "congratulates": 24580,
+ "congratulating": 30967,
+ "congratulation": 24751,
+ "congratulations": 1864,
+ "congre": 7947,
+ "congreg": 40727,
+ "congregation": 32618,
+ "congress": 12452,
+ "congress": 4599,
+ "congressional": 15239,
+ "congressman": 17145,
+ "congresswoman": 37317,
+ "coni": 39031,
+ "coni": 36651,
+ "conj": 41543,
+ "conju": 33821,
+ "conjunction": 34226,
+ "conley": 44536,
+ "conline": 37593,
+ "conn": 41836,
+ "conn": 20329,
+ "conne": 8437,
+ "connec": 29933,
+ "connect": 19969,
+ "connected": 27506,
+ "connecting": 41429,
+ "connection": 26840,
+ "connections": 37161,
+ "connie": 25739,
+ "connoisse": 46012,
+ "connol": 27739,
+ "connolly": 29537,
+ "connor": 21984,
+ "connor": 10218,
+ "conom": 2664,
+ "conomy": 22529,
+ "conor": 29955,
+ "conor": 19478,
+ "conqu": 13382,
+ "conquer": 38585,
+ "conquer": 19821,
+ "conquered": 27099,
+ "conquering": 43778,
+ "conquest": 35367,
+ "conrad": 22073,
+ "cons": 10311,
+ "consci": 9427,
+ "conscience": 27310,
+ "conscious": 14914,
+ "consciously": 46755,
+ "consciousness": 17894,
+ "conse": 34887,
+ "consecu": 12084,
+ "consecutive": 12413,
+ "consen": 23110,
+ "consensus": 25071,
+ "consent": 21922,
+ "consequ": 13003,
+ "consequence": 42262,
+ "consequences": 15682,
+ "conserv": 4649,
+ "conservancy": 46729,
+ "conservation": 37616,
+ "conservation": 8322,
+ "conservative": 11421,
+ "conservatives": 17631,
+ "conservatory": 32140,
+ "conserve": 34231,
+ "consi": 2899,
+ "consider": 12471,
+ "consider": 6734,
+ "considerable": 38256,
+ "considerably": 38510,
+ "consideration": 24310,
+ "considerations": 33700,
+ "considered": 9487,
+ "considering": 10761,
+ "considers": 24691,
+ "consist": 10410,
+ "consist": 33735,
+ "consisted": 49354,
+ "consistency": 25683,
+ "consistent": 16439,
+ "consistently": 23799,
+ "consisting": 39241,
+ "consists": 23458,
+ "consol": 27869,
+ "consolation": 38888,
+ "console": 13403,
+ "consoles": 33136,
+ "consoli": 21586,
+ "consolidation": 41111,
+ "consor": 27108,
+ "consortium": 29988,
+ "conspir": 12680,
+ "conspiracy": 15236,
+ "const": 3826,
+ "constable": 29179,
+ "constan": 38718,
+ "constance": 40682,
+ "constant": 32000,
+ "constant": 13111,
+ "constantine": 30640,
+ "constantly": 14336,
+ "constell": 21913,
+ "constellation": 25991,
+ "constitu": 6299,
+ "constituency": 22464,
+ "constituents": 32075,
+ "constitution": 12157,
+ "constitutional": 16091,
+ "constra": 28973,
+ "constraints": 41910,
+ "constru": 3983,
+ "construc": 13321,
+ "construct": 24467,
+ "constructed": 16876,
+ "constructing": 33653,
+ "construction": 48873,
+ "construction": 4585,
+ "constructive": 31810,
+ "consu": 4689,
+ "consul": 5295,
+ "consul": 33630,
+ "consulate": 34341,
+ "consult": 9438,
+ "consult": 26727,
+ "consultancy": 31735,
+ "consultant": 14196,
+ "consultants": 27203,
+ "consultation": 15777,
+ "consultations": 43424,
+ "consulting": 15883,
+ "consume": 28919,
+ "consumed": 29653,
+ "consumer": 34408,
+ "consumer": 10422,
+ "consumers": 14014,
+ "consuming": 30607,
+ "consumption": 14904,
+ "cont": 2036,
+ "cont": 21425,
+ "contact": 39367,
+ "contact": 3523,
+ "contacted": 37331,
+ "contacts": 22789,
+ "contag": 29259,
+ "contagious": 33984,
+ "contain": 9948,
+ "contain": 15187,
+ "contained": 23836,
+ "container": 14913,
+ "containers": 20448,
+ "containing": 20281,
+ "contains": 12844,
+ "contamin": 24662,
+ "contaminated": 35773,
+ "contamination": 31770,
+ "conte": 15402,
+ "conte": 26882,
+ "contempl": 21924,
+ "contemplating": 33854,
+ "contempor": 14538,
+ "contemporary": 16607,
+ "contemporary": 8859,
+ "contemporaryart": 20212,
+ "contempt": 39293,
+ "conten": 42201,
+ "contender": 23573,
+ "contenders": 29711,
+ "content": 15526,
+ "content": 4750,
+ "contentmarketing": 20429,
+ "contents": 14850,
+ "contest": 23103,
+ "contest": 4576,
+ "contestalert": 27313,
+ "contestant": 25682,
+ "contestants": 28062,
+ "contested": 37845,
+ "contests": 32210,
+ "contex": 42015,
+ "context": 13089,
+ "conti": 46431,
+ "conti": 40842,
+ "contin": 1918,
+ "continent": 19623,
+ "continental": 14089,
+ "continents": 38642,
+ "conting": 27104,
+ "contingent": 36467,
+ "continu": 4688,
+ "continually": 34086,
+ "continuation": 38964,
+ "continue": 3942,
+ "continued": 10150,
+ "continues": 4305,
+ "continuing": 11009,
+ "continuity": 34035,
+ "continuous": 17033,
+ "continuously": 29634,
+ "continuum": 44978,
+ "contour": 34733,
+ "contr": 22871,
+ "contra": 9880,
+ "contra": 38620,
+ "contrac": 7581,
+ "contracep": 35109,
+ "contract": 6120,
+ "contracting": 39091,
+ "contractor": 21429,
+ "contractors": 22427,
+ "contracts": 16563,
+ "contradic": 27957,
+ "contrary": 32805,
+ "contrast": 18501,
+ "contrasting": 40758,
+ "contribu": 4753,
+ "contribute": 14112,
+ "contributed": 19397,
+ "contributes": 34203,
+ "contributing": 21762,
+ "contribution": 11116,
+ "contributions": 14465,
+ "contributor": 24553,
+ "contributors": 32908,
+ "contro": 2372,
+ "control": 9963,
+ "control": 3366,
+ "controlled": 14140,
+ "controller": 12929,
+ "controllers": 30374,
+ "controlling": 26427,
+ "controls": 15746,
+ "controversi": 13674,
+ "controversial": 14617,
+ "controversy": 18659,
+ "conv": 48382,
+ "conve": 18421,
+ "conven": 7283,
+ "conveni": 33278,
+ "convenience": 17859,
+ "convenient": 18978,
+ "conveniently": 40844,
+ "convention": 6752,
+ "conventional": 20835,
+ "conventions": 41404,
+ "conver": 6336,
+ "convergence": 35381,
+ "convers": 4577,
+ "conversation": 5690,
+ "conversations": 12326,
+ "converse": 24149,
+ "conversion": 15111,
+ "conversions": 44137,
+ "convert": 20074,
+ "converted": 20808,
+ "converter": 34611,
+ "convertible": 19608,
+ "converting": 34674,
+ "converts": 42470,
+ "convey": 38342,
+ "convic": 11150,
+ "convicted": 18668,
+ "conviction": 24967,
+ "convictions": 44366,
+ "convin": 12889,
+ "convince": 20351,
+ "convinced": 17388,
+ "convincing": 27742,
+ "convo": 19372,
+ "convocation": 30674,
+ "convos": 44842,
+ "convoy": 30292,
+ "conway": 21410,
+ "conwy": 48971,
+ "cony": 14501,
+ "coo": 1664,
+ "coo": 21691,
+ "coogs": 47624,
+ "cook": 9726,
+ "cook": 5977,
+ "cookbook": 21086,
+ "cooke": 29979,
+ "cooked": 11452,
+ "cooker": 23806,
+ "cookery": 38779,
+ "cookie": 9367,
+ "cookies": 8320,
+ "cookin": 46610,
+ "cooking": 39248,
+ "cooking": 6283,
+ "cookout": 39743,
+ "cooks": 24256,
+ "cool": 5594,
+ "cool": 2077,
+ "cooled": 37170,
+ "cooler": 11078,
+ "coolest": 10566,
+ "cooling": 15291,
+ "coom": 41726,
+ "coon": 34260,
+ "coon": 16958,
+ "coop": 39917,
+ "coop": 18910,
+ "cooper": 7264,
+ "cooper": 8133,
+ "cooperate": 42936,
+ "cooperation": 11785,
+ "cooperative": 24517,
+ "coops": 48531,
+ "coordin": 8187,
+ "coordinate": 38250,
+ "coordinated": 32540,
+ "coordinating": 40075,
+ "coordination": 25611,
+ "coordinator": 13967,
+ "coors": 36025,
+ "cop": 3196,
+ "cop": 7070,
+ "copa": 22749,
+ "copd": 45876,
+ "cope": 47635,
+ "cope": 12564,
+ "copeland": 37604,
+ "copen": 15637,
+ "copenhagen": 17390,
+ "coper": 41891,
+ "copernic": 45519,
+ "copied": 36770,
+ "copies": 9851,
+ "coping": 30545,
+ "copolitics": 45846,
+ "copp": 20937,
+ "copped": 42229,
+ "copper": 24741,
+ "copper": 10333,
+ "coppola": 47427,
+ "cops": 10719,
+ "copter": 28049,
+ "copy": 11376,
+ "copy": 4509,
+ "copying": 38925,
+ "copyright": 15778,
+ "cor": 851,
+ "cor": 18559,
+ "cora": 34953,
+ "coral": 31220,
+ "coral": 12054,
+ "corbett": 35699,
+ "corbin": 35578,
+ "corbyn": 14026,
+ "cord": 40893,
+ "cord": 11181,
+ "corden": 41999,
+ "cordi": 41681,
+ "cordless": 44412,
+ "cords": 22164,
+ "core": 19622,
+ "core": 5000,
+ "cores": 37874,
+ "corey": 31279,
+ "corey": 15288,
+ "corgi": 31320,
+ "cori": 26508,
+ "coriander": 37491,
+ "corin": 17716,
+ "corinthians": 34471,
+ "cork": 18148,
+ "cork": 10376,
+ "corn": 5202,
+ "corn": 5894,
+ "cornelius": 45865,
+ "cornell": 38689,
+ "cornell": 20859,
+ "corner": 18509,
+ "corner": 5253,
+ "corners": 19584,
+ "cornerstone": 36280,
+ "cornish": 23774,
+ "cornwall": 37903,
+ "cornwall": 10777,
+ "coron": 13210,
+ "corona": 25564,
+ "coronado": 43946,
+ "coronary": 45955,
+ "coronation": 25014,
+ "coroner": 47241,
+ "corp": 29203,
+ "corp": 10918,
+ "corpor": 4258,
+ "corporal": 42445,
+ "corporate": 33877,
+ "corporate": 6838,
+ "corporation": 11282,
+ "corporations": 25482,
+ "corps": 11330,
+ "corpse": 29408,
+ "corpus": 31672,
+ "correc": 5011,
+ "correct": 8340,
+ "corrected": 35628,
+ "correction": 20843,
+ "correctional": 38030,
+ "corrections": 37507,
+ "correctly": 15359,
+ "correlation": 29218,
+ "correspon": 20203,
+ "correspondent": 29996,
+ "corri": 12974,
+ "corridor": 20592,
+ "corrie": 23961,
+ "corro": 24936,
+ "corro": 42033,
+ "corrosion": 39191,
+ "corru": 6501,
+ "corrup": 30429,
+ "corrupt": 15194,
+ "corruption": 9141,
+ "corsa": 47670,
+ "corsair": 42367,
+ "corset": 40408,
+ "cortex": 40109,
+ "cortez": 30461,
+ "corvette": 24367,
+ "cory": 23221,
+ "cory": 18329,
+ "cos": 5865,
+ "cos": 5700,
+ "cosby": 30324,
+ "cosc": 45944,
+ "coscino": 47909,
+ "cose": 26495,
+ "cosm": 37486,
+ "cosme": 9628,
+ "cosmetic": 23918,
+ "cosmetics": 12896,
+ "cosmic": 47398,
+ "cosmic": 18304,
+ "cosmo": 12829,
+ "cosmo": 32072,
+ "cosmopolitan": 35518,
+ "cosmos": 22151,
+ "cospla": 15149,
+ "cosplay": 42401,
+ "cosplay": 6435,
+ "cosplayer": 30215,
+ "cosplaying": 46701,
+ "cost": 11360,
+ "cost": 4713,
+ "costa": 10480,
+ "costar": 28659,
+ "costarica": 31272,
+ "costco": 31045,
+ "costello": 30667,
+ "costing": 39193,
+ "costly": 30170,
+ "costs": 7628,
+ "costu": 5786,
+ "costume": 7235,
+ "costumes": 15150,
+ "cosy": 22848,
+ "cot": 4718,
+ "cot": 5871,
+ "cote": 44234,
+ "cote": 20751,
+ "cotland": 32576,
+ "cotsw": 23303,
+ "cotswolds": 35546,
+ "cott": 8211,
+ "cott": 11349,
+ "cottage": 12155,
+ "cottages": 34405,
+ "cotton": 22218,
+ "cotton": 7050,
+ "cou": 1368,
+ "couch": 12724,
+ "cougar": 35028,
+ "cougar": 27042,
+ "cougars": 20425,
+ "cough": 35631,
+ "cough": 18498,
+ "cougs": 28482,
+ "coul": 22483,
+ "could": 44812,
+ "could": 1510,
+ "couldn": 4072,
+ "couldnt": 29042,
+ "coulter": 42291,
+ "coun": 939,
+ "counc": 12927,
+ "council": 18187,
+ "council": 3620,
+ "councill": 15732,
+ "councillor": 21179,
+ "councillors": 29695,
+ "councilman": 40833,
+ "councils": 29938,
+ "counsel": 13780,
+ "counsel": 19814,
+ "counseling": 25000,
+ "counsell": 47510,
+ "counselling": 40581,
+ "counselor": 26148,
+ "counselors": 38688,
+ "count": 6073,
+ "count": 5887,
+ "countdown": 39559,
+ "countdown": 7500,
+ "counted": 23149,
+ "counter": 10134,
+ "counter": 7352,
+ "counterfe": 33067,
+ "counterfeit": 44242,
+ "counterpart": 39216,
+ "counterparts": 42106,
+ "counters": 46170,
+ "countess": 46276,
+ "counties": 12338,
+ "counting": 9723,
+ "countless": 21819,
+ "countries": 5489,
+ "country": 7896,
+ "country": 2157,
+ "countryfile": 47023,
+ "countrymusic": 30372,
+ "countryside": 16303,
+ "counts": 12264,
+ "county": 18734,
+ "county": 2116,
+ "coup": 9871,
+ "coup": 16479,
+ "coupe": 16773,
+ "couple": 40136,
+ "couple": 3377,
+ "coupled": 37153,
+ "couples": 14752,
+ "coupling": 45595,
+ "coupon": 14019,
+ "coupons": 23945,
+ "cour": 1391,
+ "coura": 4436,
+ "courage": 9828,
+ "courageous": 25005,
+ "courier": 27217,
+ "cours": 21493,
+ "course": 43225,
+ "course": 2613,
+ "courses": 9464,
+ "court": 16837,
+ "court": 2908,
+ "courte": 5088,
+ "courtesy": 5228,
+ "courthouse": 22205,
+ "courtney": 33601,
+ "courtney": 15990,
+ "courtroom": 41071,
+ "courts": 13514,
+ "courty": 20121,
+ "courtyard": 21900,
+ "cous": 48397,
+ "cousin": 7780,
+ "cousins": 14073,
+ "cout": 29118,
+ "coutinho": 35530,
+ "couture": 14808,
+ "cov": 19384,
+ "cov": 48385,
+ "cove": 21700,
+ "cove": 14708,
+ "coven": 12483,
+ "covenant": 29647,
+ "coventry": 18007,
+ "cover": 13534,
+ "cover": 2202,
+ "coverage": 6810,
+ "covered": 5603,
+ "covering": 9462,
+ "covers": 7745,
+ "covert": 40134,
+ "coveted": 36119,
+ "covington": 43196,
+ "cow": 5076,
+ "cow": 9706,
+ "cowan": 42699,
+ "coward": 33729,
+ "cowards": 48972,
+ "cowboy": 25833,
+ "cowboy": 13657,
+ "cowboys": 11864,
+ "cowboysnation": 43082,
+ "cowell": 39015,
+ "cowgirl": 47090,
+ "coworker": 30727,
+ "coworkers": 30821,
+ "coworking": 36034,
+ "cows": 15204,
+ "cowx": 23831,
+ "cox": 25784,
+ "cox": 11597,
+ "coy": 12765,
+ "coy": 15742,
+ "coyi": 48407,
+ "coyle": 45348,
+ "coyne": 44729,
+ "coyo": 16614,
+ "coyote": 26586,
+ "coyotes": 30423,
+ "coys": 19736,
+ "coz": 39922,
+ "coz": 14282,
+ "cozy": 14873,
+ "cp": 7905,
+ "cp": 9130,
+ "cpa": 30095,
+ "cpac": 45731,
+ "cpc": 26125,
+ "cpd": 23402,
+ "cpec": 48007,
+ "cpfc": 27553,
+ "cpi": 41795,
+ "cpl": 26852,
+ "cpr": 25134,
+ "cps": 27078,
+ "cpt": 32892,
+ "cpu": 27700,
+ "cq": 48910,
+ "cq": 48417,
+ "cr": 1075,
+ "cr": 3483,
+ "cra": 1184,
+ "cra": 18362,
+ "crab": 27382,
+ "crab": 11574,
+ "crabs": 30908,
+ "crack": 11222,
+ "crack": 10334,
+ "crackdown": 29527,
+ "cracked": 19826,
+ "cracker": 16298,
+ "crackers": 26200,
+ "cracking": 13008,
+ "cracks": 21426,
+ "cracy": 24749,
+ "cradle": 29384,
+ "crae": 40438,
+ "craf": 10873,
+ "craft": 7717,
+ "craft": 3588,
+ "craftbeer": 12371,
+ "crafted": 12424,
+ "crafthour": 42324,
+ "crafting": 26886,
+ "crafts": 33276,
+ "crafts": 13383,
+ "craftsman": 39528,
+ "craftsmanship": 36682,
+ "crafty": 32317,
+ "craic": 46962,
+ "craig": 14042,
+ "craig": 8061,
+ "craigslist": 43865,
+ "cram": 29809,
+ "cramer": 44592,
+ "cramps": 46106,
+ "cran": 7761,
+ "cranberries": 49361,
+ "cranberry": 23824,
+ "crane": 14626,
+ "cranes": 26979,
+ "crani": 45674,
+ "crank": 46246,
+ "crank": 32283,
+ "cranston": 44340,
+ "crap": 11899,
+ "crappy": 30475,
+ "crash": 37150,
+ "crash": 5033,
+ "crashed": 16638,
+ "crashes": 17013,
+ "crashing": 24991,
+ "crat": 46696,
+ "crate": 24756,
+ "crater": 22663,
+ "crates": 30172,
+ "cratic": 32175,
+ "crative": 39999,
+ "crats": 43056,
+ "crave": 33397,
+ "craven": 33625,
+ "craving": 18344,
+ "cravings": 34476,
+ "craw": 7400,
+ "crawfish": 42772,
+ "crawford": 15918,
+ "crawl": 20106,
+ "crawler": 41012,
+ "crawley": 42316,
+ "crawling": 37066,
+ "cray": 24184,
+ "cray": 27032,
+ "crayon": 41801,
+ "crayons": 43508,
+ "craz": 25776,
+ "craze": 30637,
+ "craziest": 32690,
+ "craziness": 46436,
+ "crazy": 17540,
+ "crazy": 3578,
+ "crc": 25618,
+ "cre": 798,
+ "cre": 17762,
+ "cream": 23184,
+ "cream": 3867,
+ "creams": 41447,
+ "creamy": 17206,
+ "crease": 48441,
+ "create": 30949,
+ "create": 3380,
+ "created": 4080,
+ "creates": 10361,
+ "creati": 6714,
+ "creating": 5524,
+ "creation": 38293,
+ "creation": 6900,
+ "creations": 17411,
+ "creative": 15237,
+ "creative": 4450,
+ "creatives": 29352,
+ "creativity": 9636,
+ "creator": 10173,
+ "creators": 17981,
+ "creature": 14317,
+ "creatures": 13938,
+ "cred": 7314,
+ "cred": 22377,
+ "credenti": 29487,
+ "credentials": 33422,
+ "credi": 21097,
+ "credibility": 34984,
+ "credible": 32983,
+ "credit": 21467,
+ "credit": 3900,
+ "credited": 32480,
+ "credits": 10654,
+ "creds": 43462,
+ "cree": 33961,
+ "cree": 36014,
+ "creed": 18845,
+ "creek": 26120,
+ "creek": 5526,
+ "creep": 8153,
+ "creep": 26084,
+ "creeper": 38662,
+ "creeping": 29697,
+ "creeps": 45135,
+ "creepy": 11943,
+ "creighton": 42823,
+ "creme": 22681,
+ "creole": 45632,
+ "crepe": 38611,
+ "crescent": 18211,
+ "cress": 39124,
+ "crest": 35985,
+ "crest": 15760,
+ "crested": 36656,
+ "crete": 8584,
+ "crew": 21560,
+ "crew": 3462,
+ "crewe": 43284,
+ "crews": 10463,
+ "cri": 1621,
+ "cri": 38962,
+ "crib": 23271,
+ "cric": 4328,
+ "cricke": 19098,
+ "cricket": 21859,
+ "cricket": 5373,
+ "cricketer": 28439,
+ "cricketers": 43986,
+ "cried": 15290,
+ "cries": 19769,
+ "crime": 13872,
+ "crime": 4896,
+ "crimea": 28614,
+ "crimes": 11827,
+ "crimin": 5874,
+ "criminal": 30197,
+ "criminal": 8255,
+ "criminals": 18783,
+ "crimson": 19437,
+ "cringe": 42588,
+ "cripp": 33588,
+ "cris": 37818,
+ "crises": 36403,
+ "crisis": 5712,
+ "crisp": 15145,
+ "crispr": 39784,
+ "crisps": 35744,
+ "crispy": 16458,
+ "criss": 29708,
+ "cristi": 12699,
+ "cristian": 48808,
+ "cristiano": 14807,
+ "cristina": 33395,
+ "cristo": 38315,
+ "crit": 3613,
+ "crit": 48130,
+ "criteri": 33627,
+ "criteria": 24849,
+ "criterion": 43841,
+ "criti": 25333,
+ "critic": 12417,
+ "critic": 19361,
+ "critical": 15314,
+ "critical": 6808,
+ "critically": 21570,
+ "criticalrole": 33606,
+ "criticalrole": 22742,
+ "criticalrolefanart": 43663,
+ "critici": 20333,
+ "criticism": 17405,
+ "criticize": 46081,
+ "criticized": 41557,
+ "critics": 16946,
+ "critique": 32982,
+ "critters": 35423,
+ "crm": 22610,
+ "cro": 1192,
+ "cro": 22522,
+ "croati": 28072,
+ "croatia": 13323,
+ "croatian": 34795,
+ "croc": 43350,
+ "croche": 35352,
+ "crochet": 17554,
+ "crock": 41685,
+ "crocker": 47843,
+ "crockett": 48313,
+ "crocod": 24519,
+ "crocodile": 24757,
+ "crocs": 38988,
+ "croft": 16657,
+ "croissant": 46011,
+ "croix": 44735,
+ "crom": 25082,
+ "crombie": 46162,
+ "cromwell": 45345,
+ "cron": 17361,
+ "croo": 16443,
+ "crook": 43744,
+ "crooked": 48473,
+ "crooked": 25644,
+ "crooks": 44226,
+ "crop": 40751,
+ "crop": 9955,
+ "cropped": 31139,
+ "crops": 16290,
+ "crore": 18274,
+ "crores": 37281,
+ "cros": 16670,
+ "crosby": 21095,
+ "cross": 5266,
+ "cross": 3417,
+ "crossed": 11731,
+ "crosses": 20473,
+ "crossfit": 47214,
+ "crossfit": 20395,
+ "crossing": 8673,
+ "crossings": 43517,
+ "crossover": 17194,
+ "crossroads": 27427,
+ "crossword": 32945,
+ "crou": 31206,
+ "crouch": 36506,
+ "crow": 3138,
+ "crow": 16019,
+ "crowd": 12036,
+ "crowd": 4570,
+ "crowded": 20182,
+ "crowdfunding": 17971,
+ "crowds": 16092,
+ "crowe": 33560,
+ "crowley": 32287,
+ "crown": 22190,
+ "crown": 6902,
+ "crowned": 16109,
+ "crowns": 33229,
+ "crows": 27134,
+ "croy": 21676,
+ "croydon": 27116,
+ "crs": 28449,
+ "crt": 43877,
+ "cru": 1815,
+ "cru": 29788,
+ "cruci": 18499,
+ "crucial": 12396,
+ "crude": 20677,
+ "cruel": 16073,
+ "cruel": 17573,
+ "cruelty": 20675,
+ "cruis": 27721,
+ "cruise": 36425,
+ "cruise": 6764,
+ "cruiser": 21394,
+ "cruises": 19214,
+ "cruising": 19743,
+ "crum": 43268,
+ "crumb": 48327,
+ "crumb": 39909,
+ "crumble": 36595,
+ "crumbs": 35893,
+ "crun": 17407,
+ "crunch": 16620,
+ "crunchy": 31366,
+ "crusad": 19133,
+ "crusade": 36846,
+ "crusader": 40171,
+ "crusaders": 31319,
+ "crush": 22296,
+ "crush": 7610,
+ "crushed": 18270,
+ "crusher": 44923,
+ "crushes": 35844,
+ "crushing": 20790,
+ "crust": 23136,
+ "crusted": 37314,
+ "cruz": 33689,
+ "cruz": 8403,
+ "cry": 2837,
+ "cry": 6290,
+ "crying": 6828,
+ "cryo": 32215,
+ "cryp": 4865,
+ "crypt": 37814,
+ "cryptic": 46925,
+ "crypto": 8080,
+ "crypto": 9608,
+ "cryptocurrencies": 33329,
+ "cryptocurrency": 12070,
+ "cryst": 15891,
+ "crystal": 17387,
+ "crystal": 6517,
+ "crystalli": 47551,
+ "crystals": 18350,
+ "cs": 11978,
+ "cs": 2804,
+ "csa": 26355,
+ "csc": 41727,
+ "csc": 37266,
+ "csd": 36913,
+ "cse": 41659,
+ "csg": 47085,
+ "csgo": 28928,
+ "csi": 41750,
+ "csi": 28070,
+ "csk": 43036,
+ "csm": 40061,
+ "csn": 46329,
+ "cso": 43864,
+ "csp": 39243,
+ "csr": 32105,
+ "csr": 24598,
+ "csrracing": 44193,
+ "css": 41418,
+ "css": 19846,
+ "cst": 17016,
+ "csu": 35948,
+ "csu": 31261,
+ "csw": 41031,
+ "ct": 3381,
+ "ct": 1122,
+ "cta": 28397,
+ "ctar": 27842,
+ "ctc": 34123,
+ "cte": 31410,
+ "cted": 2910,
+ "ctf": 35250,
+ "cthulhu": 41064,
+ "cting": 7985,
+ "ction": 17578,
+ "ction": 1569,
+ "ctions": 7021,
+ "ctive": 9313,
+ "cto": 17445,
+ "ctor": 8108,
+ "ctr": 35602,
+ "ctr": 18481,
+ "cts": 6936,
+ "ctto": 25118,
+ "ctu": 20834,
+ "cture": 17668,
+ "ctv": 21213,
+ "ctv": 27590,
+ "cu": 729,
+ "cu": 11224,
+ "cuando": 40388,
+ "cub": 16938,
+ "cub": 19972,
+ "cuba": 11576,
+ "cuban": 15536,
+ "cube": 47753,
+ "cube": 11353,
+ "cubes": 31413,
+ "cubic": 48159,
+ "cubic": 29614,
+ "cubs": 9858,
+ "cuck": 26364,
+ "cuckoo": 38062,
+ "cucu": 16705,
+ "cucumber": 19787,
+ "cucumbers": 48065,
+ "cud": 42684,
+ "cudd": 12820,
+ "cuddle": 19568,
+ "cuddles": 24001,
+ "cuddling": 29696,
+ "cuddly": 36208,
+ "cudi": 48713,
+ "cue": 13424,
+ "cuer": 39506,
+ "cues": 35719,
+ "cuff": 34693,
+ "cuff": 22414,
+ "cufflinks": 43938,
+ "cuffs": 37221,
+ "cuis": 9938,
+ "cuisine": 10605,
+ "cuk": 34838,
+ "cul": 1877,
+ "cula": 35935,
+ "cular": 10940,
+ "culars": 45719,
+ "cule": 31066,
+ "cules": 18984,
+ "culin": 14772,
+ "culinary": 16466,
+ "cull": 21880,
+ "cull": 42061,
+ "cullen": 25973,
+ "culmin": 33778,
+ "culo": 36305,
+ "culprit": 41593,
+ "cult": 11965,
+ "cultiv": 16781,
+ "cultivate": 42983,
+ "cultivated": 48901,
+ "cultivation": 41539,
+ "cultur": 20780,
+ "cultural": 34908,
+ "cultural": 6753,
+ "culturally": 36783,
+ "culture": 20197,
+ "culture": 3673,
+ "cultured": 40176,
+ "cultures": 19552,
+ "culver": 42103,
+ "cum": 20142,
+ "cum": 27119,
+ "cumb": 10858,
+ "cumber": 15309,
+ "cumberbatch": 27541,
+ "cumberland": 28747,
+ "cumbri": 32010,
+ "cumbria": 17953,
+ "cumin": 42285,
+ "cumple": 47050,
+ "cumul": 42961,
+ "cumulative": 47610,
+ "cumulus": 46313,
+ "cun": 12423,
+ "cun": 29532,
+ "cunningham": 25321,
+ "cuomo": 25681,
+ "cup": 5059,
+ "cup": 1937,
+ "cupboard": 32074,
+ "cupcake": 17025,
+ "cupcakes": 12747,
+ "cupid": 34885,
+ "cuppa": 28077,
+ "cups": 11463,
+ "cur": 1092,
+ "cur": 33073,
+ "curated": 20341,
+ "curator": 20753,
+ "curb": 21931,
+ "curd": 38881,
+ "cure": 36758,
+ "cure": 9088,
+ "cured": 26248,
+ "cures": 38204,
+ "curfew": 48826,
+ "curi": 12640,
+ "curing": 44169,
+ "curiosity": 21583,
+ "curious": 9865,
+ "curl": 24306,
+ "curled": 43734,
+ "curling": 18543,
+ "curls": 24340,
+ "curly": 20795,
+ "curran": 40999,
+ "currant": 43501,
+ "curren": 6142,
+ "currencies": 23530,
+ "currency": 7853,
+ "current": 3653,
+ "currently": 3792,
+ "currents": 35450,
+ "curric": 16201,
+ "curriculum": 17947,
+ "currie": 39385,
+ "curry": 49285,
+ "curry": 8051,
+ "curse": 18479,
+ "cursed": 26408,
+ "cursor": 46546,
+ "curt": 38137,
+ "curtain": 17223,
+ "curtains": 30223,
+ "curti": 39925,
+ "curtis": 13808,
+ "curve": 15792,
+ "curved": 25789,
+ "curves": 22814,
+ "curvy": 45788,
+ "cus": 2736,
+ "cusa": 47414,
+ "cuse": 37950,
+ "cush": 43731,
+ "cushi": 15333,
+ "cushion": 20853,
+ "cushions": 34163,
+ "cussion": 16658,
+ "cussions": 46853,
+ "cust": 20900,
+ "custard": 26516,
+ "custo": 4376,
+ "custody": 16176,
+ "custom": 2662,
+ "custom": 4996,
+ "custome": 41323,
+ "customer": 24035,
+ "customer": 5102,
+ "customerexperience": 45167,
+ "customers": 5528,
+ "customerservice": 40611,
+ "customiz": 41793,
+ "customizable": 48253,
+ "customization": 48244,
+ "customize": 32179,
+ "customized": 23229,
+ "customs": 16880,
+ "cut": 10511,
+ "cut": 3032,
+ "cute": 16031,
+ "cute": 2242,
+ "cuteness": 19342,
+ "cuter": 27151,
+ "cutest": 8032,
+ "cuth": 44328,
+ "cutie": 10733,
+ "cuties": 40939,
+ "cuties": 23420,
+ "cutiesaturday": 41883,
+ "cutler": 40428,
+ "cutlery": 49073,
+ "cutout": 45016,
+ "cuts": 7435,
+ "cutt": 27338,
+ "cutt": 47647,
+ "cutter": 19719,
+ "cutters": 44783,
+ "cutting": 7266,
+ "cuz": 9215,
+ "cv": 13531,
+ "cv": 13947,
+ "cvs": 29603,
+ "cw": 10652,
+ "cw": 11065,
+ "cwc": 19179,
+ "cwgc": 48527,
+ "cws": 45186,
+ "cx": 44457,
+ "cx": 14283,
+ "cy": 1470,
+ "cy": 1678,
+ "cyber": 5830,
+ "cyber": 10210,
+ "cybercrime": 41772,
+ "cybermonday": 36578,
+ "cyberpunk": 36896,
+ "cybersecurity": 10581,
+ "cyborg": 36650,
+ "cycl": 9791,
+ "cycle": 19083,
+ "cycle": 5072,
+ "cycled": 31055,
+ "cycles": 14605,
+ "cycli": 12201,
+ "cycling": 26353,
+ "cycling": 6321,
+ "cyclist": 20686,
+ "cyclists": 20303,
+ "cyclo": 18122,
+ "cyclone": 48094,
+ "cyclone": 20917,
+ "cyclones": 34669,
+ "cylin": 18569,
+ "cylinder": 22092,
+ "cylinders": 48888,
+ "cymb": 36677,
+ "cymru": 24005,
+ "cyn": 14324,
+ "cynthi": 41994,
+ "cynthia": 23748,
+ "cyp": 14809,
+ "cypress": 25347,
+ "cypri": 36481,
+ "cyprus": 15263,
+ "cyril": 36028,
+ "cyrus": 14204,
+ "cystic": 46131,
+ "cyto": 31864,
+ "cz": 22898,
+ "cz": 22921,
+ "cze": 12152,
+ "czech": 43151,
+ "czech": 16141,
+ "cé": 36454,
+ "cé": 18317,
+ "d": 67,
+ "d": 323,
+ "da": 925,
+ "da": 1140,
+ "daa": 32642,
+ "daan": 44814,
+ "dab": 10413,
+ "dab": 22900,
+ "dac": 16222,
+ "dac": 27478,
+ "daca": 28477,
+ "dach": 34166,
+ "dachsh": 41641,
+ "dachshund": 42720,
+ "dad": 4346,
+ "dad": 2639,
+ "dada": 31325,
+ "daddy": 29466,
+ "daddy": 6546,
+ "dade": 23299,
+ "dades": 28289,
+ "dads": 12741,
+ "dae": 23358,
+ "dae": 15422,
+ "daener": 46934,
+ "daes": 47282,
+ "daesh": 35047,
+ "daf": 9972,
+ "daf": 36704,
+ "daffodils": 44769,
+ "daft": 36347,
+ "dag": 11434,
+ "dag": 25650,
+ "dagger": 34251,
+ "dah": 16976,
+ "dah": 11776,
+ "dahl": 45816,
+ "dahl": 22621,
+ "dahlia": 41768,
+ "dai": 13559,
+ "dai": 10632,
+ "dail": 14676,
+ "dailies": 21260,
+ "daily": 6689,
+ "daily": 2873,
+ "dailynews": 43466,
+ "dailys": 43160,
+ "dailysketch": 46738,
+ "daim": 40421,
+ "dain": 32222,
+ "dain": 28315,
+ "daipur": 47631,
+ "dair": 19998,
+ "dair": 42078,
+ "dairy": 25243,
+ "dairy": 10302,
+ "dairyfree": 49366,
+ "dais": 10502,
+ "daisi": 39947,
+ "daisies": 40654,
+ "daisy": 39310,
+ "daisy": 12865,
+ "dak": 6999,
+ "dak": 16095,
+ "dakar": 31137,
+ "dakota": 38522,
+ "dakota": 12358,
+ "dal": 2476,
+ "dal": 5601,
+ "dala": 42675,
+ "dalai": 41222,
+ "dalail": 35169,
+ "dalailama": 35849,
+ "dale": 11533,
+ "dale": 4677,
+ "dalejr": 38207,
+ "dales": 29031,
+ "daley": 28544,
+ "dalgo": 43614,
+ "dali": 36735,
+ "dali": 25703,
+ "dalit": 45432,
+ "dall": 43631,
+ "dalla": 16772,
+ "dallas": 27414,
+ "dallas": 5759,
+ "dallascowboys": 33016,
+ "dalmati": 44275,
+ "dalton": 21488,
+ "daly": 24873,
+ "dam": 1880,
+ "dam": 4926,
+ "damage": 6822,
+ "damaged": 13568,
+ "damages": 28842,
+ "damaging": 20610,
+ "damas": 23345,
+ "damascus": 25396,
+ "dame": 10069,
+ "dames": 44548,
+ "dami": 17783,
+ "damian": 43307,
+ "damian": 25375,
+ "damien": 25090,
+ "dammit": 31057,
+ "damn": 37409,
+ "damn": 4451,
+ "damned": 28428,
+ "damon": 48503,
+ "damon": 18244,
+ "damp": 26520,
+ "dams": 37680,
+ "dan": 2257,
+ "dan": 2284,
+ "dana": 44834,
+ "dana": 13777,
+ "danao": 38598,
+ "danc": 3945,
+ "dance": 10619,
+ "dance": 2724,
+ "danced": 32891,
+ "dancehall": 33300,
+ "dancer": 11400,
+ "dancers": 13153,
+ "dances": 24083,
+ "dancing": 33280,
+ "dancing": 6226,
+ "dand": 12593,
+ "dandelion": 38903,
+ "dandy": 31932,
+ "dane": 19330,
+ "danes": 47477,
+ "dang": 4283,
+ "dang": 14992,
+ "danger": 20083,
+ "danger": 11212,
+ "dangerous": 7350,
+ "dangerously": 35012,
+ "dangers": 23726,
+ "dangle": 39907,
+ "dani": 3001,
+ "dani": 17009,
+ "daniel": 7859,
+ "daniel": 4981,
+ "daniela": 44466,
+ "danielle": 30396,
+ "danielle": 15292,
+ "danielpadilla": 34702,
+ "daniels": 16146,
+ "danish": 15467,
+ "dank": 31849,
+ "dann": 11951,
+ "danny": 14950,
+ "danny": 7621,
+ "dano": 29703,
+ "dans": 16241,
+ "dant": 48097,
+ "dant": 28237,
+ "dante": 21911,
+ "danube": 44594,
+ "dany": 47816,
+ "dao": 36099,
+ "dap": 12149,
+ "dap": 38034,
+ "daph": 24591,
+ "daphne": 31687,
+ "dapl": 34478,
+ "dapp": 46857,
+ "dapper": 26071,
+ "daq": 25381,
+ "dar": 1377,
+ "dar": 6242,
+ "dara": 17064,
+ "darby": 34366,
+ "darcy": 32916,
+ "dare": 14833,
+ "dare": 9863,
+ "daredevil": 28849,
+ "dares": 42973,
+ "dareto": 46794,
+ "dari": 16292,
+ "dari": 14552,
+ "daria": 45622,
+ "daries": 18184,
+ "daring": 28166,
+ "dario": 33918,
+ "darius": 32606,
+ "darje": 49089,
+ "dark": 5724,
+ "dark": 3144,
+ "darker": 18737,
+ "darkest": 25898,
+ "darkness": 10521,
+ "darling": 13048,
+ "darlings": 39961,
+ "darlington": 34565,
+ "darn": 26059,
+ "darrell": 33522,
+ "darren": 20263,
+ "darren": 12275,
+ "darry": 29200,
+ "darryl": 35359,
+ "darshan": 34564,
+ "dart": 14001,
+ "dart": 19841,
+ "darth": 41304,
+ "darth": 23164,
+ "dartmoor": 31477,
+ "dartmouth": 29667,
+ "darts": 15246,
+ "darwin": 43013,
+ "darwin": 20926,
+ "daryl": 45607,
+ "daryl": 24532,
+ "das": 9940,
+ "das": 7359,
+ "dash": 13858,
+ "dash": 10206,
+ "dashboard": 27679,
+ "dashi": 12876,
+ "dashing": 33825,
+ "dat": 1717,
+ "dat": 9445,
+ "data": 14876,
+ "data": 2281,
+ "datab": 11941,
+ "database": 14678,
+ "databases": 48384,
+ "datac": 27329,
+ "datacenter": 40133,
+ "datasci": 14496,
+ "datascience": 15748,
+ "dataviz": 28138,
+ "date": 34300,
+ "date": 1524,
+ "dated": 13564,
+ "dates": 7228,
+ "dating": 8534,
+ "dation": 15311,
+ "datlantic": 34270,
+ "dato": 36075,
+ "dats": 48674,
+ "dau": 3162,
+ "dau": 33828,
+ "daugh": 42523,
+ "daughter": 3944,
+ "daughters": 13585,
+ "daun": 29470,
+ "dav": 3700,
+ "dav": 46488,
+ "davao": 31502,
+ "dave": 10089,
+ "dave": 5077,
+ "daven": 28350,
+ "davenport": 34624,
+ "davey": 33391,
+ "davi": 1732,
+ "david": 4640,
+ "david": 2259,
+ "davidbowie": 44448,
+ "davido": 35989,
+ "davids": 46695,
+ "davidson": 13166,
+ "davies": 13120,
+ "davin": 43187,
+ "davis": 24426,
+ "davis": 5536,
+ "davison": 43725,
+ "davos": 31887,
+ "davy": 41565,
+ "daw": 5971,
+ "daw": 24404,
+ "dawg": 18660,
+ "dawgs": 26431,
+ "dawn": 30590,
+ "dawn": 7689,
+ "dawson": 18611,
+ "dax": 29458,
+ "day": 1405,
+ "day": 575,
+ "daya": 38165,
+ "daybreak": 33862,
+ "daycare": 36363,
+ "daydream": 41587,
+ "dayin": 20332,
+ "daylight": 20809,
+ "dayo": 29856,
+ "dayo": 46605,
+ "dayof": 16272,
+ "dayofthe": 38043,
+ "days": 1161,
+ "daysof": 12379,
+ "daysofcode": 36537,
+ "daysto": 29886,
+ "daystogo": 42198,
+ "dayswild": 42052,
+ "daytime": 22830,
+ "dayton": 35729,
+ "dayton": 20262,
+ "daytona": 16335,
+ "dayweekend": 44526,
+ "dayz": 35949,
+ "daz": 15449,
+ "daz": 43844,
+ "daze": 33591,
+ "dazz": 17149,
+ "dazzle": 41164,
+ "dazzling": 28821,
+ "db": 19100,
+ "db": 8128,
+ "dbacks": 31175,
+ "dbs": 40558,
+ "dbz": 49226,
+ "dc": 5074,
+ "dc": 2743,
+ "dca": 49107,
+ "dcc": 33747,
+ "dccomics": 17610,
+ "dcfc": 35526,
+ "dci": 35336,
+ "dcs": 42878,
+ "dcu": 42647,
+ "dd": 1353,
+ "dd": 3766,
+ "dda": 35202,
+ "ddad": 39049,
+ "dday": 32689,
+ "dday": 26243,
+ "ddc": 48513,
+ "ddd": 24183,
+ "dddd": 35362,
+ "dden": 5013,
+ "dder": 9300,
+ "dders": 24827,
+ "ddi": 44450,
+ "ddin": 17175,
+ "dding": 48101,
+ "dding": 8974,
+ "ddings": 49106,
+ "ddington": 29238,
+ "ddle": 17633,
+ "ddle": 8357,
+ "ddled": 38392,
+ "ddles": 33901,
+ "ddleston": 25647,
+ "ddling": 30981,
+ "ddlovato": 28244,
+ "ddos": 46463,
+ "ddr": 26027,
+ "dds": 48334,
+ "ddu": 43836,
+ "ddy": 14981,
+ "ddy": 7876,
+ "de": 561,
+ "de": 654,
+ "dea": 18477,
+ "deacon": 29155,
+ "dead": 3906,
+ "dead": 2747,
+ "deadliest": 40811,
+ "deadline": 47209,
+ "deadline": 8458,
+ "deadlines": 44959,
+ "deadly": 10756,
+ "deadpool": 21471,
+ "deaf": 28229,
+ "deaf": 18358,
+ "deal": 7249,
+ "deal": 2696,
+ "dealer": 15218,
+ "dealers": 21697,
+ "dealership": 32096,
+ "dealing": 13138,
+ "deals": 4469,
+ "dealt": 30101,
+ "dean": 13807,
+ "dean": 5828,
+ "deandre": 43635,
+ "deans": 46852,
+ "dear": 15696,
+ "dear": 3817,
+ "dearest": 24880,
+ "dearly": 31880,
+ "deas": 34715,
+ "death": 7163,
+ "death": 2767,
+ "deaths": 12253,
+ "deau": 12399,
+ "deaux": 19883,
+ "deb": 2987,
+ "deb": 25687,
+ "debat": 32082,
+ "debate": 5196,
+ "debates": 19239,
+ "debating": 23472,
+ "debbie": 47186,
+ "debbie": 16735,
+ "debit": 32410,
+ "debor": 16738,
+ "deborah": 40997,
+ "deborah": 22150,
+ "debra": 33233,
+ "debris": 19208,
+ "debt": 8932,
+ "debts": 38770,
+ "debu": 9790,
+ "debun": 33123,
+ "debut": 42608,
+ "debut": 4085,
+ "debuted": 25215,
+ "debuting": 34817,
+ "debuts": 17044,
+ "dec": 3063,
+ "dec": 4628,
+ "deca": 33428,
+ "decad": 29914,
+ "decade": 11099,
+ "decadent": 41716,
+ "decades": 10488,
+ "decal": 26678,
+ "decals": 37606,
+ "decan": 40677,
+ "decat": 35334,
+ "decath": 47455,
+ "decatur": 38540,
+ "decay": 22703,
+ "dece": 3534,
+ "deceased": 30035,
+ "december": 3864,
+ "decent": 10698,
+ "decentr": 28960,
+ "decentralized": 38485,
+ "decep": 33529,
+ "deception": 33046,
+ "deci": 2262,
+ "decide": 8447,
+ "decided": 4939,
+ "decides": 17269,
+ "deciding": 22513,
+ "decision": 5575,
+ "decisions": 9903,
+ "decisive": 28690,
+ "deck": 24885,
+ "deck": 6943,
+ "decked": 39096,
+ "decker": 21449,
+ "decks": 23968,
+ "decl": 7091,
+ "decla": 10739,
+ "declan": 42341,
+ "declar": 18040,
+ "declaration": 19714,
+ "declare": 19856,
+ "declared": 13845,
+ "declares": 23641,
+ "declaring": 33273,
+ "decline": 15084,
+ "declined": 28911,
+ "declines": 40478,
+ "declining": 29221,
+ "deco": 26412,
+ "deco": 16422,
+ "decor": 5148,
+ "decor": 6928,
+ "decorate": 23651,
+ "decorated": 15917,
+ "decorating": 16968,
+ "decoration": 16029,
+ "decorations": 19158,
+ "decorative": 19289,
+ "decre": 12284,
+ "decrease": 24703,
+ "decreased": 33913,
+ "decreasing": 43763,
+ "decree": 43327,
+ "ded": 16744,
+ "ded": 1241,
+ "dedic": 4701,
+ "dedicate": 27610,
+ "dedicated": 6770,
+ "dedication": 10188,
+ "dedly": 36204,
+ "deduc": 22799,
+ "dee": 5268,
+ "dee": 6705,
+ "deed": 30260,
+ "deeds": 24516,
+ "deejay": 48304,
+ "deejay": 44511,
+ "deemed": 28102,
+ "deen": 26456,
+ "deen": 12912,
+ "deep": 5462,
+ "deep": 3383,
+ "deepak": 45528,
+ "deeper": 15224,
+ "deepest": 22245,
+ "deephouse": 35684,
+ "deepi": 19371,
+ "deepika": 34120,
+ "deepikap": 29903,
+ "deepikapadukone": 30646,
+ "deeplear": 22181,
+ "deeplearning": 24362,
+ "deeply": 11449,
+ "deer": 19454,
+ "deer": 8700,
+ "deere": 32901,
+ "dees": 12547,
+ "deets": 35537,
+ "def": 2044,
+ "def": 11649,
+ "defam": 35670,
+ "defamation": 42741,
+ "default": 21650,
+ "defe": 4148,
+ "defeat": 8477,
+ "defeated": 8927,
+ "defeating": 22594,
+ "defeats": 16317,
+ "defect": 44013,
+ "defects": 37485,
+ "defen": 3619,
+ "defence": 30307,
+ "defence": 9659,
+ "defend": 21970,
+ "defend": 11397,
+ "defended": 27161,
+ "defender": 10618,
+ "defenders": 20063,
+ "defending": 13098,
+ "defends": 20134,
+ "defense": 45875,
+ "defense": 6021,
+ "defenseman": 43714,
+ "defenses": 49198,
+ "defensive": 10824,
+ "defi": 17244,
+ "defiance": 36186,
+ "defiant": 47597,
+ "defibrill": 47684,
+ "defic": 18022,
+ "defici": 23387,
+ "deficiency": 30685,
+ "deficit": 20156,
+ "defin": 3188,
+ "define": 14919,
+ "defined": 15278,
+ "defines": 28218,
+ "defining": 20504,
+ "definite": 40793,
+ "definitely": 4824,
+ "definition": 11405,
+ "definitive": 25298,
+ "defl": 31467,
+ "deforestation": 41330,
+ "defstar": 36427,
+ "defy": 39148,
+ "defying": 38496,
+ "deg": 38498,
+ "degra": 28939,
+ "degradation": 44468,
+ "degre": 4653,
+ "degree": 7119,
+ "degrees": 8000,
+ "deh": 35582,
+ "dei": 33833,
+ "dei": 23279,
+ "deir": 42948,
+ "deity": 42574,
+ "deja": 46902,
+ "dek": 23901,
+ "dekalb": 37775,
+ "del": 1233,
+ "del": 2003,
+ "dela": 37986,
+ "delaney": 31528,
+ "delav": 23706,
+ "delavin": 40477,
+ "delavin": 40776,
+ "delavinkisses": 40631,
+ "delaware": 17547,
+ "delay": 12955,
+ "delay": 10934,
+ "delayed": 14567,
+ "delaying": 43781,
+ "delays": 11232,
+ "dele": 7922,
+ "dele": 33431,
+ "delec": 38615,
+ "delectable": 45500,
+ "deleg": 8046,
+ "delegate": 27259,
+ "delegates": 14623,
+ "delegation": 14632,
+ "delete": 19204,
+ "deleted": 16588,
+ "deleting": 41857,
+ "delft": 42749,
+ "delgado": 49182,
+ "delhi": 26723,
+ "delhi": 5717,
+ "deli": 1932,
+ "deli": 18601,
+ "delia": 33193,
+ "deliber": 18316,
+ "deliberate": 38271,
+ "deliberately": 35163,
+ "delic": 13366,
+ "delicacy": 49181,
+ "delicate": 18768,
+ "delici": 19993,
+ "delicious": 3959,
+ "deliciously": 39589,
+ "deliciousness": 42819,
+ "delight": 46165,
+ "delight": 13073,
+ "delighted": 5943,
+ "delightful": 15513,
+ "delights": 25330,
+ "deline": 18797,
+ "delines": 13562,
+ "delish": 25093,
+ "deliver": 19561,
+ "deliver": 7396,
+ "delivered": 7278,
+ "deliveries": 29336,
+ "delivering": 9943,
+ "delivers": 11753,
+ "delivery": 5619,
+ "dell": 24381,
+ "dell": 10242,
+ "della": 22986,
+ "delle": 35963,
+ "deloit": 29428,
+ "deloitte": 38667,
+ "dels": 48636,
+ "delta": 32250,
+ "delta": 8768,
+ "delu": 18779,
+ "delusional": 48059,
+ "delux": 13709,
+ "deluxe": 14056,
+ "delve": 46008,
+ "dely": 15040,
+ "dem": 3251,
+ "dem": 7825,
+ "dema": 40268,
+ "dema": 45046,
+ "deman": 48366,
+ "demand": 13072,
+ "demand": 5650,
+ "demanded": 33699,
+ "demanding": 17099,
+ "demands": 14241,
+ "demar": 46566,
+ "demarcus": 47873,
+ "demb": 35930,
+ "demdebate": 43973,
+ "deme": 25143,
+ "demean": 37376,
+ "demen": 12604,
+ "dementi": 46028,
+ "dementia": 14047,
+ "demetri": 39553,
+ "demi": 32879,
+ "demi": 14480,
+ "demise": 28756,
+ "demo": 2930,
+ "demo": 7380,
+ "democr": 3573,
+ "democracy": 7758,
+ "democrat": 15431,
+ "democratic": 9149,
+ "democrats": 8865,
+ "demographic": 31308,
+ "demol": 19382,
+ "demolished": 26537,
+ "demolition": 22237,
+ "demon": 5635,
+ "demon": 12085,
+ "demonetisation": 41338,
+ "demonic": 46920,
+ "demons": 18388,
+ "demonstr": 8579,
+ "demonstrate": 22231,
+ "demonstrated": 29477,
+ "demonstrates": 24806,
+ "demonstrating": 22107,
+ "demonstration": 16722,
+ "demonstrations": 33964,
+ "demonstrators": 46450,
+ "demos": 19304,
+ "demp": 22490,
+ "dempsey": 30188,
+ "dems": 10989,
+ "demsin": 42664,
+ "demsinphilly": 43091,
+ "den": 1177,
+ "den": 1181,
+ "dena": 32431,
+ "denali": 48076,
+ "dence": 3370,
+ "dency": 11659,
+ "dend": 37447,
+ "dends": 43985,
+ "dene": 45128,
+ "dened": 19571,
+ "deng": 43098,
+ "deng": 41788,
+ "dengue": 41932,
+ "denham": 39180,
+ "deni": 21995,
+ "denial": 25716,
+ "denied": 15780,
+ "denies": 19565,
+ "denim": 13606,
+ "denis": 47630,
+ "denis": 18750,
+ "denise": 45900,
+ "denise": 20899,
+ "denmark": 13268,
+ "dennis": 32738,
+ "dennis": 10534,
+ "denny": 26808,
+ "denomin": 41016,
+ "dens": 16533,
+ "dense": 19353,
+ "density": 22431,
+ "dent": 3593,
+ "dent": 1258,
+ "dental": 24635,
+ "dental": 8382,
+ "dentally": 10346,
+ "dented": 21923,
+ "denti": 4418,
+ "dential": 5459,
+ "dentist": 17816,
+ "dentistry": 25754,
+ "dently": 28817,
+ "denton": 23567,
+ "dents": 1517,
+ "denver": 27847,
+ "denver": 8569,
+ "deny": 18679,
+ "denying": 32771,
+ "denzel": 42503,
+ "deo": 26406,
+ "deo": 12121,
+ "deodor": 47639,
+ "deol": 41902,
+ "deon": 31466,
+ "deon": 16079,
+ "dep": 6079,
+ "dep": 24370,
+ "depar": 10794,
+ "depart": 5343,
+ "depart": 30649,
+ "departed": 32541,
+ "departing": 26902,
+ "department": 5744,
+ "departments": 29523,
+ "departs": 38998,
+ "departure": 17850,
+ "depe": 36118,
+ "depend": 13894,
+ "depend": 27371,
+ "dependence": 40243,
+ "dependent": 23280,
+ "depending": 23673,
+ "depends": 20497,
+ "depic": 11307,
+ "depicted": 34637,
+ "depicting": 24970,
+ "depiction": 31071,
+ "depicts": 29340,
+ "deple": 38504,
+ "deplo": 9356,
+ "deplor": 39232,
+ "deploy": 26944,
+ "deployed": 20009,
+ "deploying": 42212,
+ "deployment": 20183,
+ "depo": 14276,
+ "depor": 36110,
+ "deport": 23389,
+ "deportation": 36617,
+ "deported": 39320,
+ "deportes": 47878,
+ "depos": 21266,
+ "deposit": 16775,
+ "deposits": 30740,
+ "depot": 12589,
+ "depp": 24941,
+ "depre": 7107,
+ "depress": 38869,
+ "depressed": 23269,
+ "depressing": 29235,
+ "depression": 10023,
+ "depri": 28587,
+ "depriv": 45809,
+ "deprivation": 47810,
+ "deprived": 39140,
+ "dept": 9201,
+ "depth": 10350,
+ "depths": 28855,
+ "depu": 6912,
+ "deputies": 24914,
+ "deputy": 7932,
+ "der": 839,
+ "der": 801,
+ "dera": 20696,
+ "derail": 48502,
+ "derby": 13904,
+ "derby": 7177,
+ "derbyshire": 22147,
+ "derdale": 21513,
+ "dere": 5701,
+ "dere": 44194,
+ "dered": 3776,
+ "derek": 22461,
+ "derek": 11205,
+ "derel": 46728,
+ "derer": 11289,
+ "derers": 20882,
+ "deri": 34573,
+ "derick": 33908,
+ "dering": 6076,
+ "deriv": 33458,
+ "derived": 26461,
+ "derland": 35488,
+ "derman": 29740,
+ "dermatology": 48051,
+ "dern": 30086,
+ "dero": 37203,
+ "dero": 34026,
+ "derrick": 21798,
+ "derry": 45777,
+ "derry": 20535,
+ "ders": 37307,
+ "ders": 1923,
+ "derson": 12677,
+ "dery": 17172,
+ "des": 6797,
+ "des": 1437,
+ "desai": 35316,
+ "desc": 13866,
+ "descen": 32318,
+ "descend": 26004,
+ "descend": 46241,
+ "descendants": 36323,
+ "descending": 36620,
+ "descent": 19375,
+ "desch": 49209,
+ "descri": 4637,
+ "describe": 10967,
+ "described": 14671,
+ "describes": 13678,
+ "describing": 24239,
+ "descrip": 41832,
+ "description": 13951,
+ "descriptions": 40653,
+ "desde": 42218,
+ "dese": 27195,
+ "deser": 3659,
+ "desert": 45776,
+ "desert": 7301,
+ "deserted": 41560,
+ "deserve": 7043,
+ "deserved": 10061,
+ "deserves": 9079,
+ "deserving": 26615,
+ "desh": 25320,
+ "desh": 7448,
+ "deshi": 42769,
+ "desi": 6772,
+ "desi": 26635,
+ "desig": 1250,
+ "design": 8359,
+ "design": 1681,
+ "designated": 24119,
+ "designation": 41155,
+ "designed": 4486,
+ "designer": 35640,
+ "designer": 5728,
+ "designers": 12720,
+ "designing": 13467,
+ "designs": 6747,
+ "designthinking": 32450,
+ "desirable": 32368,
+ "desire": 11858,
+ "desired": 28631,
+ "desires": 27598,
+ "desk": 11937,
+ "desk": 6550,
+ "desks": 41014,
+ "desktop": 14345,
+ "desmond": 27821,
+ "desol": 41258,
+ "desp": 3642,
+ "despair": 28097,
+ "desper": 10144,
+ "desperate": 15072,
+ "desperately": 21993,
+ "despic": 32442,
+ "despicable": 37158,
+ "despite": 5325,
+ "dess": 7096,
+ "dess": 10001,
+ "dessert": 9753,
+ "desserts": 22948,
+ "desses": 43913,
+ "dest": 6540,
+ "dest": 4549,
+ "destin": 4934,
+ "destination": 32191,
+ "destination": 9179,
+ "destinations": 16981,
+ "destined": 28525,
+ "destiny": 39875,
+ "destiny": 10867,
+ "destro": 8287,
+ "destroy": 8308,
+ "destroy": 11930,
+ "destroyed": 9965,
+ "destroyer": 25291,
+ "destroying": 19613,
+ "destroys": 27634,
+ "destruc": 22945,
+ "destruction": 14281,
+ "destructive": 29591,
+ "det": 28966,
+ "det": 15366,
+ "deta": 1914,
+ "detached": 26252,
+ "detail": 7657,
+ "detailed": 12609,
+ "detailing": 23163,
+ "details": 2353,
+ "detained": 20260,
+ "dete": 5606,
+ "detec": 17991,
+ "detect": 22744,
+ "detected": 26988,
+ "detecting": 41290,
+ "detection": 16220,
+ "detective": 13672,
+ "detectives": 27994,
+ "detector": 27689,
+ "detectors": 45063,
+ "detention": 16908,
+ "deter": 10742,
+ "deter": 47458,
+ "detergent": 46726,
+ "deterior": 28512,
+ "determin": 8325,
+ "determination": 17410,
+ "determine": 16768,
+ "determined": 14371,
+ "determines": 42192,
+ "determining": 39884,
+ "deth": 38375,
+ "deto": 39710,
+ "deton": 39335,
+ "detour": 31211,
+ "detox": 22459,
+ "detri": 47951,
+ "detro": 6210,
+ "detroit": 19404,
+ "detroit": 7073,
+ "detta": 45438,
+ "dette": 35750,
+ "deu": 21457,
+ "deuce": 45332,
+ "deus": 37625,
+ "deut": 14970,
+ "deutsch": 30389,
+ "deutsche": 32760,
+ "deutschland": 36878,
+ "deux": 47089,
+ "dev": 2797,
+ "dev": 3670,
+ "deva": 45179,
+ "devan": 37072,
+ "devast": 12913,
+ "devastated": 29865,
+ "devastating": 19280,
+ "devastation": 42452,
+ "devel": 1820,
+ "develop": 1966,
+ "develop": 7708,
+ "developed": 8763,
+ "developer": 10929,
+ "developers": 13248,
+ "developing": 8131,
+ "development": 2855,
+ "developmental": 29347,
+ "developments": 17393,
+ "develops": 29895,
+ "deven": 45537,
+ "devgn": 29871,
+ "devi": 12926,
+ "devi": 20717,
+ "deviant": 25593,
+ "deviantart": 26046,
+ "device": 8163,
+ "devices": 9067,
+ "devil": 8894,
+ "devil": 8043,
+ "deville": 34329,
+ "devils": 11683,
+ "devin": 31193,
+ "devin": 20996,
+ "devine": 33019,
+ "devlin": 48040,
+ "devo": 11861,
+ "devo": 43444,
+ "devon": 16205,
+ "devon": 10046,
+ "devops": 21504,
+ "devos": 40646,
+ "devote": 37777,
+ "devoted": 24561,
+ "devotees": 39759,
+ "devotion": 25821,
+ "devotional": 35456,
+ "devs": 27374,
+ "dew": 31952,
+ "dew": 16358,
+ "dewey": 40399,
+ "dex": 10030,
+ "dex": 13790,
+ "dexpo": 42502,
+ "dexter": 45049,
+ "dexter": 22781,
+ "dey": 11829,
+ "dez": 23190,
+ "dez": 8122,
+ "df": 12908,
+ "df": 10468,
+ "dfc": 41903,
+ "dfs": 32880,
+ "dfw": 20439,
+ "dg": 2394,
+ "dg": 9742,
+ "dgate": 41684,
+ "dge": 4016,
+ "dge": 1360,
+ "dged": 11830,
+ "dgeon": 45655,
+ "dgers": 8733,
+ "dges": 5432,
+ "dging": 9565,
+ "dh": 6669,
+ "dh": 9960,
+ "dha": 11629,
+ "dha": 27377,
+ "dhabi": 22349,
+ "dhaka": 32877,
+ "dham": 29635,
+ "dham": 30838,
+ "dhan": 12542,
+ "dhan": 28569,
+ "dhanush": 26162,
+ "dhanush": 36200,
+ "dhanushkraja": 29266,
+ "dhar": 12397,
+ "dharma": 30536,
+ "dhary": 28706,
+ "dhawan": 44699,
+ "dhe": 29706,
+ "dheim": 44280,
+ "dhi": 31553,
+ "dhi": 26166,
+ "dho": 37834,
+ "dhoni": 25698,
+ "dhru": 40257,
+ "dhry": 39960,
+ "dhs": 26849,
+ "dhu": 32387,
+ "di": 570,
+ "di": 1618,
+ "dia": 7351,
+ "dia": 3357,
+ "diab": 15954,
+ "diabe": 19167,
+ "diabete": 43826,
+ "diabetes": 10319,
+ "diabetic": 30230,
+ "diablo": 23931,
+ "diag": 6851,
+ "diagno": 7736,
+ "diagnose": 44429,
+ "diagnosed": 16979,
+ "diagnosis": 15715,
+ "diagnostic": 26351,
+ "diagnostics": 37723,
+ "diagram": 22697,
+ "dial": 18416,
+ "dial": 11381,
+ "dialo": 30709,
+ "dialog": 48945,
+ "dialogue": 11288,
+ "dialogues": 40330,
+ "dialysis": 44798,
+ "diam": 4347,
+ "diameter": 27189,
+ "diamon": 8873,
+ "diamond": 18535,
+ "diamond": 6235,
+ "diamonds": 12687,
+ "dian": 16021,
+ "dian": 4998,
+ "diana": 12803,
+ "diane": 15855,
+ "dianne": 42299,
+ "dians": 21041,
+ "diaper": 34382,
+ "diapers": 39659,
+ "diar": 25932,
+ "diaries": 15541,
+ "diary": 10380,
+ "dias": 22137,
+ "dias": 29354,
+ "diaspora": 28390,
+ "diaz": 17688,
+ "dic": 1404,
+ "dic": 6717,
+ "dicap": 30023,
+ "dicaprio": 30755,
+ "dice": 14406,
+ "dick": 14413,
+ "dick": 9554,
+ "dickens": 33421,
+ "dict": 45360,
+ "dict": 15159,
+ "dictat": 26156,
+ "dictator": 27399,
+ "dictatorship": 37989,
+ "dictionary": 19699,
+ "did": 1861,
+ "did": 1335,
+ "diddy": 33527,
+ "didi": 34396,
+ "didier": 45614,
+ "didn": 2376,
+ "didnt": 13057,
+ "dido": 31725,
+ "didyou": 12295,
+ "didyouknow": 12506,
+ "die": 3150,
+ "die": 2082,
+ "diec": 27729,
+ "diecast": 37936,
+ "died": 3622,
+ "diego": 30940,
+ "diego": 6306,
+ "diem": 45571,
+ "dience": 33686,
+ "dient": 27231,
+ "dier": 29702,
+ "dier": 16394,
+ "dies": 20104,
+ "dies": 1862,
+ "diesel": 46312,
+ "diesel": 10591,
+ "diest": 45739,
+ "diet": 21295,
+ "diet": 6582,
+ "dietary": 29009,
+ "dietrich": 47005,
+ "diets": 35173,
+ "dif": 18656,
+ "dif": 48731,
+ "diff": 44073,
+ "diff": 20331,
+ "diffe": 1967,
+ "differ": 34620,
+ "differen": 14903,
+ "difference": 4731,
+ "differences": 14003,
+ "different": 2731,
+ "differenti": 21729,
+ "differential": 34027,
+ "differentiate": 49032,
+ "differently": 18325,
+ "diffic": 6140,
+ "difficult": 7405,
+ "difficulties": 23468,
+ "difficulty": 25245,
+ "diffu": 31603,
+ "diffuser": 49400,
+ "dig": 1831,
+ "dig": 9887,
+ "dige": 17820,
+ "digest": 20413,
+ "digestion": 40533,
+ "digestive": 32304,
+ "digg": 43240,
+ "digger": 35919,
+ "diggin": 48466,
+ "digging": 14971,
+ "digi": 15627,
+ "digi": 39361,
+ "digimon": 44181,
+ "digit": 14899,
+ "digit": 27472,
+ "digital": 4704,
+ "digital": 2794,
+ "digitalart": 16987,
+ "digitalhealth": 32190,
+ "digitalindia": 46630,
+ "digitally": 27543,
+ "digitalmarketing": 15299,
+ "digitaltransformation": 20047,
+ "digiti": 25935,
+ "digits": 31710,
+ "digni": 45532,
+ "dignit": 39497,
+ "dignity": 17744,
+ "digo": 35701,
+ "digs": 26877,
+ "dih": 43089,
+ "dii": 32755,
+ "dijk": 44444,
+ "dik": 38854,
+ "dik": 37747,
+ "dike": 42683,
+ "dil": 7643,
+ "dil": 17942,
+ "dile": 25428,
+ "dilemma": 29787,
+ "dilig": 30664,
+ "dill": 12318,
+ "dill": 27206,
+ "dillon": 21056,
+ "dilu": 45242,
+ "dim": 19576,
+ "dim": 17523,
+ "dime": 24443,
+ "dimen": 10935,
+ "dimension": 20479,
+ "dimensional": 25252,
+ "dimensions": 25086,
+ "diment": 43500,
+ "dimes": 44888,
+ "dimini": 37459,
+ "dimit": 22250,
+ "dimitri": 48840,
+ "dimp": 38853,
+ "din": 1462,
+ "din": 5673,
+ "dina": 36815,
+ "dinah": 30903,
+ "dine": 20951,
+ "dine": 12989,
+ "diner": 16963,
+ "dinesh": 48341,
+ "ding": 7545,
+ "ding": 796,
+ "dinger": 45580,
+ "dingh": 48064,
+ "dings": 5473,
+ "dington": 24804,
+ "dinho": 47370,
+ "dini": 20196,
+ "dining": 8658,
+ "dinner": 27548,
+ "dinner": 2571,
+ "dinners": 33570,
+ "dino": 9692,
+ "dino": 14077,
+ "dinosa": 18955,
+ "dinosaur": 15095,
+ "dinosaurs": 20387,
+ "dio": 3779,
+ "dio": 1521,
+ "dioce": 20763,
+ "diocese": 27091,
+ "dion": 42899,
+ "dion": 16250,
+ "dior": 23655,
+ "dios": 37563,
+ "dious": 27417,
+ "dioxide": 38102,
+ "dip": 19918,
+ "dip": 11343,
+ "dipl": 8490,
+ "diplo": 38115,
+ "diplom": 11169,
+ "diploma": 21251,
+ "diplomacy": 23798,
+ "diplomat": 32828,
+ "diplomatic": 23782,
+ "diplomats": 44126,
+ "dipped": 30610,
+ "dipper": 49317,
+ "dipping": 33544,
+ "dips": 37522,
+ "dir": 4251,
+ "dir": 8478,
+ "dire": 38355,
+ "dire": 25664,
+ "direc": 1534,
+ "direct": 43224,
+ "direct": 6016,
+ "directed": 8392,
+ "directing": 21817,
+ "direction": 15923,
+ "direction": 5407,
+ "directional": 38687,
+ "directioner": 48042,
+ "directioners": 22055,
+ "directions": 16440,
+ "directive": 40630,
+ "directly": 9701,
+ "director": 20337,
+ "director": 2681,
+ "directorial": 45327,
+ "directors": 11940,
+ "directory": 25272,
+ "directs": 34349,
+ "directv": 48652,
+ "dirk": 28171,
+ "dirt": 31415,
+ "dirt": 11795,
+ "dirty": 20127,
+ "dirty": 7615,
+ "dis": 1518,
+ "dis": 6112,
+ "disa": 3882,
+ "disab": 47380,
+ "disabilities": 17350,
+ "disability": 48986,
+ "disability": 13261,
+ "disabled": 13613,
+ "disadvantaged": 40577,
+ "disagree": 23199,
+ "disapp": 5384,
+ "disappear": 21148,
+ "disappear": 25173,
+ "disappearance": 35929,
+ "disappeared": 23139,
+ "disappearing": 35819,
+ "disappears": 44406,
+ "disappo": 7605,
+ "disappoint": 25446,
+ "disappointed": 13794,
+ "disappointing": 21941,
+ "disappointment": 23884,
+ "disappoints": 48545,
+ "disappro": 48276,
+ "disar": 42971,
+ "disaster": 9072,
+ "disasters": 26976,
+ "disastrous": 35790,
+ "disc": 1472,
+ "disc": 10712,
+ "discar": 40532,
+ "discarded": 45197,
+ "discer": 49140,
+ "dischar": 22671,
+ "discharge": 32485,
+ "disci": 9559,
+ "discip": 38951,
+ "discipl": 10467,
+ "disciples": 39366,
+ "disciplinary": 20232,
+ "discipline": 18903,
+ "disciplines": 42032,
+ "discla": 40248,
+ "disclaimer": 46465,
+ "disclo": 17481,
+ "disclose": 46379,
+ "disclosed": 30905,
+ "disclosure": 26502,
+ "disco": 2475,
+ "disco": 11964,
+ "discography": 47545,
+ "discomfort": 48054,
+ "discord": 23582,
+ "discoun": 18515,
+ "discount": 7638,
+ "discounted": 20993,
+ "discounts": 18186,
+ "discoura": 45850,
+ "discourse": 29441,
+ "discover": 10539,
+ "discover": 4834,
+ "discovered": 6986,
+ "discoveries": 29308,
+ "discovering": 17967,
+ "discovers": 29719,
+ "discovery": 40491,
+ "discovery": 8027,
+ "discre": 20616,
+ "discrimin": 11721,
+ "discrimination": 14775,
+ "discs": 29270,
+ "discu": 1984,
+ "discus": 41828,
+ "discuss": 4312,
+ "discussed": 11300,
+ "discusses": 8116,
+ "discussing": 5900,
+ "discussion": 5060,
+ "discussions": 13806,
+ "dise": 4262,
+ "disease": 5336,
+ "diseases": 12035,
+ "disen": 46468,
+ "disgrace": 29877,
+ "disgraceful": 44146,
+ "disgu": 9793,
+ "disguise": 27803,
+ "disguised": 37149,
+ "disgusted": 41977,
+ "disgusting": 16218,
+ "dish": 11039,
+ "dish": 4531,
+ "disha": 42498,
+ "dishes": 11412,
+ "dishon": 30777,
+ "dishu": 44728,
+ "dishwasher": 40524,
+ "disin": 19484,
+ "disinfe": 48050,
+ "disintegr": 49275,
+ "disk": 17970,
+ "dislike": 30796,
+ "dism": 30836,
+ "dism": 38821,
+ "dismant": 36557,
+ "dismiss": 43287,
+ "dismissal": 42068,
+ "dismissed": 30087,
+ "dismisses": 45238,
+ "disney": 6729,
+ "disney": 4696,
+ "disneyland": 39481,
+ "disneyland": 13661,
+ "disneyworld": 28469,
+ "diso": 26305,
+ "disobe": 42841,
+ "dison": 19310,
+ "disorder": 12635,
+ "disorders": 17114,
+ "disp": 11073,
+ "dispar": 24633,
+ "disparities": 45122,
+ "dispat": 28652,
+ "dispatch": 26306,
+ "dispen": 19077,
+ "dispenser": 40116,
+ "disper": 34499,
+ "displa": 9326,
+ "displac": 17718,
+ "displaced": 22817,
+ "displacement": 37931,
+ "display": 4456,
+ "displayed": 18967,
+ "displaying": 26468,
+ "displays": 15648,
+ "dispo": 13651,
+ "dispon": 38872,
+ "disponible": 46130,
+ "dispos": 45177,
+ "disposable": 37275,
+ "disposal": 28231,
+ "dispro": 32927,
+ "dispropor": 40354,
+ "disproportion": 45492,
+ "disregard": 43869,
+ "disrespect": 34055,
+ "disrespectful": 41723,
+ "disru": 13763,
+ "disrup": 14641,
+ "disrupt": 25214,
+ "disrupted": 46674,
+ "disrupting": 42419,
+ "disruption": 19635,
+ "disruptive": 31554,
+ "diss": 10766,
+ "diss": 35688,
+ "dissec": 43879,
+ "dissemin": 40463,
+ "dissent": 45154,
+ "disser": 25560,
+ "dissertation": 29448,
+ "dissi": 25088,
+ "dissol": 27398,
+ "dissuper": 33461,
+ "dist": 5479,
+ "dist": 12116,
+ "distance": 7964,
+ "distances": 37078,
+ "distant": 18949,
+ "distill": 41586,
+ "distilled": 49179,
+ "distillery": 22200,
+ "distin": 11892,
+ "distinct": 25056,
+ "distinction": 28183,
+ "distinctive": 25486,
+ "distingui": 15053,
+ "distinguish": 45418,
+ "distinguished": 16513,
+ "distor": 23781,
+ "distortion": 43690,
+ "distr": 11885,
+ "distract": 39309,
+ "distracted": 24049,
+ "distraction": 32039,
+ "distress": 26866,
+ "distressed": 37515,
+ "distri": 5987,
+ "distribu": 6138,
+ "distribute": 32313,
+ "distributed": 16419,
+ "distributing": 35216,
+ "distribution": 10484,
+ "distributor": 28354,
+ "distributors": 44240,
+ "distric": 3208,
+ "district": 46683,
+ "district": 3506,
+ "districts": 17565,
+ "distur": 11732,
+ "disturb": 33018,
+ "disturb": 39449,
+ "disturbance": 42416,
+ "disturbed": 29967,
+ "disturbing": 21476,
+ "disupdates": 45667,
+ "dit": 5752,
+ "dit": 2524,
+ "dita": 47965,
+ "ditch": 43715,
+ "ditch": 19291,
+ "dited": 40392,
+ "diti": 2363,
+ "dition": 16452,
+ "dition": 3015,
+ "ditional": 4322,
+ "ditions": 4503,
+ "dito": 43705,
+ "dits": 49374,
+ "dity": 16436,
+ "dium": 2903,
+ "div": 5293,
+ "div": 14869,
+ "diva": 13605,
+ "divas": 23534,
+ "dive": 26042,
+ "dive": 9058,
+ "diver": 13119,
+ "diver": 22094,
+ "divergence": 48735,
+ "divergent": 36132,
+ "divers": 30241,
+ "divers": 27038,
+ "diverse": 11464,
+ "diversi": 24475,
+ "diversion": 38457,
+ "diversity": 35634,
+ "diversity": 6257,
+ "diverted": 41049,
+ "dives": 13893,
+ "divi": 8375,
+ "divid": 31337,
+ "divide": 18842,
+ "divided": 18689,
+ "dividend": 32067,
+ "dividends": 45146,
+ "dividing": 45605,
+ "divin": 21838,
+ "divine": 46919,
+ "divine": 10976,
+ "diving": 9886,
+ "divinity": 39754,
+ "divisi": 39196,
+ "division": 5378,
+ "divisional": 40912,
+ "divisions": 33715,
+ "divor": 13543,
+ "divorce": 17060,
+ "divorced": 39437,
+ "divya": 47767,
+ "diwali": 18218,
+ "dix": 45838,
+ "dix": 27620,
+ "dixie": 24484,
+ "dixit": 28279,
+ "dixon": 16086,
+ "diy": 28472,
+ "diy": 7845,
+ "diya": 36459,
+ "diz": 32740,
+ "dized": 36232,
+ "dizz": 40239,
+ "dizzy": 35464,
+ "dj": 3761,
+ "dj": 3723,
+ "djan": 35338,
+ "django": 46498,
+ "dji": 35284,
+ "dji": 28379,
+ "djing": 36113,
+ "djo": 19432,
+ "djoker": 42721,
+ "djokernole": 42830,
+ "djokovic": 27944,
+ "djs": 18117,
+ "dk": 20702,
+ "dk": 16196,
+ "dl": 12558,
+ "dl": 9373,
+ "dlc": 19079,
+ "dle": 11057,
+ "dle": 3287,
+ "dled": 23494,
+ "dler": 40279,
+ "dles": 7890,
+ "dless": 14997,
+ "dley": 12808,
+ "dling": 18221,
+ "dly": 3069,
+ "dm": 19070,
+ "dm": 4667,
+ "dma": 42903,
+ "dman": 18826,
+ "dmc": 28991,
+ "dmit": 31607,
+ "dmitry": 48326,
+ "dms": 19955,
+ "dmv": 27508,
+ "dmx": 45255,
+ "dn": 11552,
+ "dn": 7459,
+ "dna": 8790,
+ "dnb": 35422,
+ "dnc": 20237,
+ "dnd": 11678,
+ "dnr": 37051,
+ "dns": 39245,
+ "dnt": 26795,
+ "do": 639,
+ "do": 818,
+ "doa": 48332,
+ "dob": 29640,
+ "doba": 35605,
+ "dobbs": 43006,
+ "dobson": 46888,
+ "doc": 3009,
+ "doc": 7251,
+ "doch": 25101,
+ "dock": 17311,
+ "dock": 8997,
+ "docked": 46784,
+ "docker": 31152,
+ "docking": 40845,
+ "docks": 24091,
+ "docs": 15157,
+ "doctor": 7872,
+ "doctor": 5547,
+ "doctoral": 23649,
+ "doctorate": 39134,
+ "doctors": 9705,
+ "doctorwho": 12996,
+ "doctr": 28497,
+ "doctrine": 35612,
+ "docu": 4433,
+ "document": 29293,
+ "document": 15121,
+ "documentaries": 44209,
+ "documentary": 7881,
+ "documentation": 31560,
+ "documented": 22310,
+ "documenting": 37876,
+ "documents": 14105,
+ "dod": 13847,
+ "dod": 30187,
+ "dodd": 36748,
+ "dodge": 31263,
+ "dodge": 12093,
+ "dodgeball": 43244,
+ "dodger": 31641,
+ "dodgers": 12422,
+ "dodgy": 37727,
+ "doe": 13296,
+ "does": 2397,
+ "does": 1897,
+ "doesn": 2503,
+ "doesnt": 17937,
+ "dof": 8277,
+ "doff": 20193,
+ "dofficial": 42516,
+ "dog": 4326,
+ "dog": 1929,
+ "dogcelebration": 41819,
+ "dogday": 27475,
+ "doge": 42187,
+ "dogg": 20749,
+ "doggie": 32237,
+ "doggo": 42155,
+ "doggy": 26359,
+ "doglo": 40733,
+ "dogre": 40030,
+ "dogrescue": 44158,
+ "dogs": 42182,
+ "dogs": 3255,
+ "dogsoftwitter": 19415,
+ "doh": 23581,
+ "doha": 20908,
+ "doherty": 31774,
+ "doi": 36361,
+ "doin": 15412,
+ "doing": 37408,
+ "doing": 1960,
+ "doit": 32272,
+ "doit": 28109,
+ "doj": 25700,
+ "dojo": 35901,
+ "dok": 40547,
+ "dok": 41034,
+ "doka": 46528,
+ "dol": 2287,
+ "dol": 19170,
+ "dola": 38005,
+ "dolan": 27200,
+ "dolby": 42414,
+ "dolce": 30033,
+ "dolce": 30661,
+ "dole": 41040,
+ "doll": 27031,
+ "doll": 9286,
+ "dollar": 35092,
+ "dollar": 7474,
+ "dollars": 10669,
+ "dolls": 15090,
+ "dolly": 43281,
+ "dolly": 23821,
+ "dolom": 37137,
+ "dolores": 40741,
+ "dolph": 8900,
+ "dolph": 22257,
+ "dolphin": 42963,
+ "dolphin": 16464,
+ "dolphins": 14002,
+ "dom": 2164,
+ "dom": 1919,
+ "domain": 15492,
+ "domaine": 48744,
+ "domains": 36358,
+ "dome": 8515,
+ "dome": 9827,
+ "domen": 37584,
+ "domest": 21936,
+ "domestic": 28189,
+ "domestic": 9043,
+ "domin": 4361,
+ "dominance": 30546,
+ "dominant": 20565,
+ "dominate": 21431,
+ "dominated": 23048,
+ "dominates": 34043,
+ "dominating": 29303,
+ "domination": 30919,
+ "domingo": 24882,
+ "dominic": 39007,
+ "dominic": 19095,
+ "dominican": 22934,
+ "dominion": 27155,
+ "domino": 30752,
+ "dominos": 39770,
+ "domo": 44293,
+ "doms": 30126,
+ "don": 1067,
+ "don": 847,
+ "dona": 26789,
+ "donal": 42375,
+ "donald": 5990,
+ "donald": 4335,
+ "donaldson": 37783,
+ "donaldtrump": 6652,
+ "donat": 36384,
+ "donate": 6429,
+ "donated": 8705,
+ "donates": 26960,
+ "donating": 12621,
+ "donation": 7924,
+ "donations": 9928,
+ "doncaster": 38008,
+ "doncaster": 25352,
+ "doncasterisgreat": 47333,
+ "done": 5136,
+ "done": 1700,
+ "donegal": 24172,
+ "donesia": 41281,
+ "donet": 33724,
+ "donetsk": 33999,
+ "dong": 26242,
+ "dong": 31478,
+ "dongha": 28365,
+ "donghae": 28945,
+ "donia": 24014,
+ "donkey": 21415,
+ "donkeys": 44644,
+ "donna": 9158,
+ "donne": 30897,
+ "donnein": 38308,
+ "donneinarte": 40193,
+ "donnell": 35118,
+ "donnelly": 39070,
+ "donnie": 47058,
+ "donnie": 30609,
+ "donny": 37291,
+ "donny": 32887,
+ "dono": 14840,
+ "donor": 18013,
+ "donors": 17887,
+ "donovan": 21499,
+ "dons": 22127,
+ "dont": 8094,
+ "dont": 4632,
+ "donut": 18471,
+ "donuts": 13970,
+ "doo": 4543,
+ "doo": 11643,
+ "doodle": 9388,
+ "doodled": 41030,
+ "doodles": 22156,
+ "doodling": 37548,
+ "dooley": 47609,
+ "doom": 23263,
+ "doom": 14344,
+ "doomed": 33251,
+ "doomsday": 41791,
+ "doon": 36612,
+ "doop": 33886,
+ "door": 7188,
+ "door": 2489,
+ "doors": 4228,
+ "doorstep": 19533,
+ "doorway": 46575,
+ "dop": 42381,
+ "dop": 31722,
+ "dope": 42587,
+ "dope": 10094,
+ "doping": 30285,
+ "dopp": 21774,
+ "doppelg": 45216,
+ "doppler": 42540,
+ "dor": 2766,
+ "dor": 8695,
+ "dora": 18104,
+ "dorado": 32350,
+ "dorchester": 32656,
+ "dore": 39423,
+ "dores": 34323,
+ "dorf": 17296,
+ "dori": 49270,
+ "doria": 43186,
+ "dorian": 44016,
+ "doris": 24285,
+ "dork": 36206,
+ "dorm": 24263,
+ "doro": 15498,
+ "doro": 37389,
+ "dorothy": 20805,
+ "dors": 31240,
+ "dorset": 42109,
+ "dorset": 16047,
+ "dorsey": 41607,
+ "dortmund": 24290,
+ "dory": 36135,
+ "dos": 44258,
+ "dos": 5474,
+ "dose": 11497,
+ "doses": 37873,
+ "dossier": 46042,
+ "dost": 44222,
+ "dot": 7473,
+ "dot": 7004,
+ "dota": 23085,
+ "dotcom": 12443,
+ "dote": 31202,
+ "dothis": 47864,
+ "dotnet": 43124,
+ "dotorg": 46587,
+ "dots": 19019,
+ "dotted": 47950,
+ "dou": 1756,
+ "dou": 23608,
+ "doub": 19631,
+ "double": 13013,
+ "double": 3200,
+ "doubled": 24948,
+ "doubleheader": 34668,
+ "doubles": 12539,
+ "doubling": 36850,
+ "doubt": 37071,
+ "doubt": 8671,
+ "doubts": 30894,
+ "douche": 44292,
+ "doug": 20271,
+ "doug": 10758,
+ "dough": 15785,
+ "dough": 14983,
+ "doughnut": 32555,
+ "doughnuts": 31124,
+ "dougie": 46317,
+ "dougla": 9140,
+ "douglas": 10065,
+ "douglass": 45692,
+ "doun": 44785,
+ "dov": 38856,
+ "dova": 26551,
+ "dove": 27511,
+ "dove": 18281,
+ "dover": 43019,
+ "dover": 14683,
+ "doves": 47067,
+ "dow": 8022,
+ "dow": 10688,
+ "dowell": 27344,
+ "down": 1833,
+ "down": 1136,
+ "downe": 46501,
+ "downed": 35814,
+ "downer": 42522,
+ "downers": 43739,
+ "downey": 29429,
+ "downfall": 48702,
+ "downhill": 27387,
+ "downing": 28140,
+ "download": 35076,
+ "download": 3794,
+ "downloadable": 49105,
+ "downloaded": 22961,
+ "downloading": 30519,
+ "downloads": 26481,
+ "downpour": 39034,
+ "downpours": 40160,
+ "downs": 10706,
+ "downside": 41937,
+ "downstairs": 28174,
+ "downstream": 43822,
+ "downtime": 41964,
+ "downton": 45023,
+ "downton": 42668,
+ "downtown": 18230,
+ "downtown": 5061,
+ "downward": 37430,
+ "dowski": 43556,
+ "dox": 44786,
+ "dox": 14510,
+ "doyle": 17728,
+ "doyou": 27256,
+ "doz": 31106,
+ "dozen": 16401,
+ "dozens": 17883,
+ "dp": 23820,
+ "dp": 6465,
+ "dprint": 46644,
+ "dprinting": 16194,
+ "dprk": 47920,
+ "dps": 34288,
+ "dq": 28741,
+ "dr": 1084,
+ "dr": 1701,
+ "dra": 1114,
+ "dra": 7402,
+ "drac": 20168,
+ "dracing": 41253,
+ "dracula": 25405,
+ "draf": 37426,
+ "draft": 30624,
+ "draft": 5198,
+ "drafted": 19129,
+ "drafting": 33528,
+ "drafts": 29194,
+ "drag": 8452,
+ "drag": 12463,
+ "dragged": 27884,
+ "dragging": 37069,
+ "dragon": 9187,
+ "dragon": 5471,
+ "dragonball": 40959,
+ "dragoncon": 47802,
+ "dragonfly": 32824,
+ "dragons": 10203,
+ "dragrace": 40762,
+ "drags": 45368,
+ "drain": 23347,
+ "drain": 19467,
+ "drainage": 25953,
+ "drained": 44630,
+ "drains": 43638,
+ "drainthe": 47337,
+ "drake": 32504,
+ "drake": 8958,
+ "dral": 7503,
+ "dram": 6937,
+ "dram": 32170,
+ "drama": 5055,
+ "dramas": 33467,
+ "dramati": 43512,
+ "dramatic": 11240,
+ "dramatically": 24495,
+ "drank": 21712,
+ "draped": 49113,
+ "drastic": 43159,
+ "drastically": 35478,
+ "drau": 18621,
+ "draw": 17675,
+ "draw": 4001,
+ "drawer": 23219,
+ "drawers": 38975,
+ "drawing": 36996,
+ "drawing": 3610,
+ "drawings": 13397,
+ "drawn": 8893,
+ "draws": 12043,
+ "dray": 25562,
+ "drayton": 49044,
+ "drc": 21434,
+ "dre": 960,
+ "dre": 14584,
+ "dread": 17412,
+ "dread": 31403,
+ "dreaded": 47227,
+ "dreadful": 35846,
+ "dreality": 48367,
+ "dream": 4595,
+ "dream": 2984,
+ "dreambig": 46495,
+ "dreamcast": 47226,
+ "dreamed": 27984,
+ "dreamer": 25692,
+ "dreamers": 27194,
+ "dreaming": 11662,
+ "dreamliner": 49143,
+ "dreams": 4405,
+ "dreamt": 43743,
+ "dreamteam": 40090,
+ "dreamy": 23517,
+ "dred": 10903,
+ "dredge": 48783,
+ "dren": 29068,
+ "dren": 47309,
+ "drenched": 46378,
+ "dres": 48852,
+ "dres": 44697,
+ "dresden": 34836,
+ "dress": 12622,
+ "dress": 2595,
+ "dressage": 36144,
+ "dressed": 6559,
+ "dresser": 26346,
+ "dresses": 8184,
+ "dressing": 6348,
+ "drew": 18792,
+ "drew": 5281,
+ "drex": 33985,
+ "drey": 48271,
+ "dri": 1203,
+ "dri": 28833,
+ "drian": 36870,
+ "dribb": 42153,
+ "dric": 23448,
+ "dridge": 22956,
+ "drie": 40170,
+ "dried": 16037,
+ "drier": 39877,
+ "dries": 33857,
+ "drif": 33585,
+ "drift": 18194,
+ "drifting": 30276,
+ "drill": 11626,
+ "drilled": 46338,
+ "drilling": 18634,
+ "drills": 24378,
+ "drin": 3375,
+ "drin": 47133,
+ "drink": 14131,
+ "drink": 3979,
+ "drinking": 5778,
+ "drinklocal": 45998,
+ "drinks": 6732,
+ "drip": 24050,
+ "dripping": 38787,
+ "dris": 35804,
+ "drive": 11402,
+ "drive": 2620,
+ "driven": 9314,
+ "driver": 27563,
+ "driver": 4383,
+ "driverless": 46769,
+ "drivers": 7384,
+ "drives": 11441,
+ "driveway": 26273,
+ "driving": 37800,
+ "driving": 4161,
+ "drizzle": 28240,
+ "drm": 39674,
+ "dro": 1494,
+ "dro": 12442,
+ "drogba": 49199,
+ "droid": 38016,
+ "drome": 9157,
+ "dron": 43898,
+ "dron": 23360,
+ "drone": 33557,
+ "drone": 9397,
+ "drones": 14006,
+ "droo": 30715,
+ "drool": 41554,
+ "drooling": 44360,
+ "drop": 16407,
+ "drop": 3387,
+ "dropbox": 47216,
+ "dropped": 6792,
+ "dropping": 8339,
+ "drops": 6437,
+ "dros": 47033,
+ "drou": 38558,
+ "drought": 13935,
+ "drove": 13753,
+ "drow": 21159,
+ "drown": 28571,
+ "drowned": 34005,
+ "drowning": 24618,
+ "drs": 21257,
+ "dru": 2275,
+ "dru": 49048,
+ "drug": 20601,
+ "drug": 5600,
+ "drugs": 8021,
+ "druid": 40297,
+ "drum": 13353,
+ "drum": 8698,
+ "drummer": 13618,
+ "drummers": 46191,
+ "drumming": 35480,
+ "drummond": 42213,
+ "drums": 11690,
+ "drun": 15488,
+ "drunk": 37398,
+ "drunk": 8232,
+ "drunken": 28196,
+ "drupal": 46481,
+ "drush": 43009,
+ "drwho": 48342,
+ "dry": 13544,
+ "dry": 4501,
+ "dryer": 24425,
+ "drying": 23203,
+ "ds": 3361,
+ "ds": 646,
+ "dsa": 47607,
+ "dsb": 47168,
+ "dsb": 14257,
+ "dsburg": 47237,
+ "dsc": 37240,
+ "dsd": 45383,
+ "dsley": 40740,
+ "dslr": 33740,
+ "dsm": 39502,
+ "dson": 40310,
+ "dsp": 45291,
+ "dss": 41580,
+ "dstv": 35027,
+ "dt": 13104,
+ "dt": 7427,
+ "dthe": 13863,
+ "dtla": 31885,
+ "dtm": 42407,
+ "dts": 46233,
+ "du": 691,
+ "du": 3686,
+ "dua": 25244,
+ "dual": 39739,
+ "dual": 5347,
+ "duane": 38946,
+ "dub": 14526,
+ "dub": 13144,
+ "duba": 5485,
+ "dubai": 32599,
+ "dubai": 5985,
+ "dubbed": 27740,
+ "dublin": 20707,
+ "dublin": 6145,
+ "dubnation": 47329,
+ "dubois": 48046,
+ "dubrov": 46709,
+ "dubrovnik": 48724,
+ "dubs": 27013,
+ "dubstep": 38303,
+ "dubu": 43257,
+ "duc": 979,
+ "duc": 36446,
+ "ducati": 28570,
+ "ducation": 17197,
+ "duce": 3660,
+ "duchess": 21713,
+ "duck": 12708,
+ "duck": 6910,
+ "ducks": 11202,
+ "duct": 26829,
+ "dude": 48087,
+ "dude": 5710,
+ "dudes": 14449,
+ "dudley": 27324,
+ "due": 2887,
+ "duel": 27143,
+ "dues": 37646,
+ "duet": 25457,
+ "duf": 38713,
+ "duff": 38071,
+ "duff": 21934,
+ "duffy": 23599,
+ "dug": 22743,
+ "dug": 21000,
+ "dugg": 40523,
+ "duggan": 46169,
+ "dugout": 36831,
+ "duh": 26716,
+ "dui": 29693,
+ "duk": 14160,
+ "duke": 18402,
+ "duke": 7732,
+ "dukes": 27914,
+ "dul": 6738,
+ "dulce": 44872,
+ "dulil": 32565,
+ "dulkar": 47980,
+ "dull": 19433,
+ "dulu": 28865,
+ "duluth": 32109,
+ "dulwich": 47343,
+ "dum": 13400,
+ "dum": 11564,
+ "dumb": 15901,
+ "dumb": 12464,
+ "dumbass": 38980,
+ "dummies": 40899,
+ "dummy": 34246,
+ "dump": 12655,
+ "dump": 17146,
+ "dumped": 23768,
+ "dumping": 31707,
+ "dumplings": 35495,
+ "dumps": 45804,
+ "dumpster": 45467,
+ "dun": 2616,
+ "dun": 18284,
+ "dunbar": 41453,
+ "duncan": 31084,
+ "duncan": 13502,
+ "dundal": 38185,
+ "dundas": 39300,
+ "dundee": 18619,
+ "dune": 32833,
+ "dune": 28208,
+ "dunedin": 40121,
+ "dunes": 23526,
+ "dung": 33712,
+ "dungeon": 28812,
+ "dungeon": 22931,
+ "dungeons": 42572,
+ "dungeonsand": 34970,
+ "dungeonsanddragons": 35497,
+ "dunham": 42501,
+ "duni": 43454,
+ "dunk": 17222,
+ "dunkin": 48022,
+ "dunkin": 36415,
+ "dunkirk": 46928,
+ "dunks": 48977,
+ "dunlop": 34753,
+ "dunn": 19185,
+ "dunne": 38538,
+ "dunno": 24502,
+ "duo": 8696,
+ "dup": 36805,
+ "dup": 10445,
+ "duper": 44850,
+ "duplex": 41186,
+ "duplic": 28992,
+ "dupont": 35994,
+ "dur": 4355,
+ "dur": 23230,
+ "dura": 28173,
+ "dura": 47382,
+ "durability": 43671,
+ "durable": 22285,
+ "duran": 28185,
+ "durango": 44443,
+ "durant": 24861,
+ "duras": 27518,
+ "duration": 31663,
+ "durban": 24474,
+ "dure": 19108,
+ "durga": 38456,
+ "durham": 26765,
+ "durham": 14335,
+ "during": 1590,
+ "dus": 9931,
+ "dusa": 28546,
+ "dusk": 19708,
+ "dust": 29723,
+ "dust": 8349,
+ "dusted": 38274,
+ "duster": 46280,
+ "dustin": 42423,
+ "dustin": 21235,
+ "dusting": 41756,
+ "dusty": 22029,
+ "dut": 32625,
+ "dutch": 22277,
+ "dutch": 7991,
+ "duter": 21624,
+ "duterte": 22371,
+ "duties": 19603,
+ "dutt": 30081,
+ "dutton": 42771,
+ "duty": 6458,
+ "duval": 42459,
+ "duvet": 48006,
+ "dux": 28562,
+ "dv": 4288,
+ "dv": 26265,
+ "dvd": 7170,
+ "dvds": 36655,
+ "dvn": 29811,
+ "dvr": 29210,
+ "dw": 8455,
+ "dw": 19997,
+ "dwar": 13487,
+ "dwarf": 22643,
+ "dwayne": 31395,
+ "dwell": 27549,
+ "dwell": 18755,
+ "dwelling": 37098,
+ "dwight": 22473,
+ "dwp": 46976,
+ "dwts": 30220,
+ "dwyer": 43878,
+ "dx": 22717,
+ "dx": 15679,
+ "dy": 1444,
+ "dy": 907,
+ "dyce": 48325,
+ "dye": 37159,
+ "dye": 15997,
+ "dyed": 24906,
+ "dyer": 29495,
+ "dyes": 39874,
+ "dying": 5115,
+ "dyk": 12142,
+ "dyke": 32632,
+ "dylan": 21004,
+ "dylan": 9900,
+ "dyn": 44289,
+ "dyn": 30669,
+ "dynam": 5735,
+ "dynamic": 10057,
+ "dynamics": 14329,
+ "dynamite": 29003,
+ "dynamo": 28281,
+ "dynasty": 14593,
+ "dyne": 42756,
+ "dyou": 11484,
+ "dyour": 22525,
+ "dys": 11022,
+ "dys": 38384,
+ "dysfunction": 36865,
+ "dysfunctional": 40757,
+ "dysle": 33681,
+ "dyslexia": 43199,
+ "dyson": 34475,
+ "dyssey": 17435,
+ "dystop": 28276,
+ "dystopian": 38915,
+ "dz": 24421,
+ "dz": 22913,
+ "dé": 25466,
+ "dü": 46948,
+ "dÃŃ": 46988,
+ "e": 68,
+ "e": 324,
+ "ea": 2150,
+ "ea": 8100,
+ "eable": 20693,
+ "each": 31442,
+ "each": 2416,
+ "eachother": 40792,
+ "ead": 42556,
+ "ead": 45523,
+ "eae": 27446,
+ "eag": 3743,
+ "eager": 21551,
+ "eagerly": 30094,
+ "eagle": 20207,
+ "eagle": 7517,
+ "eagles": 6920,
+ "eal": 48872,
+ "ealing": 40484,
+ "eames": 49072,
+ "eamon": 45954,
+ "ean": 13327,
+ "ear": 1055,
+ "ear": 8373,
+ "earbuds": 47807,
+ "eared": 9127,
+ "earl": 30573,
+ "earl": 14235,
+ "earle": 40292,
+ "earlier": 4297,
+ "earliest": 22097,
+ "early": 15840,
+ "early": 2090,
+ "earn": 33977,
+ "earn": 8465,
+ "earned": 8898,
+ "earnest": 45422,
+ "earning": 14550,
+ "earnings": 15912,
+ "earns": 16760,
+ "earp": 35296,
+ "earphones": 44905,
+ "earring": 28664,
+ "earrings": 9136,
+ "ears": 9861,
+ "eart": 7086,
+ "earth": 5184,
+ "earth": 3475,
+ "earthand": 34229,
+ "earthandclouds": 34480,
+ "earthday": 19481,
+ "earthquake": 10060,
+ "earthquakes": 32895,
+ "earthy": 47139,
+ "earts": 38824,
+ "eas": 5740,
+ "ease": 13574,
+ "easier": 8817,
+ "easiest": 26314,
+ "easily": 8197,
+ "easing": 44825,
+ "easport": 42251,
+ "east": 5022,
+ "east": 2602,
+ "eastbound": 28827,
+ "eastbourne": 38455,
+ "eastenders": 23545,
+ "easter": 14783,
+ "easter": 4811,
+ "eastern": 34522,
+ "eastern": 6311,
+ "eastman": 48280,
+ "easton": 29619,
+ "eastside": 42650,
+ "eastwood": 28270,
+ "easy": 18308,
+ "easy": 3176,
+ "eat": 5418,
+ "eat": 3384,
+ "eaten": 16750,
+ "eater": 24060,
+ "eaters": 37645,
+ "eatery": 46559,
+ "eating": 4371,
+ "eatlocal": 42868,
+ "eaton": 28462,
+ "eats": 13188,
+ "eau": 17608,
+ "eazy": 36536,
+ "eb": 12283,
+ "eb": 8677,
+ "eba": 40889,
+ "ebay": 34412,
+ "ebay": 4099,
+ "eber": 34020,
+ "ebo": 46635,
+ "ebola": 15864,
+ "ebon": 22013,
+ "ebony": 30651,
+ "ebook": 13122,
+ "ebooks": 25774,
+ "ec": 747,
+ "ec": 10879,
+ "eca": 18465,
+ "ecar": 34500,
+ "ecb": 26205,
+ "ecc": 33128,
+ "eccc": 47401,
+ "eccentric": 43228,
+ "eccle": 27494,
+ "ece": 2163,
+ "eces": 5905,
+ "ecg": 45983,
+ "ech": 15797,
+ "ech": 31147,
+ "echel": 41233,
+ "echo": 17366,
+ "echo": 13989,
+ "echoes": 32564,
+ "eci": 31936,
+ "eck": 25866,
+ "eck": 15969,
+ "ecker": 39661,
+ "ecker": 40890,
+ "ecla": 47806,
+ "eclec": 25114,
+ "eclectic": 28382,
+ "eclip": 30841,
+ "eclipse": 11505,
+ "eclub": 38983,
+ "eco": 5106,
+ "eco": 10077,
+ "ecofriendly": 43412,
+ "ecol": 22706,
+ "ecological": 25127,
+ "ecology": 18578,
+ "ecommerce": 15529,
+ "econ": 26755,
+ "econ": 21158,
+ "econom": 2768,
+ "economic": 36649,
+ "economic": 5259,
+ "economical": 48782,
+ "economically": 39406,
+ "economics": 12625,
+ "economies": 27136,
+ "economist": 18836,
+ "economists": 43701,
+ "economy": 5644,
+ "ecor": 28962,
+ "ecosystem": 15788,
+ "ecosystems": 28725,
+ "ecoun": 27924,
+ "ecr": 48572,
+ "ecraft": 11439,
+ "ecs": 23485,
+ "ecstasy": 47286,
+ "ecstatic": 36244,
+ "ect": 25168,
+ "ecu": 13087,
+ "ecu": 32919,
+ "ecuador": 19813,
+ "ecz": 43530,
+ "ed": 843,
+ "ed": 538,
+ "eda": 10804,
+ "edad": 44724,
+ "eday": 39258,
+ "edc": 21245,
+ "edchat": 14702,
+ "edd": 35431,
+ "eddi": 42930,
+ "eddie": 22748,
+ "eddie": 9517,
+ "eddy": 25959,
+ "ede": 29632,
+ "eded": 19555,
+ "edel": 20460,
+ "edelman": 48139,
+ "eden": 23621,
+ "eden": 13741,
+ "eder": 16249,
+ "edes": 36247,
+ "edfringe": 27402,
+ "edg": 35955,
+ "edgar": 33543,
+ "edgar": 17914,
+ "edge": 16914,
+ "edge": 5461,
+ "edged": 39188,
+ "edges": 20938,
+ "edgy": 35393,
+ "edi": 8750,
+ "edi": 27148,
+ "edible": 19795,
+ "edic": 25184,
+ "edics": 30641,
+ "edin": 6524,
+ "edinburgh": 27574,
+ "edinburgh": 8068,
+ "eding": 5742,
+ "edison": 25846,
+ "edit": 8239,
+ "edit": 8013,
+ "edited": 13945,
+ "edith": 28597,
+ "editing": 10178,
+ "edition": 3062,
+ "editions": 21664,
+ "editor": 7661,
+ "editorial": 12325,
+ "editors": 19486,
+ "edits": 24945,
+ "edm": 37843,
+ "edm": 13539,
+ "edmon": 11275,
+ "edmond": 41581,
+ "edmonds": 46520,
+ "edmonton": 37311,
+ "edmonton": 15058,
+ "edmun": 36561,
+ "edmund": 27567,
+ "edna": 39002,
+ "edo": 29145,
+ "edo": 18096,
+ "edon": 41467,
+ "edor": 30184,
+ "edou": 47678,
+ "edp": 46066,
+ "eds": 1941,
+ "edsheeran": 30386,
+ "edt": 15071,
+ "edtech": 41825,
+ "edtech": 15262,
+ "edu": 11757,
+ "edu": 11799,
+ "eduardo": 30604,
+ "educ": 2200,
+ "educate": 17563,
+ "educated": 21447,
+ "education": 22358,
+ "education": 2806,
+ "educational": 10400,
+ "educator": 19875,
+ "educators": 15420,
+ "edwar": 27586,
+ "edward": 26184,
+ "edward": 7450,
+ "edwards": 12627,
+ "edwin": 48718,
+ "edwin": 22471,
+ "edy": 17072,
+ "edy": 4144,
+ "ee": 2644,
+ "ee": 4708,
+ "eed": 17513,
+ "eee": 24632,
+ "eee": 9361,
+ "eeee": 11696,
+ "eeee": 17570,
+ "eeeee": 26938,
+ "eeeeee": 41407,
+ "eek": 46591,
+ "eel": 27462,
+ "eels": 44416,
+ "eem": 27236,
+ "een": 47490,
+ "een": 21230,
+ "eer": 35409,
+ "eer": 31846,
+ "eera": 36664,
+ "eerie": 33846,
+ "ees": 40308,
+ "eet": 48935,
+ "eez": 39033,
+ "ef": 1490,
+ "ef": 1829,
+ "efa": 16999,
+ "eface": 48804,
+ "efan": 33556,
+ "efc": 22065,
+ "efcc": 46087,
+ "efer": 26199,
+ "eff": 20548,
+ "eff": 21715,
+ "effe": 2808,
+ "effec": 3943,
+ "effect": 5436,
+ "effective": 6837,
+ "effectively": 17516,
+ "effectiveness": 26847,
+ "effects": 7331,
+ "effic": 36004,
+ "efficacy": 39937,
+ "effici": 6670,
+ "efficiency": 11823,
+ "efficient": 11334,
+ "efficiently": 32915,
+ "effor": 6356,
+ "effort": 40078,
+ "effort": 6255,
+ "effortless": 41639,
+ "effortlessly": 42320,
+ "efforts": 6847,
+ "efish": 35813,
+ "efl": 27172,
+ "efron": 48111,
+ "efs": 7389,
+ "eg": 8053,
+ "eg": 14599,
+ "ega": 41193,
+ "egan": 42943,
+ "eger": 46704,
+ "eger": 22767,
+ "egg": 13778,
+ "egg": 5911,
+ "eggplant": 34906,
+ "eggs": 7099,
+ "ego": 34712,
+ "ego": 14250,
+ "egos": 43992,
+ "egre": 27044,
+ "egret": 42002,
+ "egy": 5224,
+ "egyp": 10250,
+ "egypt": 7267,
+ "egyptian": 12428,
+ "eh": 9277,
+ "eh": 9135,
+ "eha": 48563,
+ "ehealth": 48617,
+ "ehr": 45271,
+ "ehs": 44648,
+ "ei": 4006,
+ "ei": 18264,
+ "eic": 40251,
+ "eid": 28038,
+ "eid": 13979,
+ "eidmubarak": 46275,
+ "eiffel": 29720,
+ "eigh": 13468,
+ "eight": 7910,
+ "eighteen": 49316,
+ "eighth": 21237,
+ "eighty": 47449,
+ "eil": 29457,
+ "eileen": 31468,
+ "ein": 29944,
+ "ein": 24524,
+ "eindhoven": 47172,
+ "eing": 7702,
+ "einstein": 20587,
+ "eira": 47708,
+ "eis": 13802,
+ "eisen": 25273,
+ "eisenhower": 35562,
+ "either": 6036,
+ "ej": 19887,
+ "ej": 25009,
+ "ejec": 29771,
+ "ek": 4212,
+ "ek": 2092,
+ "el": 544,
+ "el": 832,
+ "ela": 11284,
+ "ela": 3787,
+ "elab": 38866,
+ "elabor": 26034,
+ "elaborate": 33855,
+ "elaine": 22523,
+ "elan": 17763,
+ "elan": 18399,
+ "eland": 24930,
+ "eland": 6275,
+ "elas": 41078,
+ "elast": 27479,
+ "elastic": 30282,
+ "elba": 48598,
+ "elbow": 21965,
+ "eld": 5684,
+ "elder": 11791,
+ "elder": 14416,
+ "elderly": 15455,
+ "elders": 28617,
+ "eldest": 33503,
+ "elding": 28223,
+ "elds": 13466,
+ "ele": 2084,
+ "ele": 9766,
+ "eleague": 36577,
+ "eleanor": 18604,
+ "elearning": 29969,
+ "elec": 1564,
+ "elec": 38768,
+ "elect": 15336,
+ "elected": 8828,
+ "election": 19312,
+ "election": 4247,
+ "electionday": 40540,
+ "elections": 6949,
+ "elector": 16465,
+ "electoral": 19544,
+ "electr": 3654,
+ "electra": 48959,
+ "electri": 23927,
+ "electric": 19547,
+ "electric": 5031,
+ "electrical": 12176,
+ "electrician": 46422,
+ "electricity": 10950,
+ "electrifying": 48843,
+ "electro": 11648,
+ "electro": 23244,
+ "electromagnetic": 46530,
+ "electron": 33396,
+ "electronic": 33865,
+ "electronic": 9273,
+ "electronica": 43119,
+ "electronics": 13081,
+ "eled": 20357,
+ "elee": 44112,
+ "eleg": 8075,
+ "elegance": 19146,
+ "elegant": 11124,
+ "elek": 34559,
+ "elem": 25406,
+ "element": 14909,
+ "elementary": 8143,
+ "elements": 10925,
+ "elen": 30654,
+ "elen": 39164,
+ "elena": 19421,
+ "eleng": 48180,
+ "eleph": 7554,
+ "elephant": 10299,
+ "elephants": 16871,
+ "eler": 24646,
+ "eless": 15244,
+ "eless": 30837,
+ "elets": 19400,
+ "elev": 7921,
+ "elevate": 26736,
+ "elevated": 23967,
+ "elevation": 23826,
+ "elevator": 19021,
+ "eleven": 31617,
+ "eleven": 17795,
+ "elf": 45961,
+ "elf": 11924,
+ "elfie": 39955,
+ "elg": 28790,
+ "elgin": 31868,
+ "eli": 1018,
+ "eli": 6292,
+ "elia": 10956,
+ "elian": 42508,
+ "elias": 47274,
+ "elias": 29902,
+ "elic": 34743,
+ "elic": 13492,
+ "elie": 38677,
+ "elie": 26501,
+ "elier": 14634,
+ "elife": 37429,
+ "elife": 12719,
+ "eligibility": 34937,
+ "eligible": 16978,
+ "elijah": 26065,
+ "elike": 48913,
+ "elim": 9296,
+ "elimin": 11386,
+ "eliminate": 19655,
+ "eliminated": 29075,
+ "eliminating": 36619,
+ "elimination": 24176,
+ "elin": 25353,
+ "elin": 13458,
+ "eline": 46199,
+ "eline": 7153,
+ "eling": 9990,
+ "elio": 47943,
+ "elion": 30682,
+ "elions": 44159,
+ "eliot": 33326,
+ "elis": 23411,
+ "elis": 48021,
+ "elisa": 25610,
+ "elisa": 44051,
+ "elisabeth": 33127,
+ "elise": 27124,
+ "elit": 40882,
+ "elite": 32277,
+ "elite": 6553,
+ "elited": 43943,
+ "elitedangerous": 47138,
+ "elites": 35975,
+ "elius": 35623,
+ "elive": 49338,
+ "elive": 23505,
+ "elives": 49174,
+ "elix": 32926,
+ "elixir": 42887,
+ "eliz": 42844,
+ "eliza": 6132,
+ "eliza": 29992,
+ "elizabeth": 22397,
+ "elizabeth": 7026,
+ "elk": 34013,
+ "elk": 21896,
+ "ell": 826,
+ "ell": 812,
+ "ella": 20692,
+ "ella": 2957,
+ "elland": 43326,
+ "ellar": 38443,
+ "ellas": 37053,
+ "elle": 12818,
+ "elle": 4765,
+ "elled": 13146,
+ "ellen": 14007,
+ "ellen": 12312,
+ "ellenshow": 34812,
+ "eller": 20927,
+ "eller": 4465,
+ "ellers": 19010,
+ "elles": 24431,
+ "elli": 3367,
+ "elli": 6673,
+ "ellic": 38905,
+ "ellie": 16769,
+ "ellier": 44054,
+ "ellin": 40374,
+ "elling": 2220,
+ "ellington": 34477,
+ "ellini": 43256,
+ "elliot": 20761,
+ "elliott": 44456,
+ "elliott": 13788,
+ "ellip": 44816,
+ "ellis": 11553,
+ "ellison": 32295,
+ "ello": 2512,
+ "ellor": 14594,
+ "ells": 2433,
+ "ellu": 35560,
+ "elly": 8041,
+ "elly": 20355,
+ "elm": 25199,
+ "elm": 22082,
+ "elman": 33622,
+ "elmer": 45958,
+ "elmo": 32150,
+ "elo": 6170,
+ "elo": 13490,
+ "elon": 26381,
+ "elon": 20406,
+ "elondon": 47377,
+ "elong": 44363,
+ "elonmusk": 37076,
+ "elope": 23367,
+ "eloqu": 37795,
+ "elos": 44733,
+ "elot": 43490,
+ "elove": 43319,
+ "elove": 19165,
+ "elover": 21732,
+ "elovers": 33946,
+ "els": 35958,
+ "els": 1645,
+ "elsa": 22050,
+ "else": 18857,
+ "else": 3344,
+ "elsewhere": 22906,
+ "elson": 19624,
+ "elt": 18692,
+ "elton": 20758,
+ "elu": 14208,
+ "elusive": 28903,
+ "elves": 29111,
+ "elvi": 47008,
+ "elvis": 47359,
+ "elvis": 14498,
+ "elxn": 37726,
+ "ely": 12189,
+ "ely": 1273,
+ "elyn": 29691,
+ "elyn": 18126,
+ "em": 908,
+ "em": 2270,
+ "ema": 7002,
+ "ema": 11131,
+ "emabiggest": 23101,
+ "emabiggestfans": 29587,
+ "email": 33537,
+ "email": 4462,
+ "emailed": 40470,
+ "emailmarketing": 40188,
+ "emails": 12871,
+ "eman": 24416,
+ "eman": 36868,
+ "emancip": 42996,
+ "emanuel": 35232,
+ "emb": 3692,
+ "embar": 8266,
+ "embaras": 48019,
+ "embark": 33953,
+ "embarra": 11382,
+ "embarrass": 27183,
+ "embarrassed": 28217,
+ "embarrassing": 19653,
+ "embarrassment": 41346,
+ "embassy": 13598,
+ "embe": 46041,
+ "embed": 19703,
+ "embedded": 22046,
+ "embelli": 32144,
+ "embellished": 46992,
+ "ember": 47049,
+ "emblem": 21163,
+ "embo": 23065,
+ "embr": 35267,
+ "embrac": 16928,
+ "embrace": 12118,
+ "embraced": 35739,
+ "embraces": 38404,
+ "embracing": 22196,
+ "embro": 12550,
+ "embroi": 18667,
+ "embroide": 21530,
+ "embroidered": 22381,
+ "embroidery": 20823,
+ "emc": 20897,
+ "emc": 31602,
+ "emcee": 42038,
+ "eme": 22910,
+ "eme": 21548,
+ "emea": 40352,
+ "emed": 11028,
+ "emen": 22033,
+ "ement": 40841,
+ "ement": 2057,
+ "ements": 11058,
+ "emer": 3132,
+ "emer": 25727,
+ "emerald": 46878,
+ "emerald": 16980,
+ "emerge": 22182,
+ "emerged": 26425,
+ "emergen": 24096,
+ "emergence": 39867,
+ "emergencies": 35759,
+ "emergency": 44038,
+ "emergency": 5897,
+ "emerges": 30801,
+ "emerging": 38174,
+ "emerging": 11113,
+ "emeritus": 35333,
+ "emerson": 24147,
+ "emery": 32678,
+ "emi": 44327,
+ "emi": 18525,
+ "emil": 26794,
+ "emil": 40624,
+ "emile": 43926,
+ "emili": 20709,
+ "emilia": 34238,
+ "emilio": 39722,
+ "emily": 14545,
+ "emily": 7640,
+ "emin": 17227,
+ "emin": 23995,
+ "eminem": 22129,
+ "eminent": 33779,
+ "eming": 40398,
+ "emir": 13337,
+ "emir": 47613,
+ "emirates": 47244,
+ "emirates": 17867,
+ "emission": 27761,
+ "emissions": 14172,
+ "emit": 49043,
+ "emma": 18177,
+ "emma": 7445,
+ "emmanuel": 48045,
+ "emmanuel": 20411,
+ "emmett": 45779,
+ "emmy": 35625,
+ "emmy": 17089,
+ "emmys": 21875,
+ "emo": 3738,
+ "emo": 19381,
+ "emoji": 16327,
+ "emojis": 27870,
+ "emon": 34406,
+ "emor": 45034,
+ "emory": 44274,
+ "emotion": 17464,
+ "emotional": 7357,
+ "emotionally": 24088,
+ "emotions": 12904,
+ "emp": 3831,
+ "emp": 41004,
+ "empathy": 22420,
+ "emper": 12522,
+ "emperor": 13828,
+ "empha": 16237,
+ "emphasi": 47176,
+ "emphasis": 29588,
+ "empire": 26212,
+ "empire": 7614,
+ "empires": 46510,
+ "emplo": 3409,
+ "employ": 37290,
+ "employ": 39626,
+ "employe": 5037,
+ "employed": 26567,
+ "employee": 36631,
+ "employee": 9560,
+ "employees": 7377,
+ "employer": 21296,
+ "employers": 17647,
+ "employment": 10959,
+ "empor": 27386,
+ "emporium": 48541,
+ "empower": 13612,
+ "empower": 17230,
+ "empowered": 29087,
+ "empowering": 20086,
+ "empowerment": 15747,
+ "empowers": 46206,
+ "empress": 26656,
+ "empty": 41203,
+ "empty": 7893,
+ "emra": 39259,
+ "ems": 2858,
+ "emt": 46360,
+ "emu": 48149,
+ "emu": 29296,
+ "emul": 23272,
+ "emy": 31076,
+ "en": 524,
+ "en": 576,
+ "ena": 3452,
+ "enab": 17308,
+ "enable": 15642,
+ "enabled": 23666,
+ "enables": 23417,
+ "enabling": 23590,
+ "enam": 41486,
+ "enamel": 22746,
+ "enary": 13132,
+ "enas": 34536,
+ "enation": 20860,
+ "enberg": 15658,
+ "enburg": 28430,
+ "enc": 33169,
+ "enca": 37774,
+ "encan": 30345,
+ "encapsul": 40874,
+ "ence": 6495,
+ "ence": 954,
+ "enced": 6549,
+ "ences": 3777,
+ "enchan": 17290,
+ "enchanted": 28258,
+ "enchanting": 32531,
+ "enchil": 47396,
+ "enci": 32207,
+ "encia": 30068,
+ "encies": 18729,
+ "encing": 10326,
+ "enclosed": 43243,
+ "enclosure": 37419,
+ "encom": 44026,
+ "encore": 20549,
+ "encoun": 17309,
+ "encounter": 13164,
+ "encountered": 32492,
+ "encounters": 25399,
+ "encoura": 6169,
+ "encourage": 12090,
+ "encouraged": 20299,
+ "encouragement": 24959,
+ "encourages": 23848,
+ "encouraging": 15875,
+ "encro": 45822,
+ "encry": 28600,
+ "encryp": 42928,
+ "encrypted": 48710,
+ "encryption": 31423,
+ "ency": 3484,
+ "encyclo": 32104,
+ "encyclopedia": 38376,
+ "end": 945,
+ "end": 806,
+ "enda": 6735,
+ "endale": 20290,
+ "endange": 13990,
+ "endangered": 14931,
+ "ende": 11373,
+ "ende": 40306,
+ "endeav": 18134,
+ "endeavor": 40502,
+ "endeavors": 44394,
+ "endeavour": 38035,
+ "ended": 2622,
+ "endemic": 41241,
+ "endent": 16265,
+ "ender": 48106,
+ "ender": 12383,
+ "enders": 7418,
+ "endez": 43850,
+ "endgame": 23042,
+ "endi": 31359,
+ "ending": 2695,
+ "endings": 36516,
+ "endish": 38841,
+ "endless": 12688,
+ "endlessly": 45145,
+ "endment": 45894,
+ "endo": 13476,
+ "endo": 15830,
+ "endocr": 36486,
+ "endof": 40786,
+ "endome": 46996,
+ "endon": 48018,
+ "endor": 8092,
+ "endorf": 37249,
+ "endorse": 28819,
+ "endorsed": 24307,
+ "endorsement": 21205,
+ "endorses": 34603,
+ "endorsing": 46779,
+ "endow": 45895,
+ "endra": 22321,
+ "ends": 1339,
+ "endthe": 46256,
+ "endu": 26032,
+ "endur": 19557,
+ "endurance": 21027,
+ "endure": 32419,
+ "enduring": 30851,
+ "enduro": 47042,
+ "ene": 3297,
+ "ene": 6049,
+ "ened": 2494,
+ "eneed": 45137,
+ "enegger": 33235,
+ "enei": 48906,
+ "enemies": 15824,
+ "enemy": 10310,
+ "enen": 45113,
+ "ener": 2244,
+ "ener": 13600,
+ "energ": 39451,
+ "energetic": 24197,
+ "energi": 23044,
+ "energies": 42374,
+ "energized": 48635,
+ "energy": 14974,
+ "energy": 2650,
+ "energye": 32271,
+ "energyefficiency": 40586,
+ "eners": 48208,
+ "enes": 42066,
+ "eness": 11806,
+ "enet": 46336,
+ "enew": 29672,
+ "enews": 13442,
+ "eney": 20706,
+ "enez": 33110,
+ "enf": 38167,
+ "enfield": 27808,
+ "enfor": 10592,
+ "enforce": 40224,
+ "enforced": 44597,
+ "enforcement": 12460,
+ "eng": 1035,
+ "eng": 6730,
+ "enga": 22297,
+ "engag": 6793,
+ "engage": 11089,
+ "engaged": 11475,
+ "engagement": 7281,
+ "engaging": 13060,
+ "enge": 26279,
+ "enge": 2742,
+ "engel": 38265,
+ "engen": 48286,
+ "enger": 6618,
+ "engers": 7533,
+ "engine": 3355,
+ "engine": 5857,
+ "engineer": 40151,
+ "engineer": 8517,
+ "engineered": 26580,
+ "engineering": 5273,
+ "engineers": 11494,
+ "engines": 14487,
+ "england": 20904,
+ "england": 3595,
+ "english": 15942,
+ "english": 3469,
+ "engra": 17560,
+ "engraved": 29421,
+ "engraving": 33309,
+ "engul": 43655,
+ "engv": 28401,
+ "enh": 7449,
+ "enhall": 48781,
+ "enham": 24592,
+ "enhan": 26827,
+ "enhance": 13993,
+ "enhanced": 16070,
+ "enhancement": 35601,
+ "enhances": 38259,
+ "enhancing": 25986,
+ "eni": 4395,
+ "eni": 17538,
+ "enic": 46780,
+ "enic": 28292,
+ "enig": 19754,
+ "enig": 48730,
+ "enight": 32848,
+ "enight": 20640,
+ "enigma": 34998,
+ "ening": 1133,
+ "enium": 34380,
+ "enix": 25720,
+ "enjo": 1498,
+ "enjoy": 12981,
+ "enjoy": 2218,
+ "enjoyable": 17444,
+ "enjoyed": 5045,
+ "enjoying": 3603,
+ "enjoyment": 34905,
+ "enjoys": 17024,
+ "enka": 43942,
+ "enko": 25312,
+ "enlar": 38136,
+ "enligh": 21364,
+ "enlighten": 28200,
+ "enlightened": 44032,
+ "enlightening": 44005,
+ "enlightenment": 29255,
+ "enlisted": 43555,
+ "enly": 43023,
+ "enn": 43563,
+ "enna": 8095,
+ "enne": 21176,
+ "enne": 11518,
+ "ennedy": 46266,
+ "ennes": 43613,
+ "enni": 7049,
+ "ennial": 14220,
+ "ennis": 48923,
+ "ennis": 26309,
+ "eno": 9429,
+ "eno": 12843,
+ "enoch": 47917,
+ "enor": 13955,
+ "enormous": 20129,
+ "enos": 44759,
+ "enote": 44955,
+ "enough": 2744,
+ "enow": 26876,
+ "enqu": 28417,
+ "enqui": 22810,
+ "enquire": 46658,
+ "enquiries": 31901,
+ "enquiry": 45141,
+ "enri": 18915,
+ "enrich": 20058,
+ "enrich": 45504,
+ "enriched": 45166,
+ "enrichment": 32903,
+ "enrique": 25489,
+ "enrol": 44279,
+ "enroll": 23739,
+ "enroll": 30366,
+ "enrolled": 36853,
+ "enrollment": 24875,
+ "enroute": 40548,
+ "ens": 41799,
+ "ens": 1323,
+ "ense": 12657,
+ "ense": 27658,
+ "ensemble": 14843,
+ "ensis": 32842,
+ "ensla": 37535,
+ "enslaved": 48675,
+ "ensure": 7492,
+ "ensures": 29707,
+ "ensuring": 19403,
+ "ent": 724,
+ "ent": 621,
+ "enta": 17681,
+ "ental": 32342,
+ "ental": 6168,
+ "entary": 9833,
+ "entation": 37412,
+ "ente": 17433,
+ "ente": 9935,
+ "ented": 3800,
+ "entennial": 43088,
+ "enter": 2963,
+ "enter": 3819,
+ "entered": 10679,
+ "entering": 12580,
+ "enterpri": 7339,
+ "enterprise": 9220,
+ "enterprises": 21219,
+ "enters": 15287,
+ "entertain": 5566,
+ "entertain": 23510,
+ "entertained": 30631,
+ "entertainer": 28674,
+ "entertaining": 13897,
+ "entertainment": 6166,
+ "entes": 24213,
+ "enthr": 36202,
+ "enthusi": 9631,
+ "enthusiasm": 20525,
+ "enthusiast": 27153,
+ "enthusiastic": 22068,
+ "enthusiasts": 27514,
+ "enti": 1938,
+ "ential": 5194,
+ "entially": 37695,
+ "entic": 10340,
+ "entine": 49212,
+ "enting": 20526,
+ "entire": 4709,
+ "entirely": 13911,
+ "entirety": 43242,
+ "entit": 15209,
+ "entities": 38134,
+ "entitled": 18680,
+ "entity": 28455,
+ "ently": 2922,
+ "ento": 21917,
+ "ento": 8762,
+ "entom": 31676,
+ "entourage": 47893,
+ "entr": 7129,
+ "entrance": 9129,
+ "entrata": 27304,
+ "entre": 34188,
+ "entre": 19600,
+ "entren": 46959,
+ "entrepre": 4583,
+ "entreprene": 4789,
+ "entrepreneu": 26784,
+ "entrepreneur": 12119,
+ "entrepreneur": 8033,
+ "entrepreneurial": 28261,
+ "entrepreneurs": 11054,
+ "entrepreneurship": 12858,
+ "entries": 13766,
+ "entry": 5362,
+ "ents": 870,
+ "entu": 6650,
+ "enty": 5657,
+ "enu": 23430,
+ "env": 32280,
+ "env": 39207,
+ "envel": 20052,
+ "envelope": 27358,
+ "envir": 3512,
+ "enviro": 46200,
+ "environ": 3599,
+ "environment": 33039,
+ "environment": 5501,
+ "environmental": 7831,
+ "environmentally": 32855,
+ "environments": 19577,
+ "envision": 49031,
+ "envoy": 29263,
+ "envy": 21017,
+ "eny": 20482,
+ "enya": 36509,
+ "enyc": 39520,
+ "enz": 25805,
+ "enz": 31873,
+ "enza": 25239,
+ "enzie": 14839,
+ "enzo": 31543,
+ "enzyme": 40348,
+ "enzymes": 47465,
+ "eo": 16054,
+ "eo": 11712,
+ "eoin": 48634,
+ "eon": 31915,
+ "eos": 17805,
+ "ep": 1178,
+ "ep": 1117,
+ "epa": 15866,
+ "epage": 26931,
+ "epaper": 33584,
+ "epcot": 32524,
+ "eper": 43071,
+ "eph": 45752,
+ "eph": 41240,
+ "ephe": 25129,
+ "epi": 7219,
+ "epi": 34641,
+ "epic": 12683,
+ "epic": 4991,
+ "epiconetsy": 49222,
+ "epide": 17382,
+ "epidemi": 44447,
+ "epidemic": 21522,
+ "epile": 23150,
+ "epilepsy": 29547,
+ "epilo": 31291,
+ "epilots": 39766,
+ "epiph": 40561,
+ "epiphany": 43251,
+ "epis": 24616,
+ "episcop": 28037,
+ "episcopal": 31221,
+ "episo": 2708,
+ "episode": 2965,
+ "episodes": 11837,
+ "epit": 21967,
+ "epitome": 35114,
+ "epl": 25950,
+ "epo": 25810,
+ "epp": 39054,
+ "epp": 39593,
+ "eps": 4090,
+ "epsilon": 40019,
+ "epsom": 40364,
+ "epstein": 34688,
+ "eq": 39331,
+ "eq": 33692,
+ "equ": 2563,
+ "equal": 17373,
+ "equal": 10433,
+ "equality": 48981,
+ "equality": 9578,
+ "equally": 18172,
+ "equals": 30278,
+ "equation": 28591,
+ "equations": 38225,
+ "eque": 19518,
+ "equestrian": 24728,
+ "equi": 8752,
+ "equili": 43262,
+ "equine": 33801,
+ "equinox": 32652,
+ "equip": 6526,
+ "equip": 36979,
+ "equipment": 6893,
+ "equipo": 45688,
+ "equipped": 18331,
+ "equitable": 44717,
+ "equities": 44015,
+ "equity": 11293,
+ "equivalent": 19489,
+ "er": 517,
+ "er": 528,
+ "era": 30548,
+ "era": 2072,
+ "erable": 18801,
+ "erad": 24194,
+ "eradic": 36346,
+ "eradicate": 46164,
+ "eral": 6222,
+ "eran": 13069,
+ "eras": 19325,
+ "eras": 39090,
+ "erase": 33893,
+ "erased": 46762,
+ "erasmus": 38935,
+ "erc": 5360,
+ "erc": 32382,
+ "erd": 25645,
+ "erdo": 21112,
+ "erdogan": 24453,
+ "ere": 17907,
+ "ere": 642,
+ "erec": 21526,
+ "erected": 39365,
+ "ered": 9097,
+ "eres": 15751,
+ "ergon": 38120,
+ "ergy": 19550,
+ "eri": 2769,
+ "eri": 9509,
+ "eria": 11634,
+ "erial": 5409,
+ "eric": 1206,
+ "eric": 5396,
+ "erica": 13208,
+ "erich": 26070,
+ "erick": 27434,
+ "erick": 36959,
+ "erickson": 45286,
+ "ericsson": 39645,
+ "eridge": 45408,
+ "erie": 7005,
+ "eries": 9099,
+ "erik": 22805,
+ "erik": 16532,
+ "erika": 25531,
+ "erin": 17532,
+ "erin": 11333,
+ "erina": 25176,
+ "ering": 1785,
+ "erit": 23335,
+ "eritrea": 30738,
+ "erjee": 41665,
+ "erly": 14380,
+ "erm": 31649,
+ "erman": 17990,
+ "ern": 6992,
+ "ern": 12140,
+ "ernal": 20868,
+ "ernan": 34617,
+ "ernation": 48796,
+ "erne": 33930,
+ "ernest": 23006,
+ "ernie": 23636,
+ "ernity": 14653,
+ "erno": 40812,
+ "ernst": 30099,
+ "ero": 3211,
+ "ero": 3732,
+ "erock": 38206,
+ "eron": 32837,
+ "eroom": 46690,
+ "eros": 30597,
+ "erose": 48657,
+ "erosion": 30174,
+ "erotic": 30708,
+ "erotica": 39126,
+ "erous": 6384,
+ "eroy": 36461,
+ "erp": 28268,
+ "err": 22479,
+ "err": 25346,
+ "erra": 48446,
+ "errands": 45485,
+ "error": 12097,
+ "errors": 21195,
+ "erry": 45236,
+ "erry": 24124,
+ "ers": 4840,
+ "ers": 612,
+ "ersfc": 37925,
+ "ership": 2884,
+ "erson": 25780,
+ "erson": 6811,
+ "ert": 40325,
+ "ert": 3112,
+ "erta": 32007,
+ "erton": 26245,
+ "erts": 12921,
+ "eru": 36068,
+ "erun": 41642,
+ "erup": 17093,
+ "erupted": 48862,
+ "eruption": 33705,
+ "erville": 37557,
+ "erwin": 43724,
+ "ery": 12467,
+ "ery": 1692,
+ "erz": 38711,
+ "es": 957,
+ "es": 542,
+ "esa": 46834,
+ "esa": 12489,
+ "esanders": 23099,
+ "esc": 3330,
+ "esc": 28420,
+ "escal": 15902,
+ "escap": 11499,
+ "escape": 32484,
+ "escape": 7568,
+ "escaped": 18707,
+ "escapes": 29916,
+ "escaping": 21767,
+ "escar": 39229,
+ "escence": 37972,
+ "esch": 46760,
+ "esch": 41945,
+ "esco": 32482,
+ "escobar": 48807,
+ "escor": 24360,
+ "escort": 24976,
+ "escorted": 47667,
+ "escorts": 48574,
+ "escu": 36517,
+ "esday": 19553,
+ "ese": 18766,
+ "ese": 2260,
+ "esg": 41674,
+ "esh": 17119,
+ "esh": 13407,
+ "esha": 28799,
+ "eshop": 38451,
+ "eshop": 45570,
+ "eshopsuk": 39349,
+ "esi": 30064,
+ "esis": 12414,
+ "esk": 19359,
+ "esl": 26201,
+ "eso": 29890,
+ "eso": 28921,
+ "esof": 17047,
+ "eson": 46845,
+ "esp": 3849,
+ "esp": 13870,
+ "espa": 37301,
+ "espan": 41731,
+ "españa": 41118,
+ "especially": 4878,
+ "esper": 29216,
+ "espino": 46633,
+ "espionage": 43498,
+ "espn": 22917,
+ "espn": 7540,
+ "espnu": 47747,
+ "espo": 34381,
+ "esports": 16035,
+ "espresso": 17098,
+ "esq": 47352,
+ "esqu": 34616,
+ "esque": 25877,
+ "ess": 3118,
+ "ess": 9764,
+ "essa": 39125,
+ "essay": 12751,
+ "essays": 27328,
+ "esse": 22305,
+ "essen": 30489,
+ "essence": 17830,
+ "essenti": 11163,
+ "essential": 47264,
+ "essential": 6895,
+ "essentially": 30042,
+ "essentials": 16191,
+ "essex": 30563,
+ "essex": 11623,
+ "est": 2291,
+ "est": 1509,
+ "esta": 41449,
+ "esta": 10135,
+ "estab": 7010,
+ "establi": 8412,
+ "establish": 19709,
+ "established": 13143,
+ "establishing": 29420,
+ "establishment": 20213,
+ "estas": 39072,
+ "estate": 47130,
+ "estate": 6159,
+ "estates": 26054,
+ "este": 12968,
+ "este": 20579,
+ "esteban": 48381,
+ "esteem": 31541,
+ "esteemed": 36293,
+ "ester": 45808,
+ "esthe": 18468,
+ "esther": 24393,
+ "estim": 8904,
+ "estimate": 21883,
+ "estimated": 16665,
+ "estimates": 21957,
+ "esto": 31589,
+ "esto": 23958,
+ "estonia": 26260,
+ "estonian": 48895,
+ "estrada": 48116,
+ "estre": 31271,
+ "estu": 26272,
+ "estuary": 35269,
+ "esur": 35758,
+ "esville": 39187,
+ "esy": 46268,
+ "et": 1169,
+ "et": 875,
+ "eta": 8761,
+ "etal": 25221,
+ "etary": 13074,
+ "etc": 5353,
+ "etched": 40411,
+ "etching": 41375,
+ "ete": 38820,
+ "ete": 40245,
+ "eter": 8587,
+ "eter": 17007,
+ "eternal": 13732,
+ "eternally": 48486,
+ "eternity": 23832,
+ "eters": 18392,
+ "etf": 31661,
+ "eth": 4819,
+ "eth": 5927,
+ "ethan": 24245,
+ "ethan": 15958,
+ "ethanol": 38166,
+ "ethe": 21312,
+ "ethel": 45921,
+ "ether": 23349,
+ "ethere": 18705,
+ "ethereal": 40925,
+ "ethereum": 19612,
+ "ethernet": 35026,
+ "ethi": 10327,
+ "ethic": 39104,
+ "ethical": 47041,
+ "ethical": 17679,
+ "ethics": 13355,
+ "ethiop": 10897,
+ "ethiopia": 13920,
+ "ethiopian": 24507,
+ "ethnic": 30522,
+ "ethnic": 16344,
+ "ethnicity": 46787,
+ "ethno": 34225,
+ "ethos": 48768,
+ "eti": 11188,
+ "eti": 30394,
+ "etienne": 46118,
+ "eties": 15137,
+ "etihad": 38489,
+ "etiquette": 37957,
+ "etis": 38216,
+ "etisation": 39733,
+ "etna": 41940,
+ "eto": 27829,
+ "eto": 33837,
+ "eton": 44339,
+ "etour": 41462,
+ "etr": 23012,
+ "etres": 42838,
+ "ets": 3442,
+ "etsy": 13237,
+ "etsy": 6282,
+ "etsym": 22902,
+ "etsymntt": 25416,
+ "etsyshop": 44643,
+ "ett": 32729,
+ "ett": 24998,
+ "etta": 30466,
+ "ette": 19981,
+ "ette": 5212,
+ "ettes": 35326,
+ "etto": 44219,
+ "etty": 40759,
+ "etu": 36593,
+ "etv": 49155,
+ "etv": 20325,
+ "etwork": 20585,
+ "ety": 25920,
+ "ety": 2746,
+ "etz": 36181,
+ "etz": 25301,
+ "eu": 1506,
+ "eu": 3238,
+ "eucalyp": 41068,
+ "eucalyptus": 42351,
+ "euchar": 38362,
+ "eugen": 30678,
+ "eugene": 17760,
+ "eul": 46749,
+ "eun": 16431,
+ "eun": 26219,
+ "eunhyuk": 47526,
+ "eup": 44435,
+ "euph": 21386,
+ "euphoria": 41051,
+ "eur": 18343,
+ "eur": 12018,
+ "eura": 32605,
+ "eure": 25311,
+ "euref": 48017,
+ "eureka": 31686,
+ "euro": 2039,
+ "euro": 8463,
+ "euroleague": 46821,
+ "europa": 18290,
+ "europale": 42473,
+ "europaleague": 44029,
+ "europarl": 44922,
+ "europe": 4198,
+ "europe": 3848,
+ "european": 26712,
+ "european": 4759,
+ "europeans": 37082,
+ "euros": 22274,
+ "eurovision": 17593,
+ "eurozone": 42555,
+ "eurusd": 40895,
+ "eus": 44214,
+ "euston": 46905,
+ "euthan": 43280,
+ "euve": 40652,
+ "eux": 25019,
+ "ev": 776,
+ "ev": 10133,
+ "eva": 6845,
+ "evacu": 13187,
+ "evacuated": 26806,
+ "evacuation": 27353,
+ "eval": 25139,
+ "eval": 9703,
+ "evalu": 10314,
+ "evaluate": 27174,
+ "evaluating": 34541,
+ "evaluation": 17640,
+ "evan": 12821,
+ "evan": 12847,
+ "evangel": 20518,
+ "evangeli": 21372,
+ "evangelical": 36151,
+ "evangelist": 42275,
+ "evankirstel": 46581,
+ "evans": 8836,
+ "evansville": 44782,
+ "evapor": 33352,
+ "evasion": 48795,
+ "eve": 5732,
+ "eve": 1866,
+ "eved": 19820,
+ "evel": 39315,
+ "evelyn": 26687,
+ "evement": 8210,
+ "even": 6359,
+ "even": 1427,
+ "evening": 34487,
+ "evening": 2285,
+ "evenings": 19994,
+ "evenly": 45974,
+ "event": 10612,
+ "event": 1655,
+ "eventful": 45628,
+ "evento": 38155,
+ "eventprofs": 24980,
+ "events": 3667,
+ "eventu": 14055,
+ "eventual": 45321,
+ "eventually": 14397,
+ "ever": 888,
+ "ever": 1247,
+ "everest": 21722,
+ "everett": 25456,
+ "everglades": 46294,
+ "evergreen": 23852,
+ "everlasting": 32849,
+ "evers": 31914,
+ "everton": 13315,
+ "every": 1091,
+ "every": 1505,
+ "everybody": 5901,
+ "everyday": 25049,
+ "everyday": 5160,
+ "everyone": 1584,
+ "everything": 36376,
+ "everything": 2410,
+ "everytime": 16911,
+ "everywhere": 6364,
+ "eves": 7323,
+ "evi": 5348,
+ "evi": 36989,
+ "evic": 21336,
+ "eviction": 37111,
+ "eviden": 46220,
+ "evidence": 6439,
+ "evident": 34529,
+ "evie": 47195,
+ "evil": 23218,
+ "evil": 6006,
+ "eville": 16143,
+ "eving": 24729,
+ "evo": 17962,
+ "evo": 13169,
+ "evoc": 43133,
+ "evol": 5350,
+ "evolu": 7725,
+ "evolution": 8902,
+ "evolutionary": 30629,
+ "evolve": 23406,
+ "evolved": 22613,
+ "evolving": 23675,
+ "evp": 46154,
+ "evs": 33576,
+ "ew": 11942,
+ "ew": 15428,
+ "ewan": 40247,
+ "ewe": 48438,
+ "ewing": 38873,
+ "ews": 9878,
+ "ex": 659,
+ "ex": 4118,
+ "exac": 5460,
+ "exact": 12651,
+ "exactly": 5840,
+ "exagger": 29766,
+ "exal": 49324,
+ "exam": 4428,
+ "exam": 8785,
+ "examination": 20970,
+ "examine": 25728,
+ "examined": 44004,
+ "examiner": 29149,
+ "examines": 28160,
+ "examining": 30616,
+ "example": 6228,
+ "examples": 14790,
+ "exams": 14028,
+ "exas": 47536,
+ "exc": 1302,
+ "excav": 20733,
+ "excavation": 45909,
+ "exce": 10999,
+ "exceed": 32521,
+ "exceeded": 36221,
+ "exceeding": 47213,
+ "exceeds": 49353,
+ "excel": 28351,
+ "excel": 18754,
+ "excell": 3298,
+ "excellence": 8171,
+ "excellency": 36503,
+ "excellent": 4239,
+ "excelsi": 47315,
+ "excep": 8882,
+ "except": 8541,
+ "exception": 25018,
+ "exceptional": 13425,
+ "exceptionally": 29306,
+ "excer": 17737,
+ "excerpt": 20586,
+ "excess": 22491,
+ "excessive": 21332,
+ "exchange": 6616,
+ "exchanged": 48919,
+ "exchanges": 29730,
+ "exchanging": 47760,
+ "excit": 10510,
+ "excite": 47711,
+ "excited": 1889,
+ "excitement": 11407,
+ "exciting": 4300,
+ "exclu": 3114,
+ "exclude": 49235,
+ "excluded": 46216,
+ "excluding": 44326,
+ "exclusion": 40219,
+ "exclusive": 3747,
+ "exclusively": 13565,
+ "exclusives": 47149,
+ "excu": 7324,
+ "excur": 27533,
+ "excursion": 34869,
+ "excuse": 9266,
+ "excuses": 19388,
+ "exe": 3554,
+ "exe": 48027,
+ "exec": 15052,
+ "execs": 35728,
+ "execu": 4360,
+ "execute": 36405,
+ "executed": 20432,
+ "execution": 18085,
+ "executive": 5944,
+ "executives": 24357,
+ "exem": 19753,
+ "exemp": 28602,
+ "exempl": 36371,
+ "exemplary": 39123,
+ "exempli": 41934,
+ "exempt": 44278,
+ "exemption": 47481,
+ "exer": 40295,
+ "exerc": 5932,
+ "exercise": 7016,
+ "exercises": 19669,
+ "exercising": 39036,
+ "exeter": 32137,
+ "exeter": 18837,
+ "exfoli": 38823,
+ "exhau": 11154,
+ "exhaust": 21812,
+ "exhausted": 21741,
+ "exhausting": 40035,
+ "exhaustion": 49221,
+ "exhi": 3022,
+ "exhib": 3783,
+ "exhibit": 24992,
+ "exhibit": 8209,
+ "exhibiting": 23889,
+ "exhibition": 4219,
+ "exhibitions": 28311,
+ "exhibitor": 44192,
+ "exhibitors": 38542,
+ "exhibits": 30093,
+ "exhilar": 40262,
+ "exhilarating": 49289,
+ "exi": 5297,
+ "exico": 38712,
+ "exile": 28566,
+ "exist": 10899,
+ "exist": 9645,
+ "existed": 23198,
+ "existence": 13832,
+ "existent": 43541,
+ "existential": 38752,
+ "existing": 12886,
+ "exists": 14608,
+ "exit": 9374,
+ "exited": 37581,
+ "exiting": 39577,
+ "exits": 34943,
+ "exmoor": 48260,
+ "exo": 15600,
+ "exo": 5842,
+ "exodus": 30098,
+ "exol": 42856,
+ "exop": 35288,
+ "exoplan": 37980,
+ "exor": 24506,
+ "exorcist": 46309,
+ "exotic": 15639,
+ "exp": 9923,
+ "exp": 19066,
+ "expan": 7512,
+ "expand": 10382,
+ "expand": 13141,
+ "expanded": 18390,
+ "expanding": 15755,
+ "expands": 22223,
+ "expanse": 46886,
+ "expansion": 10138,
+ "expansive": 49261,
+ "expat": 43900,
+ "expe": 2560,
+ "expect": 9802,
+ "expect": 5716,
+ "expectation": 34273,
+ "expectations": 12529,
+ "expected": 5573,
+ "expecting": 12525,
+ "expects": 24536,
+ "expedition": 16761,
+ "expeditions": 49327,
+ "expelled": 48834,
+ "expen": 7216,
+ "expend": 29302,
+ "expenditure": 47044,
+ "expense": 28473,
+ "expenses": 21797,
+ "expensive": 9649,
+ "exper": 1533,
+ "experi": 4723,
+ "experience": 31867,
+ "experience": 2415,
+ "experienced": 10417,
+ "experiences": 8233,
+ "experiencing": 16643,
+ "experiential": 44952,
+ "experim": 6697,
+ "experiment": 13079,
+ "experimental": 16539,
+ "experimenting": 28263,
+ "experiments": 21077,
+ "expert": 6284,
+ "expertise": 16555,
+ "experts": 6960,
+ "expi": 26850,
+ "expir": 35077,
+ "expire": 49315,
+ "expired": 30200,
+ "expires": 34739,
+ "expl": 3261,
+ "expla": 3517,
+ "explain": 48918,
+ "explain": 7304,
+ "explained": 14229,
+ "explaining": 13136,
+ "explains": 6655,
+ "explan": 13294,
+ "explanation": 16577,
+ "explanations": 34383,
+ "explic": 21011,
+ "explicit": 33228,
+ "explo": 3586,
+ "explode": 31262,
+ "exploded": 28947,
+ "explodes": 38119,
+ "exploding": 34683,
+ "exploit": 36953,
+ "exploited": 48554,
+ "explor": 11958,
+ "exploration": 14043,
+ "explore": 10405,
+ "explore": 5147,
+ "explorebc": 38754,
+ "explorecanada": 36600,
+ "explored": 25016,
+ "explorer": 15776,
+ "explorers": 28491,
+ "explores": 13996,
+ "exploring": 7584,
+ "explosion": 13785,
+ "explosions": 38646,
+ "explosive": 18888,
+ "explosives": 44705,
+ "expo": 7820,
+ "expo": 6344,
+ "expon": 27905,
+ "export": 14444,
+ "exporting": 47433,
+ "exports": 20088,
+ "expose": 23181,
+ "exposed": 12180,
+ "exposes": 33575,
+ "exposing": 28362,
+ "exposition": 36943,
+ "exposure": 11903,
+ "expre": 6085,
+ "express": 18553,
+ "express": 5642,
+ "expressed": 20777,
+ "expresses": 31931,
+ "expressing": 30207,
+ "expression": 11357,
+ "expressions": 20314,
+ "expressive": 42060,
+ "expressway": 31658,
+ "exquis": 16575,
+ "exquisite": 17958,
+ "ext": 5711,
+ "ext": 20072,
+ "exten": 5555,
+ "extend": 14492,
+ "extended": 9614,
+ "extending": 25652,
+ "extends": 20688,
+ "extension": 10275,
+ "extensions": 24525,
+ "extensive": 16870,
+ "extensively": 47365,
+ "extent": 24913,
+ "exter": 9797,
+ "exterior": 19352,
+ "extermin": 41671,
+ "external": 15028,
+ "extin": 13553,
+ "extinct": 24488,
+ "extinction": 21186,
+ "extingui": 38567,
+ "extor": 35620,
+ "extr": 29082,
+ "extra": 6416,
+ "extra": 4231,
+ "extrac": 18550,
+ "extract": 18962,
+ "extraction": 28789,
+ "extracts": 45576,
+ "extraordin": 23628,
+ "extraordinaire": 30909,
+ "extraordinary": 10982,
+ "extras": 29817,
+ "extravag": 22299,
+ "extravaganza": 29461,
+ "extre": 3978,
+ "extreme": 38357,
+ "extreme": 8331,
+ "extremely": 6519,
+ "extremism": 31493,
+ "extremist": 36383,
+ "extremists": 41425,
+ "extru": 43010,
+ "ey": 1541,
+ "ey": 1477,
+ "eyang": 28915,
+ "eye": 5034,
+ "eye": 3272,
+ "eyebrow": 34250,
+ "eyebrows": 19923,
+ "eyed": 15512,
+ "eyeing": 34916,
+ "eyel": 17075,
+ "eyelashes": 42074,
+ "eyeliner": 33354,
+ "eyeon": 25126,
+ "eyes": 3095,
+ "eyeshadow": 35213,
+ "eyewear": 30165,
+ "eyewitness": 36258,
+ "eyou": 31996,
+ "eyour": 40229,
+ "eyre": 44115,
+ "ez": 10082,
+ "ez": 8387,
+ "eze": 25993,
+ "eze": 27229,
+ "ezekiel": 41428,
+ "ezra": 27552,
+ "f": 69,
+ "f": 325,
+ "fa": 778,
+ "fa": 2800,
+ "faa": 27577,
+ "fab": 2833,
+ "fab": 5492,
+ "faber": 43461,
+ "faber": 42488,
+ "fabi": 29425,
+ "fabian": 34539,
+ "fabio": 31666,
+ "fabric": 16217,
+ "fabric": 10033,
+ "fabricated": 40851,
+ "fabrication": 33476,
+ "fabrics": 23159,
+ "fabulous": 5189,
+ "fac": 1053,
+ "fac": 35438,
+ "facade": 29217,
+ "face": 2545,
+ "face": 1710,
+ "facebook": 36156,
+ "facebook": 2943,
+ "faced": 10941,
+ "faceli": 32023,
+ "facelift": 36380,
+ "faceoff": 42710,
+ "facep": 45285,
+ "faces": 4905,
+ "faceted": 43435,
+ "facetime": 24076,
+ "facial": 11909,
+ "facil": 39973,
+ "facilit": 13567,
+ "facilitate": 26733,
+ "facilitated": 43853,
+ "facilitating": 34796,
+ "facilities": 10388,
+ "facility": 8165,
+ "facing": 7619,
+ "fact": 17189,
+ "fact": 3598,
+ "factfriday": 27953,
+ "faction": 14629,
+ "factor": 21082,
+ "factor": 8124,
+ "factories": 36492,
+ "factors": 12733,
+ "factory": 42483,
+ "factory": 6072,
+ "facts": 5085,
+ "factual": 45471,
+ "faculty": 9504,
+ "facup": 25283,
+ "fad": 12632,
+ "fad": 47669,
+ "fade": 20486,
+ "faded": 26051,
+ "fades": 40441,
+ "fading": 32882,
+ "fadnavis": 38945,
+ "faf": 31052,
+ "faf": 43903,
+ "fag": 25617,
+ "fag": 39305,
+ "fah": 25495,
+ "fah": 35429,
+ "fahren": 45527,
+ "fai": 20519,
+ "fai": 26384,
+ "fail": 7105,
+ "fail": 6801,
+ "failed": 8314,
+ "failing": 15757,
+ "fails": 13388,
+ "failure": 8732,
+ "failures": 25442,
+ "faint": 30807,
+ "fair": 3031,
+ "fair": 2849,
+ "fairbanks": 43962,
+ "faire": 34745,
+ "faire": 20798,
+ "fairfax": 29368,
+ "fairfield": 29664,
+ "fairgrounds": 38325,
+ "fairi": 28884,
+ "fairies": 33590,
+ "fairly": 14961,
+ "fairmont": 41547,
+ "fairness": 29388,
+ "fairs": 8655,
+ "fairtrade": 33361,
+ "fairview": 43479,
+ "fairway": 44022,
+ "fairy": 17021,
+ "fairy": 10444,
+ "fairytale": 28944,
+ "fais": 23542,
+ "faisal": 35459,
+ "fait": 20567,
+ "faith": 10653,
+ "faith": 5080,
+ "faithful": 15511,
+ "faiz": 41775,
+ "fake": 18794,
+ "fake": 5777,
+ "faken": 22853,
+ "fakenews": 26943,
+ "fakespeare": 49095,
+ "fal": 2778,
+ "fal": 40494,
+ "fala": 47120,
+ "falcon": 22498,
+ "falcon": 13571,
+ "falcons": 13834,
+ "falk": 34648,
+ "falkirk": 44080,
+ "fall": 6489,
+ "fall": 2359,
+ "fallen": 8688,
+ "falling": 48709,
+ "falling": 7293,
+ "fallon": 39596,
+ "fallon": 21281,
+ "fallontonight": 44627,
+ "fallout": 49365,
+ "fallout": 16009,
+ "falls": 4778,
+ "falmouth": 38261,
+ "false": 38948,
+ "false": 9078,
+ "falsely": 42321,
+ "fam": 1058,
+ "fam": 5128,
+ "fame": 6573,
+ "famed": 23302,
+ "famer": 24554,
+ "famil": 3395,
+ "famili": 8488,
+ "familia": 25622,
+ "familiar": 10020,
+ "families": 4612,
+ "family": 8137,
+ "family": 1315,
+ "familyfun": 46308,
+ "familytime": 47236,
+ "familytravel": 38222,
+ "famine": 35847,
+ "famous": 44811,
+ "famous": 4096,
+ "famously": 44505,
+ "fan": 1675,
+ "fan": 2261,
+ "fanart": 41059,
+ "fanart": 7855,
+ "fanartfriday": 45346,
+ "fanatic": 36643,
+ "fanatics": 39610,
+ "fanbase": 36921,
+ "fanboy": 43369,
+ "fanc": 29017,
+ "fancafe": 45080,
+ "fanci": 35908,
+ "fanclub": 31530,
+ "fancy": 47622,
+ "fancy": 6733,
+ "fand": 19684,
+ "fandom": 47634,
+ "fandom": 11534,
+ "fanfest": 42916,
+ "fanfic": 47243,
+ "fang": 14269,
+ "fang": 27428,
+ "fangirl": 28813,
+ "fangirling": 39463,
+ "fanning": 37282,
+ "fanny": 30401,
+ "fans": 32454,
+ "fans": 1840,
+ "fansign": 25288,
+ "fant": 4467,
+ "fanta": 2703,
+ "fantaken": 39412,
+ "fantasia": 49306,
+ "fantastic": 31289,
+ "fantastic": 2935,
+ "fantasy": 15124,
+ "fantasy": 5267,
+ "fantasyfootball": 35713,
+ "fao": 31155,
+ "faq": 28533,
+ "far": 1578,
+ "far": 2384,
+ "fara": 48562,
+ "farage": 28340,
+ "farah": 31547,
+ "fare": 8620,
+ "fare": 6461,
+ "fares": 27525,
+ "farewell": 10734,
+ "fargo": 18870,
+ "fari": 26197,
+ "farley": 43761,
+ "farm": 9066,
+ "farm": 3985,
+ "farmer": 19735,
+ "farmer": 10474,
+ "farmers": 29752,
+ "farmers": 6402,
+ "farmersmarket": 41808,
+ "farmhouse": 26293,
+ "farming": 10399,
+ "farmington": 49305,
+ "farmland": 45258,
+ "farms": 11277,
+ "farn": 27527,
+ "faroo": 39147,
+ "farra": 33657,
+ "farrakhan": 46293,
+ "farrell": 24234,
+ "fart": 34664,
+ "farther": 42233,
+ "fas": 4830,
+ "fas": 42995,
+ "fasci": 17191,
+ "fascin": 7327,
+ "fascinated": 32964,
+ "fascinating": 8640,
+ "fascism": 28213,
+ "fascist": 23870,
+ "fascists": 43598,
+ "fash": 42682,
+ "fashi": 2099,
+ "fashion": 6976,
+ "fashion": 2444,
+ "fashionable": 24597,
+ "fashionblogger": 31726,
+ "fashioned": 21563,
+ "fashioni": 26062,
+ "fashionista": 30415,
+ "fashions": 37601,
+ "fashionshow": 45653,
+ "fashionweek": 28684,
+ "fass": 42398,
+ "fast": 8509,
+ "fast": 1953,
+ "fasten": 44990,
+ "faster": 8835,
+ "fastest": 9808,
+ "fasting": 24656,
+ "fat": 4751,
+ "fat": 5484,
+ "fatal": 12124,
+ "fatalities": 44168,
+ "fatally": 34069,
+ "fate": 26315,
+ "fate": 11734,
+ "father": 11607,
+ "father": 3224,
+ "fathers": 12780,
+ "fathersday": 16731,
+ "fati": 13430,
+ "fatigue": 23747,
+ "fatima": 28202,
+ "fats": 30151,
+ "fatt": 44131,
+ "fatty": 22953,
+ "fau": 5571,
+ "fau": 31381,
+ "faucet": 44273,
+ "faul": 16230,
+ "faulkner": 37840,
+ "fault": 13862,
+ "faults": 42752,
+ "faulty": 47103,
+ "fauna": 30808,
+ "faust": 44772,
+ "faux": 19429,
+ "fav": 1355,
+ "fav": 5426,
+ "fave": 7272,
+ "faves": 18003,
+ "favor": 1766,
+ "favor": 12160,
+ "favorable": 35392,
+ "favored": 46640,
+ "favorite": 35262,
+ "favorite": 1916,
+ "favorited": 36926,
+ "favorites": 10564,
+ "favors": 36085,
+ "favour": 3111,
+ "favour": 20469,
+ "favourite": 3342,
+ "favourites": 16585,
+ "favs": 18879,
+ "faw": 21800,
+ "fawad": 46425,
+ "fawn": 48624,
+ "fax": 32535,
+ "fax": 9337,
+ "fay": 8939,
+ "fay": 40074,
+ "faye": 30257,
+ "fayette": 32043,
+ "fayette": 19782,
+ "fayetteville": 37771,
+ "fayre": 34982,
+ "faz": 26238,
+ "faze": 44880,
+ "fb": 22637,
+ "fb": 3307,
+ "fball": 29663,
+ "fbf": 20004,
+ "fbi": 10293,
+ "fbloggers": 41389,
+ "fbs": 48454,
+ "fc": 4278,
+ "fc": 1399,
+ "fca": 24540,
+ "fcb": 26639,
+ "fcb": 25045,
+ "fcbarcelona": 32174,
+ "fcbayern": 35033,
+ "fcblive": 44608,
+ "fcc": 21240,
+ "fck": 40080,
+ "fck": 49263,
+ "fcofficial": 27805,
+ "fcs": 32095,
+ "fcu": 47898,
+ "fd": 16972,
+ "fd": 11525,
+ "fda": 17823,
+ "fdi": 45579,
+ "fdn": 18563,
+ "fdny": 41084,
+ "fdr": 42298,
+ "fe": 623,
+ "fe": 873,
+ "fear": 8744,
+ "fear": 5402,
+ "feared": 31154,
+ "fearless": 17470,
+ "fears": 13867,
+ "fearthe": 33449,
+ "feasi": 34977,
+ "feast": 37963,
+ "feast": 9564,
+ "feat": 1703,
+ "feat": 5611,
+ "feather": 24905,
+ "feather": 17871,
+ "feathers": 21138,
+ "featherweight": 44939,
+ "feature": 30413,
+ "feature": 4527,
+ "featured": 4743,
+ "features": 4643,
+ "featuring": 3706,
+ "feb": 4317,
+ "febru": 4202,
+ "february": 4248,
+ "fect": 31293,
+ "fed": 22518,
+ "fed": 7035,
+ "feder": 4737,
+ "federal": 6369,
+ "federation": 15530,
+ "federer": 18246,
+ "federico": 40539,
+ "fedex": 32603,
+ "fedora": 45111,
+ "feds": 30593,
+ "fee": 28242,
+ "fee": 9224,
+ "feed": 6662,
+ "feed": 5839,
+ "feedback": 8683,
+ "feeder": 24482,
+ "feeders": 44523,
+ "feeding": 9879,
+ "feeds": 21788,
+ "feel": 2408,
+ "feel": 2051,
+ "feelin": 19903,
+ "feeling": 33087,
+ "feeling": 3045,
+ "feelings": 9452,
+ "feels": 4808,
+ "feelthe": 22322,
+ "feelthebern": 27743,
+ "fees": 11765,
+ "feet": 4804,
+ "fei": 23441,
+ "fei": 34217,
+ "fein": 46707,
+ "feinstein": 41313,
+ "fel": 2081,
+ "fel": 20304,
+ "feld": 45913,
+ "feld": 14219,
+ "feldman": 41942,
+ "feli": 7498,
+ "felic": 25845,
+ "felici": 23379,
+ "felicia": 41139,
+ "felicidades": 41648,
+ "felicity": 35123,
+ "feline": 29471,
+ "felipe": 27681,
+ "felix": 33455,
+ "felix": 16514,
+ "feliz": 26104,
+ "feliz": 20221,
+ "fell": 33540,
+ "fell": 6266,
+ "fella": 17586,
+ "fellas": 18787,
+ "feller": 29226,
+ "fellow": 12099,
+ "fellow": 5242,
+ "fellows": 15766,
+ "fellowship": 13857,
+ "felony": 31068,
+ "felt": 5413,
+ "fem": 24574,
+ "fem": 36615,
+ "fema": 41721,
+ "female": 22062,
+ "female": 3970,
+ "females": 21028,
+ "femi": 38607,
+ "femin": 11423,
+ "femini": 11894,
+ "feminine": 24911,
+ "feminism": 18784,
+ "feminist": 14921,
+ "feminists": 38809,
+ "femme": 31331,
+ "fen": 5509,
+ "fen": 25024,
+ "fence": 12679,
+ "fences": 34312,
+ "fencing": 23489,
+ "fender": 17117,
+ "fener": 41208,
+ "fenerbah": 46652,
+ "feng": 33291,
+ "fennel": 28689,
+ "fent": 26395,
+ "fenton": 47265,
+ "fenway": 29206,
+ "fer": 1765,
+ "fer": 2897,
+ "fera": 37705,
+ "feral": 29972,
+ "ferdin": 25541,
+ "ferdinand": 27591,
+ "fere": 43144,
+ "feren": 35652,
+ "ference": 19984,
+ "ferg": 44938,
+ "fergie": 39119,
+ "fergu": 10988,
+ "fergus": 42041,
+ "ferguson": 11904,
+ "fermentation": 45817,
+ "fermented": 36886,
+ "fern": 10747,
+ "fern": 21685,
+ "fernandes": 44391,
+ "fernandez": 23436,
+ "fernando": 17140,
+ "ferns": 38277,
+ "feroci": 45652,
+ "ferr": 7256,
+ "ferra": 47911,
+ "ferrari": 9606,
+ "ferre": 29626,
+ "ferred": 10432,
+ "ferreira": 48686,
+ "ferrell": 41112,
+ "ferrer": 38904,
+ "ferri": 42008,
+ "ferries": 28489,
+ "ferris": 27532,
+ "ferry": 38936,
+ "ferry": 10278,
+ "fers": 12378,
+ "fert": 14925,
+ "fert": 43662,
+ "fertil": 41987,
+ "fertile": 44837,
+ "fertili": 23912,
+ "fertility": 23528,
+ "fertilizer": 36786,
+ "fery": 47448,
+ "fes": 32300,
+ "fest": 17383,
+ "fest": 2590,
+ "festa": 42124,
+ "festi": 1943,
+ "festiv": 19222,
+ "festival": 20946,
+ "festival": 2240,
+ "festivals": 17834,
+ "festive": 9533,
+ "festivities": 21020,
+ "fet": 21409,
+ "feta": 31705,
+ "fetal": 42031,
+ "fetch": 30271,
+ "fete": 34629,
+ "fett": 37979,
+ "fetus": 26768,
+ "feu": 24912,
+ "feu": 32990,
+ "feud": 27365,
+ "fever": 40896,
+ "fever": 9989,
+ "fevre": 43861,
+ "few": 1939,
+ "fewer": 19128,
+ "fex": 41584,
+ "fex": 26392,
+ "fey": 39069,
+ "fey": 23298,
+ "fez": 43081,
+ "ff": 1021,
+ "ff": 1304,
+ "ffa": 15355,
+ "ffame": 42873,
+ "ffc": 19832,
+ "ffe": 1138,
+ "ffe": 8631,
+ "ffect": 29151,
+ "ffed": 8448,
+ "ffee": 26377,
+ "ffel": 22656,
+ "ffen": 46537,
+ "ffer": 27369,
+ "ffer": 11636,
+ "ffers": 32163,
+ "fferty": 44771,
+ "ffes": 46441,
+ "ffey": 30138,
+ "fff": 28106,
+ "ffi": 19961,
+ "ffic": 4762,
+ "ffice": 26044,
+ "ffici": 3639,
+ "fficial": 39818,
+ "fficial": 6463,
+ "fficiency": 27800,
+ "fficient": 20424,
+ "ffin": 12779,
+ "ffin": 7367,
+ "ffing": 16592,
+ "ffins": 17898,
+ "ffl": 39490,
+ "ffle": 7749,
+ "ffler": 39819,
+ "ffles": 19344,
+ "ffman": 15823,
+ "ffo": 42264,
+ "ffs": 4424,
+ "ffxiv": 26569,
+ "ffxv": 46786,
+ "ffy": 26404,
+ "ffy": 7795,
+ "fg": 45977,
+ "fg": 6823,
+ "fgm": 32178,
+ "fgo": 46113,
+ "fh": 21649,
+ "fh": 21010,
+ "fhs": 45094,
+ "fi": 701,
+ "fi": 3589,
+ "fia": 8827,
+ "fiable": 34373,
+ "fianc": 27752,
+ "fiance": 44114,
+ "fiancé": 34039,
+ "fiasco": 40944,
+ "fiat": 16740,
+ "fiawec": 39485,
+ "fib": 40594,
+ "fiba": 34993,
+ "fiber": 35074,
+ "fiber": 12612,
+ "fibers": 44587,
+ "fibre": 21401,
+ "fibro": 21294,
+ "fibrosis": 36307,
+ "fic": 1788,
+ "fic": 2059,
+ "fica": 26952,
+ "fically": 14854,
+ "fication": 4523,
+ "fications": 12512,
+ "ficial": 48192,
+ "fics": 42505,
+ "fiction": 6218,
+ "fictional": 25570,
+ "fid": 34197,
+ "fid": 23966,
+ "fidd": 25218,
+ "fiddle": 35968,
+ "fide": 45375,
+ "fidel": 21740,
+ "fidel": 36837,
+ "fidelity": 30109,
+ "fidget": 48664,
+ "fie": 28487,
+ "fie": 10348,
+ "fied": 29642,
+ "fied": 2853,
+ "fiel": 1361,
+ "field": 7571,
+ "field": 1570,
+ "fielder": 11046,
+ "fieldhouse": 37969,
+ "fielding": 30465,
+ "fields": 6494,
+ "fieldwork": 33155,
+ "fiends": 37869,
+ "fier": 11167,
+ "fier": 10598,
+ "fierc": 48609,
+ "fierce": 13896,
+ "fiercely": 49039,
+ "fiers": 16113,
+ "fiery": 24557,
+ "fies": 9537,
+ "fiesta": 14580,
+ "fif": 5309,
+ "fifa": 21976,
+ "fifa": 8516,
+ "fifaworldcup": 38819,
+ "fifawwc": 41329,
+ "fife": 24374,
+ "fifteen": 29504,
+ "fifth": 25515,
+ "fifth": 8772,
+ "fifthharmony": 31075,
+ "fifty": 24456,
+ "fifty": 15978,
+ "fig": 4814,
+ "fig": 20719,
+ "figaro": 48044,
+ "figh": 23274,
+ "fight": 5262,
+ "fight": 2757,
+ "fighter": 35884,
+ "fighter": 6438,
+ "fighters": 7371,
+ "fightfor": 48909,
+ "fightfor": 35740,
+ "fighting": 38625,
+ "fighting": 4652,
+ "fighton": 45578,
+ "fights": 12132,
+ "figs": 38882,
+ "figu": 6390,
+ "figur": 16948,
+ "figurative": 44042,
+ "figure": 48820,
+ "figure": 5274,
+ "figured": 15630,
+ "figures": 8739,
+ "figurine": 33306,
+ "figuring": 31513,
+ "fiji": 48270,
+ "fiji": 18285,
+ "fik": 46589,
+ "fil": 1142,
+ "fil": 14915,
+ "fila": 30992,
+ "filament": 49252,
+ "file": 12545,
+ "file": 4512,
+ "filed": 13864,
+ "files": 7850,
+ "filet": 43155,
+ "fili": 9590,
+ "filing": 16576,
+ "filip": 14368,
+ "filipino": 19153,
+ "fill": 15904,
+ "fill": 6277,
+ "filled": 5589,
+ "filler": 32816,
+ "fillers": 45005,
+ "fillet": 39276,
+ "filling": 9736,
+ "fillion": 38048,
+ "fillmore": 43922,
+ "fills": 21750,
+ "filly": 27690,
+ "film": 5117,
+ "film": 1860,
+ "filmed": 15801,
+ "filmfare": 42224,
+ "filmfest": 24508,
+ "filmfestival": 28066,
+ "filming": 6866,
+ "filmmaker": 17202,
+ "filmmakers": 24896,
+ "filmmaking": 18226,
+ "films": 5370,
+ "fils": 40271,
+ "filter": 7541,
+ "filtered": 29926,
+ "filtering": 47770,
+ "filters": 18385,
+ "filth": 39713,
+ "filthy": 26899,
+ "filtr": 21408,
+ "filtration": 42036,
+ "fim": 47525,
+ "fin": 735,
+ "fin": 10663,
+ "fina": 34497,
+ "final": 11968,
+ "final": 1755,
+ "finale": 7844,
+ "finalfantasy": 44543,
+ "finalfour": 46999,
+ "finalist": 12620,
+ "finalists": 13422,
+ "finalized": 48930,
+ "finally": 1992,
+ "finals": 4536,
+ "finan": 4807,
+ "finance": 6117,
+ "finances": 28767,
+ "financi": 12846,
+ "financial": 19783,
+ "financial": 4930,
+ "financially": 28124,
+ "financing": 18375,
+ "finch": 18523,
+ "find": 18638,
+ "find": 1416,
+ "finder": 15045,
+ "finders": 43884,
+ "findia": 47064,
+ "finding": 37455,
+ "finding": 6002,
+ "findings": 16529,
+ "findlay": 48227,
+ "findom": 36463,
+ "finds": 6680,
+ "findyour": 25936,
+ "findyourpark": 38924,
+ "fine": 12042,
+ "fine": 3797,
+ "fineart": 7484,
+ "fineart": 16005,
+ "fineartamerica": 7724,
+ "fined": 20094,
+ "finely": 46120,
+ "finer": 36681,
+ "fines": 25053,
+ "finesse": 46047,
+ "finest": 7707,
+ "fing": 6485,
+ "fing": 17955,
+ "finger": 13480,
+ "finger": 8895,
+ "fingerprint": 39579,
+ "fingers": 9690,
+ "fini": 2405,
+ "finish": 42178,
+ "finish": 3958,
+ "finished": 3078,
+ "finisher": 38636,
+ "finishers": 48661,
+ "finishes": 13078,
+ "finishing": 7912,
+ "finite": 48312,
+ "finity": 41463,
+ "finity": 21273,
+ "fink": 40158,
+ "finland": 10775,
+ "finley": 41652,
+ "finn": 28479,
+ "finn": 16925,
+ "finna": 35180,
+ "finnish": 19616,
+ "fino": 30083,
+ "fins": 32810,
+ "fintech": 48929,
+ "fintech": 8899,
+ "fion": 27476,
+ "fiona": 20099,
+ "fior": 37086,
+ "fiore": 44997,
+ "fioren": 33188,
+ "fiorentina": 43713,
+ "fios": 42521,
+ "fir": 770,
+ "fir": 16233,
+ "fire": 2951,
+ "fire": 1769,
+ "firearm": 40311,
+ "firearms": 23960,
+ "fireball": 40543,
+ "firec": 42806,
+ "fired": 8846,
+ "firefighter": 20498,
+ "firefighters": 12600,
+ "firefly": 33997,
+ "firefox": 35372,
+ "fireman": 46085,
+ "firen": 34752,
+ "firenze": 38445,
+ "fireplace": 23050,
+ "fires": 8749,
+ "fireside": 36185,
+ "firework": 40750,
+ "fireworks": 10641,
+ "firing": 15105,
+ "firm": 16936,
+ "firm": 7705,
+ "firmly": 29156,
+ "firms": 13655,
+ "firmware": 42691,
+ "first": 6853,
+ "first": 874,
+ "firstdayof": 44297,
+ "firsth": 48512,
+ "firsts": 47884,
+ "firth": 26078,
+ "fis": 7846,
+ "fis": 47683,
+ "fiscal": 20825,
+ "fischer": 26532,
+ "fish": 6431,
+ "fish": 2759,
+ "fisher": 11175,
+ "fisher": 9176,
+ "fisheries": 24612,
+ "fisherman": 25055,
+ "fishermen": 28547,
+ "fishers": 42065,
+ "fishery": 49057,
+ "fishes": 35470,
+ "fishing": 31703,
+ "fishing": 4935,
+ "fishy": 35665,
+ "fist": 48340,
+ "fist": 17085,
+ "fit": 2366,
+ "fit": 2478,
+ "fitbit": 33768,
+ "fitch": 44614,
+ "fitfam": 20662,
+ "fitnes": 47285,
+ "fitness": 20044,
+ "fitness": 4838,
+ "fits": 6401,
+ "fitt": 32994,
+ "fitted": 14863,
+ "fitter": 42096,
+ "fitters": 32364,
+ "fitting": 11769,
+ "fittings": 45787,
+ "fitz": 11120,
+ "fitz": 25913,
+ "fitzgerald": 20606,
+ "fitzpatrick": 37141,
+ "fiu": 38374,
+ "five": 19508,
+ "five": 3127,
+ "fives": 44066,
+ "fix": 4596,
+ "fix": 6028,
+ "fixed": 9393,
+ "fixes": 25473,
+ "fixing": 17423,
+ "fixture": 17317,
+ "fixtures": 19904,
+ "fizz": 31242,
+ "fj": 43183,
+ "fj": 46447,
+ "fjor": 31260,
+ "fk": 12410,
+ "fl": 1082,
+ "fl": 2685,
+ "fla": 1577,
+ "fla": 20292,
+ "flag": 11536,
+ "flag": 4859,
+ "flagged": 45012,
+ "flags": 12221,
+ "flagship": 19779,
+ "flagstaff": 40406,
+ "flair": 24938,
+ "flake": 21221,
+ "flakes": 20934,
+ "flam": 10559,
+ "flame": 40351,
+ "flame": 13484,
+ "flamen": 28826,
+ "flamenco": 37362,
+ "flames": 13441,
+ "flamin": 42693,
+ "flaming": 34782,
+ "flamingo": 30323,
+ "flan": 14572,
+ "flanagan": 28641,
+ "flanders": 34837,
+ "flank": 44553,
+ "flann": 39510,
+ "flannel": 37807,
+ "flap": 35253,
+ "flappy": 40241,
+ "flare": 21185,
+ "flares": 46088,
+ "flash": 6089,
+ "flash": 5815,
+ "flashback": 14616,
+ "flashback": 11988,
+ "flashbackfriday": 15014,
+ "flashbacks": 47056,
+ "flashes": 31259,
+ "flashing": 31764,
+ "flashlight": 37256,
+ "flask": 36194,
+ "flat": 8986,
+ "flat": 6313,
+ "flats": 17228,
+ "flatt": 45498,
+ "flattering": 43267,
+ "flaun": 41421,
+ "flav": 7191,
+ "flavo": 28895,
+ "flavor": 31835,
+ "flavor": 11818,
+ "flavored": 29350,
+ "flavorful": 49135,
+ "flavors": 16930,
+ "flavour": 17026,
+ "flavoured": 42397,
+ "flavours": 21083,
+ "flaw": 14268,
+ "flaw": 34978,
+ "flawed": 35136,
+ "flawless": 15531,
+ "flaws": 30492,
+ "flax": 43443,
+ "fle": 2428,
+ "fle": 44964,
+ "flea": 24883,
+ "fleck": 28143,
+ "fled": 26731,
+ "flee": 19427,
+ "flee": 30167,
+ "fleece": 25038,
+ "fleeing": 30543,
+ "fleek": 43513,
+ "fleet": 35922,
+ "fleet": 9147,
+ "fleetwood": 28883,
+ "fleming": 25769,
+ "fler": 48789,
+ "flesh": 17495,
+ "flet": 16102,
+ "fletcher": 19810,
+ "fleur": 28593,
+ "flew": 13768,
+ "flex": 16426,
+ "flex": 12038,
+ "flexi": 10032,
+ "flexibility": 22547,
+ "flexible": 14502,
+ "flexing": 48483,
+ "fli": 2472,
+ "flick": 13746,
+ "flick": 23414,
+ "flickr": 17755,
+ "flies": 8070,
+ "flight": 24701,
+ "flight": 3795,
+ "flights": 10515,
+ "flin": 24730,
+ "flin": 43816,
+ "flinders": 44647,
+ "fling": 22768,
+ "flint": 28306,
+ "flint": 18324,
+ "flip": 20385,
+ "flip": 11035,
+ "flipk": 30829,
+ "flipkart": 33154,
+ "flipped": 28144,
+ "flipping": 25881,
+ "flips": 35089,
+ "flir": 24330,
+ "flirt": 38352,
+ "flirting": 35243,
+ "flix": 40663,
+ "flo": 1945,
+ "flo": 20711,
+ "float": 16123,
+ "floating": 12619,
+ "floats": 33272,
+ "flock": 36297,
+ "flock": 21822,
+ "flondon": 47366,
+ "floo": 4062,
+ "flood": 23793,
+ "flood": 7148,
+ "flooded": 19706,
+ "flooding": 10204,
+ "floods": 16369,
+ "floor": 23657,
+ "floor": 4125,
+ "flooring": 19227,
+ "floors": 15671,
+ "flop": 22994,
+ "floppy": 38267,
+ "flops": 29146,
+ "flor": 15784,
+ "flor": 41669,
+ "flora": 18906,
+ "floral": 10732,
+ "florals": 48331,
+ "floren": 37706,
+ "florence": 11617,
+ "flores": 21537,
+ "flori": 3482,
+ "florian": 41861,
+ "florida": 34264,
+ "florida": 3966,
+ "florist": 38403,
+ "floss": 36453,
+ "flotus": 35181,
+ "flour": 18592,
+ "flouri": 23239,
+ "flourish": 36038,
+ "flow": 2180,
+ "flow": 5608,
+ "flower": 12772,
+ "flower": 4055,
+ "flowering": 19953,
+ "flowers": 4023,
+ "flowing": 14922,
+ "flown": 25659,
+ "flows": 16715,
+ "floyd": 46369,
+ "floyd": 13656,
+ "flu": 3698,
+ "flu": 13528,
+ "fluctu": 40181,
+ "fluence": 38169,
+ "fluent": 30025,
+ "fluff": 31174,
+ "fluffy": 40346,
+ "fluffy": 17054,
+ "fluid": 43803,
+ "fluid": 16717,
+ "fluids": 41490,
+ "fluor": 45127,
+ "fluore": 26974,
+ "fluorescent": 35036,
+ "fluori": 45611,
+ "flur": 31591,
+ "flush": 25777,
+ "flushing": 43754,
+ "flute": 23746,
+ "flux": 25249,
+ "flwx": 30907,
+ "fly": 5666,
+ "fly": 3228,
+ "flye": 30873,
+ "flyeagles": 39927,
+ "flyeaglesfly": 39931,
+ "flyer": 11875,
+ "flyers": 14181,
+ "flyfishing": 31800,
+ "flying": 20782,
+ "flying": 4610,
+ "flyn": 40676,
+ "flynn": 15721,
+ "flyo": 33506,
+ "flyover": 38083,
+ "fm": 13715,
+ "fm": 3689,
+ "fman": 25152,
+ "fml": 26730,
+ "fmr": 32875,
+ "fn": 22773,
+ "fn": 21763,
+ "fnc": 46506,
+ "fo": 898,
+ "fo": 6157,
+ "foal": 40386,
+ "foam": 30039,
+ "foam": 14587,
+ "foamed": 26711,
+ "fob": 40315,
+ "focal": 30934,
+ "focu": 5827,
+ "focus": 4353,
+ "focused": 9319,
+ "focuses": 20093,
+ "focusing": 15551,
+ "fod": 31015,
+ "fod": 43299,
+ "fodils": 44411,
+ "foe": 22952,
+ "foes": 46279,
+ "fog": 9417,
+ "foggy": 19770,
+ "foil": 17302,
+ "fol": 1106,
+ "fol": 48616,
+ "fold": 35201,
+ "fold": 11021,
+ "foldable": 48307,
+ "folded": 25233,
+ "folder": 25717,
+ "folding": 15464,
+ "folds": 24266,
+ "foley": 22850,
+ "foli": 7713,
+ "folia": 48964,
+ "foliage": 26350,
+ "folio": 10772,
+ "folk": 10665,
+ "folk": 6032,
+ "folke": 47190,
+ "folkl": 27273,
+ "folklore": 22133,
+ "folklore": 28620,
+ "folklorethursday": 23270,
+ "folks": 5422,
+ "follo": 41417,
+ "follow": 1964,
+ "follow": 1979,
+ "followart": 40957,
+ "followback": 33863,
+ "followed": 6499,
+ "follower": 17039,
+ "followers": 4856,
+ "following": 3473,
+ "followme": 29668,
+ "followparty": 44757,
+ "follows": 11287,
+ "followthe": 30747,
+ "folly": 41408,
+ "folsom": 42108,
+ "fom": 34540,
+ "fon": 5017,
+ "fon": 38318,
+ "fond": 19964,
+ "fonda": 44609,
+ "fondue": 48321,
+ "fone": 40672,
+ "font": 37610,
+ "font": 16248,
+ "fontaine": 37864,
+ "fontana": 43643,
+ "fontein": 45062,
+ "fonts": 32801,
+ "foo": 1183,
+ "foo": 23435,
+ "food": 4586,
+ "food": 1559,
+ "foodand": 38317,
+ "foodbank": 31926,
+ "foodie": 30762,
+ "foodie": 9847,
+ "foodies": 22416,
+ "foodnetwork": 46793,
+ "foods": 7057,
+ "foodsecurity": 49329,
+ "foodtruck": 47682,
+ "fool": 23959,
+ "fool": 12212,
+ "fooled": 28761,
+ "fooling": 47964,
+ "foolish": 33824,
+ "fools": 15946,
+ "foot": 6702,
+ "foot": 4738,
+ "footage": 11130,
+ "footb": 33466,
+ "football": 9376,
+ "football": 1882,
+ "footballer": 20646,
+ "footballers": 30269,
+ "footed": 38040,
+ "footh": 25951,
+ "foothills": 37020,
+ "footpath": 48858,
+ "footprint": 23206,
+ "footprints": 39640,
+ "footsteps": 27289,
+ "footwear": 22772,
+ "footy": 39866,
+ "footy": 18922,
+ "for": 645,
+ "for": 556,
+ "forage": 46871,
+ "foraging": 39056,
+ "forall": 17824,
+ "forbe": 49098,
+ "forbes": 13925,
+ "forbi": 24754,
+ "forbidden": 25164,
+ "force": 12068,
+ "force": 2869,
+ "forced": 8201,
+ "forces": 5381,
+ "forchange": 35848,
+ "forcing": 21573,
+ "ford": 3751,
+ "ford": 1623,
+ "fordfc": 28581,
+ "fordham": 48792,
+ "fords": 29351,
+ "fordshire": 14645,
+ "fore": 1484,
+ "fore": 1332,
+ "forec": 34155,
+ "forecast": 7361,
+ "forecasting": 38133,
+ "forecasts": 27696,
+ "foreclo": 44916,
+ "forefront": 37679,
+ "foreground": 35186,
+ "forehead": 25394,
+ "foreig": 26497,
+ "foreign": 42255,
+ "foreign": 6046,
+ "foreigners": 38549,
+ "foreman": 36174,
+ "foremost": 42128,
+ "foren": 16526,
+ "forensic": 23158,
+ "forensics": 38763,
+ "forest": 18760,
+ "forest": 4167,
+ "forestation": 33939,
+ "forestry": 26281,
+ "forests": 14095,
+ "forever": 14748,
+ "forever": 3225,
+ "forevery": 40605,
+ "forex": 40200,
+ "forex": 17395,
+ "forfe": 44871,
+ "forge": 19232,
+ "forged": 28105,
+ "forget": 46153,
+ "forget": 2678,
+ "forgets": 35613,
+ "forgetting": 25452,
+ "forgi": 22080,
+ "forgive": 15332,
+ "forgiven": 44894,
+ "forgiveness": 23585,
+ "forgood": 39169,
+ "forgot": 6483,
+ "forgotten": 7994,
+ "fork": 24501,
+ "fork": 13700,
+ "forkids": 48571,
+ "forklift": 43202,
+ "forks": 28769,
+ "forlife": 17624,
+ "form": 1157,
+ "form": 1907,
+ "forma": 38829,
+ "formal": 12978,
+ "formally": 24867,
+ "format": 16252,
+ "format": 11874,
+ "formation": 2510,
+ "formations": 37715,
+ "formative": 48882,
+ "formats": 32085,
+ "forme": 42085,
+ "formed": 6528,
+ "former": 2276,
+ "formerly": 20866,
+ "formid": 38599,
+ "formidable": 39834,
+ "forming": 15443,
+ "formity": 42290,
+ "forms": 5161,
+ "formu": 8689,
+ "formul": 23923,
+ "formula": 24485,
+ "formula": 10776,
+ "formulae": 34586,
+ "formulated": 45066,
+ "forre": 38876,
+ "forrest": 25205,
+ "forrester": 45338,
+ "forsa": 48958,
+ "forsale": 13303,
+ "forster": 42923,
+ "forsy": 29629,
+ "forsyth": 40952,
+ "fort": 12300,
+ "fort": 2921,
+ "forte": 44350,
+ "forte": 27367,
+ "forth": 17068,
+ "forth": 11932,
+ "forthcoming": 19989,
+ "forthe": 12521,
+ "forti": 26984,
+ "fortified": 46486,
+ "fortn": 14428,
+ "fortnight": 39235,
+ "fortnite": 38734,
+ "fortnite": 17890,
+ "fortress": 19988,
+ "fortun": 6950,
+ "fortunate": 19898,
+ "fortunately": 34358,
+ "fortune": 40931,
+ "fortune": 11451,
+ "fortunes": 41989,
+ "forty": 24399,
+ "forum": 37851,
+ "forum": 4538,
+ "forums": 31518,
+ "forwar": 34364,
+ "forward": 47031,
+ "forward": 2342,
+ "forwards": 38974,
+ "foryou": 35150,
+ "forz": 46056,
+ "forza": 33293,
+ "forza": 28089,
+ "fos": 36925,
+ "fos": 22081,
+ "foss": 14240,
+ "foss": 37911,
+ "fossil": 20419,
+ "fossil": 15202,
+ "fossilfriday": 26079,
+ "fossils": 30652,
+ "foster": 26778,
+ "foster": 8139,
+ "fostering": 35996,
+ "fosters": 37644,
+ "foto": 15908,
+ "foto": 12823,
+ "fotogra": 23687,
+ "fotografia": 40256,
+ "fotos": 26124,
+ "fou": 14516,
+ "fought": 10844,
+ "foul": 19784,
+ "foun": 3154,
+ "found": 3454,
+ "found": 1546,
+ "foundation": 4058,
+ "foundations": 25219,
+ "founded": 12240,
+ "founder": 5145,
+ "founders": 14602,
+ "founding": 15317,
+ "foundry": 31426,
+ "fountain": 44863,
+ "fountain": 13405,
+ "fountains": 37411,
+ "four": 5113,
+ "four": 2721,
+ "foursquare": 34484,
+ "fourteen": 46255,
+ "fourth": 7516,
+ "fourthofjuly": 47805,
+ "fow": 17084,
+ "fowl": 31685,
+ "fowler": 20980,
+ "fox": 5007,
+ "fox": 3240,
+ "foxandfriends": 45841,
+ "foxes": 24145,
+ "foxnews": 18830,
+ "foxsports": 39267,
+ "foxtv": 49396,
+ "foxx": 32993,
+ "foxy": 27945,
+ "foy": 30284,
+ "foyer": 38011,
+ "foyle": 47902,
+ "fp": 28058,
+ "fp": 8941,
+ "fpl": 27970,
+ "fpp": 36464,
+ "fps": 25300,
+ "fpv": 43175,
+ "fr": 936,
+ "fr": 5512,
+ "fra": 3368,
+ "fra": 15644,
+ "frac": 15607,
+ "fracking": 21894,
+ "fractal": 46471,
+ "fraction": 26788,
+ "fractu": 25847,
+ "fracture": 28995,
+ "fractured": 37421,
+ "fractures": 46213,
+ "frag": 13093,
+ "fragile": 23579,
+ "fragment": 39209,
+ "fragments": 41424,
+ "fragr": 15403,
+ "fragrance": 17874,
+ "fragrances": 44567,
+ "fragrant": 37030,
+ "fram": 27987,
+ "frame": 11029,
+ "frame": 6481,
+ "framed": 13135,
+ "frames": 15479,
+ "framework": 13195,
+ "frameworks": 43136,
+ "framing": 24539,
+ "frampton": 41733,
+ "fran": 2118,
+ "fran": 18878,
+ "franc": 3872,
+ "franc": 42340,
+ "franca": 48952,
+ "france": 12045,
+ "france": 3552,
+ "frances": 20803,
+ "francesca": 32327,
+ "francesco": 25816,
+ "franch": 11756,
+ "franchi": 46438,
+ "franchise": 13664,
+ "franci": 46458,
+ "francis": 22187,
+ "francis": 7660,
+ "francisco": 6887,
+ "franco": 17934,
+ "franco": 17052,
+ "francois": 29317,
+ "frank": 5390,
+ "frank": 5229,
+ "franken": 20487,
+ "franken": 48252,
+ "frankenstein": 26410,
+ "frankfur": 17442,
+ "frankfurt": 18598,
+ "franki": 39227,
+ "frankie": 38373,
+ "frankie": 16215,
+ "franklin": 40935,
+ "franklin": 9999,
+ "frankly": 38015,
+ "franks": 42855,
+ "frans": 47892,
+ "franz": 25449,
+ "franç": 38381,
+ "fraser": 39082,
+ "fraser": 16754,
+ "frat": 15225,
+ "frat": 39292,
+ "fraternity": 24433,
+ "frau": 23063,
+ "fraud": 40647,
+ "fraud": 9961,
+ "fraudul": 42655,
+ "fraudulent": 47408,
+ "fray": 41154,
+ "frazier": 32841,
+ "frc": 41507,
+ "fre": 821,
+ "fre": 43165,
+ "freak": 20352,
+ "freak": 13701,
+ "freaked": 43511,
+ "freakin": 23900,
+ "freaking": 11992,
+ "freaks": 27009,
+ "freaky": 31583,
+ "freck": 33328,
+ "freckles": 48036,
+ "fred": 9486,
+ "fred": 6678,
+ "freddie": 41890,
+ "freddie": 17014,
+ "freddy": 24394,
+ "freder": 10745,
+ "frederic": 41165,
+ "frederick": 37103,
+ "frederick": 18570,
+ "fredo": 48241,
+ "free": 2065,
+ "free": 1139,
+ "freebie": 35865,
+ "freebies": 28630,
+ "freec": 46569,
+ "freed": 12585,
+ "freed": 23392,
+ "freedom": 17992,
+ "freedom": 4511,
+ "freedoms": 32500,
+ "freef": 48678,
+ "freel": 14174,
+ "freelance": 21942,
+ "freely": 24436,
+ "freeman": 16450,
+ "freep": 32499,
+ "freepalestine": 39242,
+ "freer": 44676,
+ "frees": 27455,
+ "freestyle": 15594,
+ "freeway": 24927,
+ "freeze": 14187,
+ "freezer": 25390,
+ "freezing": 12499,
+ "frei": 30183,
+ "freight": 17023,
+ "fremantle": 48012,
+ "fremont": 34578,
+ "fren": 2919,
+ "french": 13118,
+ "french": 3461,
+ "frenzy": 30084,
+ "frequ": 9211,
+ "frequencies": 45319,
+ "frequency": 18825,
+ "frequent": 19836,
+ "frequently": 22434,
+ "fresco": 31609,
+ "fresh": 4065,
+ "fresh": 2975,
+ "fresher": 49284,
+ "freshers": 35810,
+ "freshest": 46809,
+ "freshly": 16081,
+ "freshman": 9381,
+ "freshmen": 21292,
+ "freshness": 45872,
+ "freshwater": 24803,
+ "fresno": 40879,
+ "fresno": 20995,
+ "fret": 40510,
+ "freud": 40787,
+ "frey": 22136,
+ "frey": 9082,
+ "fri": 815,
+ "fri": 6882,
+ "friars": 30513,
+ "fric": 18981,
+ "frick": 46304,
+ "friction": 38563,
+ "frid": 46388,
+ "frida": 36001,
+ "friday": 6350,
+ "friday": 1461,
+ "fridayfeeling": 11952,
+ "fridaymotivation": 38544,
+ "fridaynight": 44858,
+ "fridayreads": 37736,
+ "fridays": 15589,
+ "fridaythe": 47642,
+ "fridge": 13491,
+ "fridges": 40734,
+ "frie": 36999,
+ "fried": 13743,
+ "fried": 7310,
+ "friedman": 29402,
+ "friedrich": 34171,
+ "friend": 3017,
+ "friend": 1625,
+ "friendly": 44612,
+ "friendly": 4681,
+ "friends": 38875,
+ "friends": 1574,
+ "friendship": 42674,
+ "friendship": 7679,
+ "friendships": 28840,
+ "fries": 11369,
+ "frifotos": 40493,
+ "friger": 20785,
+ "friggin": 48300,
+ "frigh": 34831,
+ "fright": 24277,
+ "fright": 40207,
+ "frightened": 47136,
+ "frightening": 39290,
+ "fringe": 10640,
+ "fris": 37252,
+ "frisbee": 45768,
+ "frisco": 35945,
+ "frit": 34614,
+ "fritz": 29860,
+ "friyay": 38887,
+ "frm": 12951,
+ "fro": 626,
+ "fro": 26603,
+ "frock": 45306,
+ "frog": 26494,
+ "frog": 11438,
+ "frogs": 20781,
+ "from": 8330,
+ "from": 633,
+ "frome": 48691,
+ "fromhome": 41477,
+ "fromthe": 18756,
+ "fron": 1847,
+ "fron": 18036,
+ "front": 10996,
+ "front": 2184,
+ "frontal": 35794,
+ "frontier": 18253,
+ "frontiers": 38396,
+ "frontline": 29589,
+ "frontman": 36775,
+ "fronts": 26846,
+ "froome": 48560,
+ "frosh": 47069,
+ "frost": 39420,
+ "frost": 11619,
+ "frosted": 35988,
+ "frosting": 33872,
+ "frosty": 22760,
+ "froze": 47788,
+ "frozen": 42464,
+ "frozen": 8507,
+ "frs": 26216,
+ "fru": 3248,
+ "fruit": 16771,
+ "fruit": 5190,
+ "fruitful": 31494,
+ "fruits": 13282,
+ "fruity": 22320,
+ "frustr": 16046,
+ "frustrated": 25111,
+ "frustrating": 31342,
+ "frustration": 30535,
+ "fry": 33914,
+ "fry": 13686,
+ "fryer": 49217,
+ "frying": 38516,
+ "fs": 23699,
+ "fs": 3854,
+ "fsa": 33373,
+ "fsu": 44185,
+ "fsu": 19317,
+ "ft": 3391,
+ "ft": 981,
+ "fta": 41975,
+ "ftc": 33752,
+ "fted": 5612,
+ "fter": 25063,
+ "fthe": 22886,
+ "ftheday": 9823,
+ "fting": 6174,
+ "fton": 26605,
+ "ftp": 42649,
+ "fts": 3767,
+ "ftse": 46717,
+ "ftw": 19298,
+ "fty": 17494,
+ "fu": 665,
+ "fu": 9098,
+ "fuch": 42617,
+ "fudge": 24270,
+ "fue": 43723,
+ "fuego": 41500,
+ "fuel": 21113,
+ "fuel": 5945,
+ "fueled": 28792,
+ "fueling": 38793,
+ "fuelled": 48357,
+ "fuels": 19365,
+ "fuentes": 44393,
+ "fuer": 29645,
+ "fug": 29227,
+ "fugitive": 39257,
+ "fuji": 15573,
+ "fuji": 21634,
+ "fujifilm": 24765,
+ "fuk": 31051,
+ "fuku": 20728,
+ "fukushima": 33929,
+ "ful": 1814,
+ "ful": 857,
+ "fulbright": 41834,
+ "fulfill": 43675,
+ "fulfill": 27467,
+ "fulfilled": 29919,
+ "fulfilling": 30621,
+ "fulfillment": 45573,
+ "fulham": 25574,
+ "full": 9407,
+ "full": 1476,
+ "fuller": 20225,
+ "fullerton": 42822,
+ "fullest": 35603,
+ "fully": 39142,
+ "fully": 2401,
+ "fulness": 10526,
+ "fuls": 41606,
+ "fulton": 26725,
+ "fum": 38393,
+ "fumble": 49373,
+ "fun": 1229,
+ "fun": 1499,
+ "func": 8679,
+ "function": 8093,
+ "functional": 12885,
+ "functionality": 33316,
+ "functioning": 25479,
+ "functions": 18001,
+ "fund": 19089,
+ "fund": 4877,
+ "fundam": 11670,
+ "fundament": 18852,
+ "fundamental": 17627,
+ "fundamentally": 45378,
+ "fundamentals": 27887,
+ "funday": 15439,
+ "funded": 10588,
+ "funding": 5588,
+ "fundra": 6201,
+ "fundraiser": 10049,
+ "fundraising": 10755,
+ "funds": 7066,
+ "funer": 40693,
+ "funeral": 10606,
+ "funfact": 31596,
+ "funfactfriday": 40710,
+ "fungal": 38838,
+ "fungi": 27837,
+ "fungus": 30677,
+ "funk": 37353,
+ "funk": 13372,
+ "funko": 49402,
+ "funko": 23697,
+ "funky": 16492,
+ "funnel": 27862,
+ "funnier": 42232,
+ "funniest": 15557,
+ "funny": 19124,
+ "funny": 3789,
+ "funrun": 34185,
+ "fur": 2395,
+ "fur": 9686,
+ "furi": 40816,
+ "furious": 17522,
+ "furman": 49238,
+ "furn": 21348,
+ "furnace": 31913,
+ "furnished": 37388,
+ "furnitu": 45696,
+ "furniture": 7993,
+ "furry": 33414,
+ "furry": 15351,
+ "fursuit": 25306,
+ "fursuit": 43083,
+ "fursuitfriday": 27917,
+ "further": 5583,
+ "fury": 14404,
+ "fus": 18419,
+ "fuse": 23386,
+ "fused": 38994,
+ "fusion": 44661,
+ "fusion": 9364,
+ "fuss": 26331,
+ "fut": 21460,
+ "fut": 34049,
+ "futbol": 33014,
+ "futsal": 20558,
+ "futu": 33454,
+ "futur": 38840,
+ "future": 7959,
+ "future": 1904,
+ "futureof": 22599,
+ "futureofwork": 33202,
+ "futures": 13488,
+ "futuri": 19068,
+ "futurism": 48435,
+ "futurist": 48086,
+ "futuristic": 30987,
+ "fuzz": 47128,
+ "fuzz": 40443,
+ "fuzzy": 25876,
+ "fv": 29795,
+ "fw": 23934,
+ "fw": 5277,
+ "fwd": 27052,
+ "fx": 17807,
+ "fx": 9025,
+ "fy": 8440,
+ "fy": 2702,
+ "fyi": 16014,
+ "fying": 5294,
+ "fz": 46400,
+ "fé": 34072,
+ "g": 70,
+ "g": 326,
+ "ga": 1275,
+ "ga": 1531,
+ "gaa": 10715,
+ "gaal": 40867,
+ "gaard": 24645,
+ "gab": 3927,
+ "gab": 37382,
+ "gabbana": 36272,
+ "gabby": 48115,
+ "gabby": 24567,
+ "gabe": 18916,
+ "gabi": 41931,
+ "gable": 33387,
+ "gables": 40928,
+ "gabri": 8311,
+ "gabriel": 31684,
+ "gabriel": 13244,
+ "gabrielle": 33572,
+ "gaby": 46420,
+ "gac": 32520,
+ "gad": 7786,
+ "gad": 44651,
+ "gadget": 25525,
+ "gadgets": 22840,
+ "gado": 29489,
+ "gae": 22003,
+ "gael": 35663,
+ "gaelic": 31173,
+ "gaf": 21354,
+ "gaf": 32670,
+ "gag": 14121,
+ "gag": 18844,
+ "gaga": 9782,
+ "gage": 21081,
+ "gah": 27750,
+ "gai": 24214,
+ "gai": 25153,
+ "gaia": 41269,
+ "gail": 41160,
+ "gail": 27676,
+ "gain": 21536,
+ "gain": 6202,
+ "gaine": 35747,
+ "gained": 14489,
+ "gaines": 49225,
+ "gainesville": 40427,
+ "gaining": 15260,
+ "gains": 42751,
+ "gains": 12107,
+ "gal": 2001,
+ "gal": 4488,
+ "gala": 7211,
+ "galac": 18864,
+ "galactic": 25514,
+ "galap": 41115,
+ "galapagos": 44057,
+ "galat": 39853,
+ "galatasar": 42413,
+ "galatasaray": 47787,
+ "galax": 5647,
+ "galaxies": 32435,
+ "galaxy": 32130,
+ "galaxy": 6545,
+ "gale": 37658,
+ "gale": 21380,
+ "galerie": 44539,
+ "gales": 48633,
+ "gali": 17546,
+ "gali": 30552,
+ "galicia": 47927,
+ "galileo": 39671,
+ "gall": 3011,
+ "gall": 33374,
+ "galla": 16847,
+ "gallagher": 19168,
+ "galleria": 40656,
+ "galleries": 22304,
+ "gallery": 36648,
+ "gallery": 3830,
+ "galley": 48917,
+ "galli": 22568,
+ "gallipoli": 47249,
+ "gallo": 37350,
+ "gallo": 33265,
+ "gallon": 24615,
+ "gallons": 29335,
+ "galloway": 27796,
+ "galore": 22286,
+ "gals": 20125,
+ "galvani": 46046,
+ "galve": 34328,
+ "galveston": 36003,
+ "galway": 38045,
+ "galway": 17112,
+ "gam": 1162,
+ "gam": 34195,
+ "gama": 35873,
+ "gambia": 32988,
+ "gamble": 26121,
+ "gambling": 20287,
+ "game": 2882,
+ "game": 1063,
+ "gameart": 31490,
+ "gameboy": 40951,
+ "gamecube": 44079,
+ "gameday": 9241,
+ "gamedev": 7544,
+ "gameinsight": 42626,
+ "gameof": 10987,
+ "gameofthrones": 11822,
+ "gameon": 47691,
+ "gameplay": 16794,
+ "gamer": 12595,
+ "gamer": 11598,
+ "gamergate": 25961,
+ "gamers": 16166,
+ "gamersunite": 26423,
+ "games": 18551,
+ "games": 1955,
+ "gamescom": 37003,
+ "gamestop": 39436,
+ "gametime": 45899,
+ "gami": 42025,
+ "gamification": 48908,
+ "gaming": 28803,
+ "gaming": 4017,
+ "gamma": 22180,
+ "gamo": 39325,
+ "gan": 1822,
+ "gan": 1670,
+ "gand": 8399,
+ "ganda": 27261,
+ "gander": 44508,
+ "gandhi": 12322,
+ "ganesh": 30362,
+ "ganesha": 45185,
+ "gang": 8066,
+ "gang": 5674,
+ "ganga": 36275,
+ "gangnam": 46777,
+ "gangs": 29844,
+ "gangsta": 37365,
+ "gangster": 26514,
+ "gani": 48324,
+ "gann": 45665,
+ "gannon": 45837,
+ "gano": 25304,
+ "gao": 26556,
+ "gaon": 19279,
+ "gap": 29906,
+ "gap": 7609,
+ "gaps": 25296,
+ "gar": 1099,
+ "gar": 5824,
+ "gara": 28710,
+ "garage": 8474,
+ "garbage": 13760,
+ "garci": 44658,
+ "garcia": 10529,
+ "gard": 7751,
+ "gard": 21003,
+ "garda": 31906,
+ "garde": 22649,
+ "garden": 4674,
+ "garden": 2756,
+ "gardenchat": 46292,
+ "gardener": 28554,
+ "gardeners": 38205,
+ "gardening": 10483,
+ "gardens": 6152,
+ "gardiner": 43121,
+ "gardner": 18710,
+ "gare": 5633,
+ "gare": 48402,
+ "gareth": 37140,
+ "gareth": 18175,
+ "garfield": 26728,
+ "garh": 16762,
+ "gari": 40898,
+ "gari": 43080,
+ "garis": 37839,
+ "garland": 23418,
+ "garlic": 9685,
+ "garment": 31418,
+ "garments": 43341,
+ "garmin": 39885,
+ "garner": 20340,
+ "garnet": 37669,
+ "garo": 30388,
+ "garrett": 15881,
+ "garri": 21764,
+ "garrison": 30108,
+ "garros": 40425,
+ "garry": 24398,
+ "gars": 12055,
+ "gart": 18380,
+ "gart": 18751,
+ "garten": 14684,
+ "garter": 48420,
+ "garth": 45398,
+ "garth": 24469,
+ "gartner": 43334,
+ "gartner": 29678,
+ "garty": 46383,
+ "garu": 31140,
+ "garvey": 39511,
+ "garwal": 38623,
+ "gary": 10535,
+ "gary": 4516,
+ "garza": 49393,
+ "gas": 5047,
+ "gas": 2474,
+ "gases": 36971,
+ "gasoline": 27691,
+ "gasp": 43762,
+ "gaston": 40669,
+ "gastri": 49197,
+ "gastro": 23740,
+ "gastron": 30699,
+ "gastronomy": 46987,
+ "gat": 5314,
+ "gat": 18941,
+ "gata": 44575,
+ "gate": 8071,
+ "gate": 3302,
+ "gated": 23997,
+ "gates": 9472,
+ "gateshead": 40051,
+ "gateway": 45221,
+ "gateway": 14943,
+ "gather": 36345,
+ "gather": 12602,
+ "gathered": 14646,
+ "gathering": 9197,
+ "gatherings": 48096,
+ "gathers": 39250,
+ "gating": 27561,
+ "gation": 11095,
+ "gations": 33906,
+ "gato": 44492,
+ "gator": 20216,
+ "gator": 16390,
+ "gatorade": 36354,
+ "gators": 17173,
+ "gatory": 24796,
+ "gatsby": 32586,
+ "gatwick": 37122,
+ "gau": 5919,
+ "gau": 43068,
+ "gauge": 18728,
+ "gaunt": 31862,
+ "gauntlet": 37163,
+ "gautam": 45853,
+ "gautam": 31356,
+ "gauteng": 40333,
+ "gav": 8966,
+ "gave": 3485,
+ "gavin": 32974,
+ "gavin": 16389,
+ "gaw": 15405,
+ "gawd": 43239,
+ "gawx": 43420,
+ "gay": 7460,
+ "gay": 5627,
+ "gaya": 39477,
+ "gaye": 41401,
+ "gayle": 29998,
+ "gayo": 36768,
+ "gays": 28001,
+ "gaz": 4837,
+ "gaz": 36475,
+ "gaza": 38391,
+ "gaza": 10112,
+ "gazaunderattack": 42458,
+ "gaze": 23212,
+ "gazette": 20443,
+ "gazing": 28373,
+ "gb": 8727,
+ "gb": 4619,
+ "gba": 18528,
+ "gbbo": 34474,
+ "gbc": 42993,
+ "gbp": 27391,
+ "gbr": 31984,
+ "gby": 40509,
+ "gc": 8577,
+ "gc": 6043,
+ "gcc": 26804,
+ "gcse": 28763,
+ "gcu": 34137,
+ "gd": 13264,
+ "gd": 14604,
+ "gdc": 32793,
+ "gden": 44928,
+ "gdp": 17100,
+ "gdpr": 22963,
+ "ge": 619,
+ "ge": 710,
+ "gea": 26790,
+ "gear": 15532,
+ "gear": 4802,
+ "gearbox": 42454,
+ "geared": 33903,
+ "gearing": 19027,
+ "gears": 21147,
+ "geaux": 36313,
+ "gecko": 38616,
+ "ged": 17252,
+ "ged": 3480,
+ "geddon": 31720,
+ "gedly": 13991,
+ "gee": 9806,
+ "gee": 9071,
+ "geek": 17920,
+ "geek": 7135,
+ "geeks": 20110,
+ "geeky": 47332,
+ "geel": 25906,
+ "geelong": 34555,
+ "gees": 38088,
+ "geese": 26413,
+ "geez": 42394,
+ "geh": 30320,
+ "geist": 38290,
+ "gel": 7343,
+ "gel": 5697,
+ "gelato": 29577,
+ "gels": 42552,
+ "gely": 14637,
+ "gem": 14261,
+ "gem": 7613,
+ "gement": 19495,
+ "gemini": 23086,
+ "gemma": 23952,
+ "gems": 14355,
+ "gemstone": 27747,
+ "gemstones": 43972,
+ "gen": 1024,
+ "gen": 3278,
+ "gence": 16088,
+ "gency": 5245,
+ "gend": 33247,
+ "gender": 22976,
+ "gender": 5906,
+ "gendere": 35824,
+ "genderequality": 43338,
+ "gene": 5822,
+ "gene": 7962,
+ "genealo": 24142,
+ "genealogy": 29381,
+ "gener": 1832,
+ "general": 20576,
+ "general": 3658,
+ "generally": 19256,
+ "generals": 30296,
+ "generate": 16896,
+ "generated": 19450,
+ "generates": 33938,
+ "generating": 23882,
+ "generation": 41211,
+ "generation": 4883,
+ "generational": 34506,
+ "generations": 12247,
+ "generative": 29472,
+ "generator": 19399,
+ "generators": 41917,
+ "generic": 26978,
+ "generosity": 23015,
+ "generous": 12570,
+ "generously": 35113,
+ "genes": 19683,
+ "genesis": 13518,
+ "genetic": 47746,
+ "genetic": 13578,
+ "genetically": 36745,
+ "genetics": 18276,
+ "geneva": 14799,
+ "genevie": 41633,
+ "genevieve": 46584,
+ "geni": 22334,
+ "genic": 15750,
+ "genie": 24221,
+ "genital": 32960,
+ "genius": 8235,
+ "geniuses": 41406,
+ "geno": 41544,
+ "geno": 46776,
+ "genoa": 43993,
+ "genoci": 14687,
+ "genocide": 15903,
+ "genome": 23991,
+ "genomic": 44371,
+ "genomics": 26227,
+ "genre": 14249,
+ "genres": 30340,
+ "gens": 17449,
+ "gent": 3685,
+ "gent": 7139,
+ "gente": 34325,
+ "gentle": 7262,
+ "gentle": 13577,
+ "gentleman": 13293,
+ "gentlemen": 11692,
+ "gently": 17187,
+ "gento": 28320,
+ "gentri": 41148,
+ "gentry": 47225,
+ "gents": 18862,
+ "genu": 9182,
+ "genuine": 12184,
+ "genuinely": 20006,
+ "genus": 38161,
+ "geny": 35323,
+ "geo": 5038,
+ "geo": 11604,
+ "geocaching": 47908,
+ "geof": 20629,
+ "geoff": 33697,
+ "geoff": 20386,
+ "geoffrey": 29520,
+ "geograph": 45920,
+ "geographic": 22635,
+ "geographical": 39380,
+ "geography": 17101,
+ "geological": 38380,
+ "geology": 21578,
+ "geom": 46135,
+ "geome": 12958,
+ "geometric": 22419,
+ "geometry": 21731,
+ "geon": 20844,
+ "geon": 7295,
+ "geons": 15914,
+ "geopol": 39758,
+ "geor": 2549,
+ "georg": 43126,
+ "george": 8377,
+ "george": 3296,
+ "georges": 25042,
+ "georgetown": 22970,
+ "georgie": 42115,
+ "georgina": 43892,
+ "geospatial": 46238,
+ "geothermal": 38413,
+ "geous": 3068,
+ "ger": 1291,
+ "ger": 1502,
+ "gera": 48867,
+ "gerald": 29901,
+ "gerald": 13269,
+ "gerard": 35979,
+ "gerard": 20826,
+ "gerber": 45058,
+ "gered": 40179,
+ "geri": 41664,
+ "geri": 46214,
+ "gering": 24077,
+ "germain": 38786,
+ "german": 14972,
+ "german": 4710,
+ "germans": 28400,
+ "germany": 4464,
+ "germin": 44721,
+ "germs": 47731,
+ "geronimo": 45171,
+ "gerrard": 26538,
+ "gerry": 29825,
+ "gerry": 23026,
+ "gers": 3314,
+ "gertrude": 46950,
+ "gervais": 36527,
+ "gery": 32845,
+ "ges": 3316,
+ "gest": 11843,
+ "gest": 2033,
+ "gesture": 21780,
+ "gestures": 43524,
+ "get": 5670,
+ "get": 779,
+ "geta": 13155,
+ "getaway": 16131,
+ "gether": 27224,
+ "getic": 20661,
+ "getin": 25822,
+ "getit": 44891,
+ "getit": 48315,
+ "getoutside": 35644,
+ "gets": 39448,
+ "gets": 2127,
+ "gett": 6647,
+ "gett": 27965,
+ "gettable": 15620,
+ "gette": 29800,
+ "gettin": 13428,
+ "getting": 30885,
+ "getting": 1500,
+ "getty": 31185,
+ "getty": 13965,
+ "gettys": 35189,
+ "gettysburg": 37062,
+ "getyour": 42159,
+ "gey": 29289,
+ "gf": 28953,
+ "gf": 10846,
+ "gfriend": 35245,
+ "gfs": 37553,
+ "gg": 1129,
+ "gg": 3286,
+ "gga": 26003,
+ "ggan": 25626,
+ "gge": 21521,
+ "gge": 31659,
+ "gged": 6095,
+ "gger": 12367,
+ "gger": 3493,
+ "ggers": 7480,
+ "ggg": 20143,
+ "gggg": 33513,
+ "ggi": 21662,
+ "ggin": 17160,
+ "gging": 4966,
+ "ggins": 12444,
+ "ggle": 34981,
+ "ggle": 11430,
+ "ggled": 46328,
+ "ggles": 14703,
+ "ggling": 16523,
+ "ggly": 39407,
+ "ggs": 4797,
+ "ggy": 24935,
+ "ggy": 6476,
+ "gh": 583,
+ "gh": 790,
+ "gha": 10010,
+ "gha": 25183,
+ "gham": 21456,
+ "ghan": 18945,
+ "ghan": 6624,
+ "ghana": 30330,
+ "ghana": 9731,
+ "ghanaian": 34223,
+ "ghani": 36699,
+ "ghar": 37334,
+ "ghar": 36973,
+ "ghat": 43989,
+ "ghaz": 37493,
+ "ghc": 42139,
+ "ghe": 10754,
+ "ghe": 28561,
+ "ghead": 40783,
+ "ghee": 34794,
+ "gher": 21542,
+ "gher": 14796,
+ "ghet": 18447,
+ "ghetti": 17485,
+ "ghetto": 22403,
+ "ghi": 22436,
+ "ghi": 22279,
+ "ghibli": 40555,
+ "ghj": 38439,
+ "ghlin": 24131,
+ "gho": 4307,
+ "ghorn": 38094,
+ "ghosh": 43279,
+ "ghoshal": 49134,
+ "ghost": 11417,
+ "ghost": 7108,
+ "ghostbusters": 25462,
+ "ghostly": 44901,
+ "ghosts": 16737,
+ "ghou": 35843,
+ "ghoul": 45302,
+ "ghouse": 38238,
+ "ghs": 14157,
+ "ght": 1413,
+ "ght": 630,
+ "ghted": 4963,
+ "ghter": 2427,
+ "ghters": 12994,
+ "ghtful": 8334,
+ "ghting": 3019,
+ "ghtly": 6993,
+ "ghtning": 39740,
+ "ghton": 16353,
+ "ghts": 1259,
+ "ghty": 20968,
+ "ghty": 5866,
+ "ghu": 25808,
+ "ghue": 45675,
+ "ghyun": 25010,
+ "ghz": 24325,
+ "gi": 707,
+ "gi": 4478,
+ "gia": 8864,
+ "giac": 35444,
+ "giam": 39623,
+ "gian": 17274,
+ "gian": 12866,
+ "gianni": 46752,
+ "giant": 23668,
+ "giant": 4687,
+ "giants": 7076,
+ "giar": 34241,
+ "gib": 9816,
+ "gibb": 18964,
+ "gibbons": 31974,
+ "gibbs": 26488,
+ "gibility": 33297,
+ "gible": 13159,
+ "gibr": 20206,
+ "gibraltar": 23988,
+ "gibson": 37420,
+ "gibson": 12178,
+ "gic": 27900,
+ "gic": 2570,
+ "gical": 32973,
+ "gically": 26320,
+ "gid": 36774,
+ "gid": 21413,
+ "giddy": 40894,
+ "gideon": 43867,
+ "gidi": 30603,
+ "gie": 11459,
+ "gie": 3991,
+ "gier": 28974,
+ "gies": 5505,
+ "gif": 11363,
+ "gif": 11677,
+ "gifford": 47850,
+ "gifs": 37643,
+ "gift": 20569,
+ "gift": 2733,
+ "gifted": 15110,
+ "giftide": 20152,
+ "giftideas": 23487,
+ "gifting": 39546,
+ "gifts": 5836,
+ "gig": 26981,
+ "gig": 7471,
+ "gigab": 34530,
+ "gigan": 24104,
+ "gigantic": 31507,
+ "giggle": 36426,
+ "giggles": 42731,
+ "giggs": 44692,
+ "gigi": 44106,
+ "gigi": 26171,
+ "gigs": 20316,
+ "gil": 3997,
+ "gil": 10088,
+ "gila": 46952,
+ "gilbert": 14154,
+ "gilded": 44341,
+ "giles": 24802,
+ "gill": 14280,
+ "gill": 12003,
+ "gille": 29610,
+ "gilles": 39590,
+ "gillespie": 36242,
+ "gillette": 38603,
+ "gilli": 13695,
+ "gillian": 28753,
+ "gills": 48851,
+ "gilmore": 27603,
+ "gilt": 44378,
+ "gim": 31284,
+ "gimm": 40692,
+ "gimme": 21525,
+ "gin": 3374,
+ "gin": 4941,
+ "gina": 15604,
+ "gine": 27482,
+ "ging": 10829,
+ "ging": 3905,
+ "ginger": 16287,
+ "ginger": 9718,
+ "gingerbread": 23692,
+ "gini": 35768,
+ "gino": 36521,
+ "gins": 18328,
+ "gio": 16329,
+ "gio": 8050,
+ "gion": 41226,
+ "gior": 14920,
+ "giorgio": 33271,
+ "giorno": 33310,
+ "gios": 41927,
+ "gious": 14419,
+ "giov": 21404,
+ "giovanni": 26574,
+ "gipp": 41351,
+ "gir": 1077,
+ "gir": 25481,
+ "gira": 16949,
+ "giraffe": 22826,
+ "giri": 31709,
+ "girl": 3914,
+ "girl": 1611,
+ "girlfriend": 8217,
+ "girlfriends": 30736,
+ "girlpower": 37433,
+ "girls": 15480,
+ "girls": 1917,
+ "girly": 29605,
+ "giro": 39664,
+ "giro": 26454,
+ "girona": 47842,
+ "giroud": 41177,
+ "gis": 16266,
+ "gis": 12773,
+ "gist": 21241,
+ "git": 16060,
+ "git": 20918,
+ "gita": 40838,
+ "github": 31196,
+ "giu": 17931,
+ "giuli": 29762,
+ "giuliani": 47739,
+ "giuse": 29385,
+ "giuseppe": 33563,
+ "give": 4120,
+ "give": 1781,
+ "giveaway": 5310,
+ "giveaways": 18974,
+ "giveback": 41385,
+ "given": 33323,
+ "given": 4302,
+ "givenchy": 38245,
+ "giver": 43339,
+ "gives": 3926,
+ "giveup": 35485,
+ "giving": 14673,
+ "giving": 2339,
+ "givingback": 49300,
+ "givingtuesday": 23556,
+ "giz": 29237,
+ "gk": 38953,
+ "gk": 18719,
+ "gl": 1849,
+ "gl": 14751,
+ "gla": 1523,
+ "gla": 36904,
+ "glaci": 14924,
+ "glacial": 40782,
+ "glacier": 19282,
+ "glaciers": 42528,
+ "glad": 20841,
+ "glad": 4761,
+ "glades": 37432,
+ "gladi": 21742,
+ "gladiator": 38477,
+ "gladiators": 41087,
+ "gladly": 41598,
+ "gladys": 43168,
+ "glam": 8738,
+ "glam": 16905,
+ "glamorous": 22896,
+ "glamour": 42876,
+ "glamour": 17499,
+ "glamping": 46167,
+ "glan": 40482,
+ "glan": 45844,
+ "glance": 26557,
+ "gland": 41441,
+ "glar": 48535,
+ "glar": 41702,
+ "glare": 46035,
+ "glas": 29935,
+ "glas": 43654,
+ "glasgo": 6757,
+ "glasgow": 29990,
+ "glasgow": 7363,
+ "glass": 16305,
+ "glass": 3313,
+ "glasses": 6116,
+ "glaston": 26848,
+ "glastonbury": 28233,
+ "glau": 39171,
+ "glaze": 28112,
+ "glazed": 24122,
+ "gle": 7166,
+ "gle": 2865,
+ "glee": 32379,
+ "glee": 21614,
+ "glen": 6158,
+ "glen": 11049,
+ "glend": 38332,
+ "glendale": 33043,
+ "glenn": 32004,
+ "glenn": 12861,
+ "gler": 34649,
+ "gley": 21998,
+ "gli": 5896,
+ "gli": 28791,
+ "glia": 22217,
+ "glide": 37321,
+ "glider": 41636,
+ "glimp": 12888,
+ "glimpse": 13817,
+ "glio": 29785,
+ "glit": 21079,
+ "glitch": 29563,
+ "glitter": 16528,
+ "glitz": 44542,
+ "glo": 1721,
+ "glo": 30474,
+ "glob": 13363,
+ "global": 6707,
+ "global": 2779,
+ "globalgoals": 33211,
+ "globalhealth": 46751,
+ "globalization": 47680,
+ "globally": 17775,
+ "globalwarming": 46017,
+ "globe": 19436,
+ "globe": 9368,
+ "globes": 38085,
+ "glock": 38818,
+ "glomer": 43689,
+ "gloom": 48594,
+ "gloomy": 32199,
+ "glori": 7270,
+ "gloria": 19244,
+ "glorious": 9171,
+ "glory": 36107,
+ "glory": 7285,
+ "glos": 40633,
+ "gloss": 38258,
+ "gloss": 22014,
+ "glossy": 29802,
+ "glou": 15989,
+ "gloucester": 28133,
+ "gloucester": 23835,
+ "gloucestershire": 33789,
+ "glove": 16078,
+ "glover": 21594,
+ "gloves": 12363,
+ "glow": 30472,
+ "glow": 10111,
+ "glowing": 18437,
+ "glows": 48107,
+ "glu": 5952,
+ "glu": 32281,
+ "glucose": 34642,
+ "glue": 22103,
+ "glued": 38135,
+ "gluten": 15482,
+ "gluten": 15524,
+ "glutenfree": 16138,
+ "gly": 13027,
+ "glycer": 48914,
+ "gm": 18743,
+ "gm": 5918,
+ "gma": 18155,
+ "gmail": 11119,
+ "gman": 41043,
+ "gman": 36936,
+ "gmb": 35934,
+ "gmb": 31799,
+ "gmbh": 46877,
+ "gmc": 27257,
+ "gmo": 23486,
+ "gms": 36987,
+ "gmt": 13803,
+ "gn": 2455,
+ "gn": 9831,
+ "gna": 23009,
+ "gnation": 45912,
+ "gne": 25407,
+ "gni": 5104,
+ "gnment": 25110,
+ "gno": 23376,
+ "gno": 43686,
+ "gnocchi": 48299,
+ "gnome": 33643,
+ "gnon": 20561,
+ "go": 650,
+ "go": 861,
+ "goa": 14399,
+ "goal": 9003,
+ "goal": 3321,
+ "goalie": 20723,
+ "goalkeeper": 16601,
+ "goals": 3295,
+ "goalscorer": 43547,
+ "goaltender": 44151,
+ "goat": 34082,
+ "goat": 9530,
+ "goats": 18393,
+ "gob": 29559,
+ "gobeavs": 48285,
+ "goblin": 26223,
+ "goblue": 25232,
+ "gobucks": 29175,
+ "gocougs": 34202,
+ "god": 4190,
+ "god": 1731,
+ "godawgs": 40436,
+ "godbless": 46616,
+ "godbless": 44007,
+ "godd": 16589,
+ "goddamn": 28495,
+ "goddard": 37827,
+ "goddess": 10808,
+ "godfather": 26222,
+ "godfrey": 40148,
+ "godis": 38521,
+ "godly": 42438,
+ "gods": 33620,
+ "gods": 10328,
+ "goducks": 35889,
+ "godzilla": 23369,
+ "goe": 22084,
+ "goers": 27784,
+ "goes": 43581,
+ "goes": 2635,
+ "gof": 17537,
+ "goff": 34399,
+ "goftheday": 39360,
+ "gofund": 34445,
+ "gofundme": 34686,
+ "gog": 42949,
+ "goggles": 31027,
+ "gogh": 19697,
+ "gogo": 22688,
+ "gogreen": 36279,
+ "gohawks": 34884,
+ "goi": 24917,
+ "goin": 13939,
+ "going": 25787,
+ "going": 1245,
+ "goku": 29550,
+ "gol": 1537,
+ "gol": 18257,
+ "gola": 41090,
+ "gold": 4999,
+ "gold": 2209,
+ "goldberg": 25161,
+ "goldcoast": 34634,
+ "golden": 10763,
+ "golden": 3878,
+ "goldeng": 20650,
+ "goldenglobes": 26842,
+ "goldfish": 40293,
+ "goldie": 42805,
+ "goldman": 27164,
+ "golds": 30526,
+ "golds": 40283,
+ "goldsmith": 40214,
+ "gole": 41297,
+ "golf": 9096,
+ "golf": 3096,
+ "golfclub": 45742,
+ "golfer": 24579,
+ "golfers": 28441,
+ "golfing": 31379,
+ "goli": 29265,
+ "goliath": 41602,
+ "gom": 7051,
+ "goma": 46198,
+ "gomes": 39128,
+ "gomez": 16433,
+ "gon": 1854,
+ "gon": 3379,
+ "gona": 34835,
+ "gone": 35135,
+ "gone": 3601,
+ "gong": 28486,
+ "gonna": 2562,
+ "gonz": 10587,
+ "gonzaga": 36241,
+ "gonzale": 17512,
+ "gonzales": 31265,
+ "gonzalez": 18198,
+ "goo": 1381,
+ "goo": 17882,
+ "good": 2185,
+ "good": 886,
+ "goodbye": 6968,
+ "goodday": 46284,
+ "goode": 42076,
+ "goodfood": 46844,
+ "goodfriday": 40360,
+ "goodie": 29213,
+ "goodies": 13308,
+ "goodluck": 19718,
+ "goodman": 24146,
+ "goodmorning": 14421,
+ "goodness": 10531,
+ "goodnight": 8540,
+ "goodreads": 31629,
+ "goods": 9340,
+ "goodtimes": 22570,
+ "goodvibes": 43146,
+ "goodwill": 24902,
+ "goodwin": 28080,
+ "goodwood": 30008,
+ "goody": 35937,
+ "goodyear": 42858,
+ "goofy": 26879,
+ "goog": 18581,
+ "google": 12195,
+ "google": 3460,
+ "googled": 40345,
+ "googleplay": 37309,
+ "goon": 15267,
+ "goons": 30440,
+ "goooo": 35876,
+ "goooo": 48957,
+ "goose": 21445,
+ "goose": 13822,
+ "goosebumps": 32254,
+ "gop": 18942,
+ "gop": 6250,
+ "gopack": 46995,
+ "gopackgo": 47719,
+ "gopal": 47268,
+ "gopdebate": 39806,
+ "gopher": 47750,
+ "gopher": 48905,
+ "gophers": 31957,
+ "gopro": 17511,
+ "gor": 1747,
+ "gor": 29827,
+ "gordo": 47707,
+ "gordon": 20485,
+ "gordon": 8244,
+ "gore": 30311,
+ "gore": 17872,
+ "gorg": 46815,
+ "gorge": 35548,
+ "gorge": 20038,
+ "gorgeous": 3241,
+ "gori": 12461,
+ "goria": 43359,
+ "gorilla": 37910,
+ "gorilla": 21994,
+ "gorman": 35741,
+ "goro": 44977,
+ "gory": 7160,
+ "gos": 20517,
+ "gos": 5693,
+ "gosh": 15395,
+ "gosling": 35320,
+ "gosp": 9617,
+ "gospel": 11313,
+ "goss": 39734,
+ "goss": 36924,
+ "gossi": 15684,
+ "gossip": 18963,
+ "got": 10125,
+ "got": 1005,
+ "gota": 36693,
+ "gotcha": 43275,
+ "gote": 49345,
+ "goth": 48465,
+ "goth": 20437,
+ "gotham": 46123,
+ "gotham": 18299,
+ "gothic": 15426,
+ "goti": 9497,
+ "goto": 39715,
+ "gots": 35215,
+ "gott": 5089,
+ "gott": 36466,
+ "gotta": 4633,
+ "gotten": 5889,
+ "gotti": 41881,
+ "gotv": 36089,
+ "gou": 10520,
+ "gou": 36555,
+ "gouache": 43314,
+ "goul": 33187,
+ "gould": 31087,
+ "gour": 13580,
+ "gourmet": 19111,
+ "gov": 4022,
+ "gov": 4564,
+ "gove": 36997,
+ "govegan": 38886,
+ "gover": 10471,
+ "gover": 16759,
+ "govern": 2351,
+ "govern": 32404,
+ "governance": 13386,
+ "governing": 30946,
+ "government": 3149,
+ "governmental": 42609,
+ "governments": 19582,
+ "governor": 17459,
+ "governor": 6630,
+ "governors": 26881,
+ "govin": 42451,
+ "govt": 5345,
+ "govuk": 28830,
+ "gow": 21885,
+ "gow": 33788,
+ "gowan": 31307,
+ "gower": 43448,
+ "gown": 13719,
+ "gowns": 38029,
+ "goyal": 35105,
+ "gp": 19329,
+ "gp": 5051,
+ "gpa": 24098,
+ "gps": 13639,
+ "gpu": 38561,
+ "gq": 40286,
+ "gq": 31324,
+ "gr": 709,
+ "gr": 6062,
+ "gra": 782,
+ "gra": 15276,
+ "grab": 4646,
+ "grabbed": 22856,
+ "grabbing": 26440,
+ "grabs": 17076,
+ "grac": 11323,
+ "grace": 13225,
+ "grace": 5142,
+ "graced": 31894,
+ "graceful": 25242,
+ "graces": 38629,
+ "graci": 11174,
+ "gracias": 16463,
+ "gracie": 23235,
+ "gracing": 37263,
+ "gracious": 29044,
+ "grad": 19869,
+ "grad": 7291,
+ "gradable": 41529,
+ "grade": 45435,
+ "grade": 3394,
+ "graded": 13823,
+ "grader": 23930,
+ "graders": 10930,
+ "grades": 10838,
+ "gradient": 36885,
+ "grading": 19016,
+ "grads": 17811,
+ "gradu": 3230,
+ "gradual": 45210,
+ "gradually": 32192,
+ "graduate": 6675,
+ "graduated": 15128,
+ "graduates": 12236,
+ "graduating": 14819,
+ "graduation": 8060,
+ "grady": 33980,
+ "graeme": 30192,
+ "graf": 46478,
+ "graf": 39765,
+ "graff": 10656,
+ "graffiti": 11676,
+ "graft": 32698,
+ "grafton": 47347,
+ "graham": 19805,
+ "graham": 7711,
+ "grail": 37184,
+ "grain": 44003,
+ "grain": 12109,
+ "grains": 25791,
+ "gral": 25631,
+ "gram": 2949,
+ "gram": 2338,
+ "grammar": 16077,
+ "grammy": 15388,
+ "grammys": 18121,
+ "grams": 6294,
+ "gran": 3892,
+ "gran": 14493,
+ "granada": 31172,
+ "grand": 3058,
+ "grand": 2991,
+ "grandad": 29148,
+ "grandchildren": 36856,
+ "granddaughter": 29460,
+ "grande": 37514,
+ "grande": 10757,
+ "grandes": 36382,
+ "grandfather": 15346,
+ "grandma": 10525,
+ "grandmother": 17469,
+ "grandpa": 14582,
+ "grandparents": 21311,
+ "grandprix": 39358,
+ "grandson": 20766,
+ "grandstand": 43172,
+ "grange": 45027,
+ "grange": 23850,
+ "granger": 42968,
+ "granite": 18813,
+ "grann": 45585,
+ "granny": 22710,
+ "granola": 34271,
+ "grant": 18682,
+ "grant": 5442,
+ "granted": 14156,
+ "granth": 41283,
+ "grants": 15123,
+ "grape": 19131,
+ "grape": 15959,
+ "grapefruit": 28347,
+ "grapes": 18580,
+ "grapevine": 47619,
+ "graph": 1349,
+ "graph": 4407,
+ "graphene": 38387,
+ "grapher": 14987,
+ "graphers": 32088,
+ "graphic": 15653,
+ "graphic": 4245,
+ "graphical": 20878,
+ "graphicdesign": 21907,
+ "graphics": 9492,
+ "graphies": 40164,
+ "graphite": 29447,
+ "graphs": 24670,
+ "graphy": 4897,
+ "grapp": 30843,
+ "gras": 31517,
+ "gras": 17584,
+ "grasp": 34975,
+ "grass": 11584,
+ "grass": 5922,
+ "grasses": 46807,
+ "grasshopper": 48894,
+ "grassi": 42294,
+ "grasso": 34808,
+ "grassroots": 21991,
+ "grassy": 44140,
+ "grat": 9221,
+ "grate": 32463,
+ "grateful": 45659,
+ "grateful": 5730,
+ "grati": 36402,
+ "gratis": 33638,
+ "gratitude": 12614,
+ "grav": 20663,
+ "grave": 16606,
+ "grave": 9981,
+ "gravel": 27054,
+ "graves": 17665,
+ "graveyard": 31176,
+ "gravit": 26150,
+ "gravitational": 45268,
+ "gravity": 47426,
+ "gravity": 15160,
+ "gravy": 21225,
+ "gray": 12703,
+ "gray": 7048,
+ "grays": 46848,
+ "grayson": 45831,
+ "grayson": 25471,
+ "grazi": 42427,
+ "grazie": 38698,
+ "grazing": 29889,
+ "grc": 44069,
+ "gre": 689,
+ "gre": 17878,
+ "grease": 24132,
+ "greasy": 44376,
+ "great": 3265,
+ "great": 830,
+ "greate": 31930,
+ "greater": 32725,
+ "greater": 7033,
+ "greatest": 39080,
+ "greatest": 4153,
+ "greatly": 13978,
+ "greatness": 14189,
+ "greats": 21855,
+ "greaves": 42350,
+ "greco": 39103,
+ "gree": 9987,
+ "gree": 30774,
+ "greece": 6965,
+ "greed": 26147,
+ "greedy": 33301,
+ "greek": 23844,
+ "greek": 6842,
+ "greeks": 35866,
+ "green": 2762,
+ "green": 1901,
+ "greenberg": 46662,
+ "greene": 16383,
+ "greener": 31169,
+ "greenery": 42493,
+ "greenfield": 39924,
+ "greeng": 42077,
+ "greenhouse": 20819,
+ "greening": 48673,
+ "greenland": 27345,
+ "greenpeace": 44755,
+ "greens": 10235,
+ "greensboro": 33436,
+ "greenville": 25156,
+ "greenway": 35205,
+ "greenwich": 18658,
+ "greenwood": 25782,
+ "greer": 34345,
+ "greet": 11042,
+ "greet": 11997,
+ "greeted": 24546,
+ "greeting": 17754,
+ "greetings": 11569,
+ "greets": 25464,
+ "greg": 6894,
+ "greg": 7943,
+ "gregation": 20131,
+ "gregg": 39422,
+ "gregg": 22929,
+ "gregor": 33856,
+ "gregor": 16177,
+ "gregory": 16253,
+ "gren": 13941,
+ "gren": 20119,
+ "grenade": 33679,
+ "grenfell": 42107,
+ "gres": 39670,
+ "gress": 2752,
+ "gret": 30041,
+ "greta": 33443,
+ "gretchen": 45516,
+ "grette": 38774,
+ "grew": 10451,
+ "grey": 9190,
+ "grey": 5046,
+ "greyhound": 27363,
+ "greyhounds": 45718,
+ "greys": 44311,
+ "greysanatomy": 36833,
+ "gri": 2169,
+ "gri": 18484,
+ "grid": 29067,
+ "grid": 9882,
+ "gridi": 41063,
+ "gridiron": 47786,
+ "grids": 46500,
+ "grief": 21058,
+ "grier": 22016,
+ "griev": 36400,
+ "grieving": 42383,
+ "griez": 47962,
+ "griezmann": 48396,
+ "griff": 17855,
+ "griff": 35551,
+ "griffi": 28676,
+ "griffin": 46612,
+ "griffin": 13161,
+ "griffith": 24375,
+ "griffiths": 34182,
+ "gril": 49091,
+ "grill": 44083,
+ "grill": 9519,
+ "grille": 34748,
+ "grilled": 10691,
+ "grilling": 28324,
+ "grills": 39464,
+ "grim": 20383,
+ "grim": 23635,
+ "grime": 37101,
+ "grimes": 25057,
+ "grimm": 27865,
+ "grims": 34861,
+ "grimsby": 41513,
+ "grin": 11033,
+ "grin": 28697,
+ "grinch": 40527,
+ "grind": 25730,
+ "grind": 11810,
+ "grinder": 31733,
+ "grinding": 21541,
+ "gring": 40135,
+ "grip": 15521,
+ "gripping": 34567,
+ "grips": 27819,
+ "gris": 29150,
+ "grit": 22037,
+ "grit": 22087,
+ "grits": 44307,
+ "gritty": 33704,
+ "grizz": 14877,
+ "grizz": 44088,
+ "grizzlies": 25594,
+ "grizzly": 29676,
+ "grl": 48005,
+ "gro": 1464,
+ "gro": 12691,
+ "grocer": 11633,
+ "groceries": 32409,
+ "grocery": 13826,
+ "grom": 45284,
+ "gron": 22345,
+ "groningen": 45639,
+ "groo": 9015,
+ "groom": 39883,
+ "groom": 22813,
+ "grooming": 25575,
+ "groot": 37708,
+ "groove": 39484,
+ "groove": 17680,
+ "grooves": 43954,
+ "groovy": 30143,
+ "gros": 26834,
+ "gros": 32639,
+ "gross": 31080,
+ "gross": 11541,
+ "grosven": 46911,
+ "grote": 47207,
+ "grotto": 45260,
+ "grou": 1582,
+ "groun": 45110,
+ "ground": 9558,
+ "ground": 2461,
+ "groundbreaking": 21006,
+ "grounded": 27799,
+ "grounds": 8454,
+ "groundwater": 39457,
+ "group": 19045,
+ "group": 1771,
+ "groupe": 47654,
+ "groups": 6776,
+ "grouse": 36327,
+ "grove": 31756,
+ "grove": 7463,
+ "grover": 31345,
+ "groves": 27306,
+ "grow": 3179,
+ "grow": 4559,
+ "grower": 44925,
+ "growers": 25689,
+ "growing": 28429,
+ "growing": 4425,
+ "growingup": 43433,
+ "growler": 47096,
+ "grown": 41762,
+ "grown": 7120,
+ "grows": 13352,
+ "growth": 17925,
+ "growth": 4026,
+ "growthhacking": 25963,
+ "grp": 27321,
+ "grt": 28557,
+ "gru": 5957,
+ "grub": 34019,
+ "grue": 42047,
+ "gruesome": 47111,
+ "grum": 45454,
+ "grump": 49015,
+ "grumpy": 23610,
+ "grun": 16203,
+ "grunge": 33745,
+ "gry": 16140,
+ "gry": 5364,
+ "gs": 25818,
+ "gs": 1345,
+ "gsa": 40433,
+ "gsc": 47751,
+ "gshore": 43392,
+ "gsm": 32181,
+ "gsp": 49173,
+ "gst": 22239,
+ "gt": 16151,
+ "gt": 4725,
+ "gta": 14826,
+ "gta": 15338,
+ "gtaonline": 27292,
+ "gtav": 27283,
+ "gti": 39954,
+ "gto": 39071,
+ "gtr": 33407,
+ "gts": 37338,
+ "gtx": 35230,
+ "gu": 700,
+ "gu": 12916,
+ "gua": 23751,
+ "guacam": 37477,
+ "guacamole": 40115,
+ "guad": 22966,
+ "guadal": 46097,
+ "guadalu": 36994,
+ "guadalupe": 38360,
+ "guam": 37325,
+ "guan": 44191,
+ "guan": 42406,
+ "guang": 27019,
+ "guangzhou": 37857,
+ "guar": 4119,
+ "guaran": 9242,
+ "guarantee": 17421,
+ "guaranteed": 14731,
+ "guarantees": 40154,
+ "guard": 30776,
+ "guard": 4901,
+ "guarded": 40602,
+ "guardi": 12008,
+ "guardia": 43628,
+ "guardian": 23713,
+ "guardian": 9498,
+ "guardians": 21479,
+ "guarding": 24966,
+ "guardiola": 32100,
+ "guards": 12810,
+ "guatem": 19423,
+ "guatemala": 21670,
+ "guay": 48591,
+ "guay": 24247,
+ "gubernat": 41400,
+ "gubernatorial": 41618,
+ "gucci": 16779,
+ "gud": 48061,
+ "gud": 22378,
+ "gue": 2030,
+ "gue": 2917,
+ "gued": 38893,
+ "guel": 23146,
+ "guelph": 27660,
+ "guer": 10391,
+ "guern": 29277,
+ "guernsey": 33982,
+ "guerra": 38215,
+ "guerrero": 31967,
+ "guerrilla": 36715,
+ "gues": 39971,
+ "gues": 12601,
+ "guess": 35506,
+ "guess": 3135,
+ "guessed": 28005,
+ "guesses": 30623,
+ "guessing": 21891,
+ "guest": 27349,
+ "guest": 3781,
+ "guests": 6212,
+ "guet": 36797,
+ "guetta": 45904,
+ "guez": 12313,
+ "gug": 31358,
+ "guggen": 35086,
+ "guggenheim": 37135,
+ "gui": 2587,
+ "gui": 25746,
+ "guid": 11437,
+ "guidance": 12508,
+ "guide": 21845,
+ "guide": 3555,
+ "guided": 13194,
+ "guidelines": 16591,
+ "guides": 14375,
+ "guiding": 22759,
+ "guido": 41818,
+ "guil": 5008,
+ "guild": 19755,
+ "guild": 16597,
+ "guildford": 34450,
+ "guildhall": 47224,
+ "guillau": 41123,
+ "guillaume": 45394,
+ "guiller": 33660,
+ "guillermo": 39524,
+ "guilt": 26354,
+ "guilty": 9761,
+ "guin": 13284,
+ "guin": 47863,
+ "guine": 13759,
+ "guinea": 18537,
+ "guinness": 16648,
+ "guire": 18209,
+ "guise": 42024,
+ "guit": 3759,
+ "guitar": 21746,
+ "guitar": 5084,
+ "guitarist": 13035,
+ "guitars": 15023,
+ "guj": 34935,
+ "gujar": 12698,
+ "gujarat": 14714,
+ "guk": 20280,
+ "gul": 5530,
+ "gul": 21350,
+ "gula": 27426,
+ "gular": 34969,
+ "gulf": 22101,
+ "gulf": 11279,
+ "gull": 48764,
+ "gull": 28778,
+ "gulls": 37501,
+ "gully": 46112,
+ "gum": 22041,
+ "gum": 11235,
+ "gumb": 40147,
+ "gumbo": 47126,
+ "gummy": 34276,
+ "gums": 46609,
+ "gun": 2748,
+ "gun": 3496,
+ "guna": 43333,
+ "gundam": 26087,
+ "gundy": 21162,
+ "gunman": 32743,
+ "gunmen": 44738,
+ "gunn": 27473,
+ "gunna": 24002,
+ "gunnar": 45301,
+ "gunner": 35285,
+ "gunners": 37788,
+ "guns": 7591,
+ "gunsense": 44781,
+ "gunshot": 49250,
+ "gunsn": 49028,
+ "gup": 38632,
+ "gup": 47335,
+ "gupta": 15905,
+ "gur": 3218,
+ "gur": 30224,
+ "gura": 46836,
+ "gurgaon": 33240,
+ "guri": 43888,
+ "gurl": 25445,
+ "gurmee": 35482,
+ "gurmeetramrahim": 36549,
+ "guru": 18629,
+ "guru": 10800,
+ "gurudev": 48647,
+ "gus": 8018,
+ "gust": 24629,
+ "gusta": 23024,
+ "gusta": 44196,
+ "gustav": 32062,
+ "gustav": 37921,
+ "gustave": 43170,
+ "gustavo": 45943,
+ "gusto": 37937,
+ "gusts": 20896,
+ "gusty": 27589,
+ "gut": 24780,
+ "gut": 13486,
+ "guter": 44963,
+ "guterres": 48738,
+ "guth": 31696,
+ "guthrie": 33164,
+ "gutier": 32773,
+ "gutierrez": 33739,
+ "guts": 25983,
+ "gutted": 26524,
+ "gutter": 40537,
+ "guwa": 43063,
+ "guwahati": 45045,
+ "guy": 10008,
+ "guy": 2149,
+ "guyana": 45215,
+ "guyen": 28031,
+ "guys": 43588,
+ "guys": 1791,
+ "guyz": 48170,
+ "guzman": 37960,
+ "gv": 15462,
+ "gv": 17336,
+ "gw": 7172,
+ "gw": 15717,
+ "gwen": 32165,
+ "gwen": 24182,
+ "gwin": 43005,
+ "gwy": 32226,
+ "gwyne": 36923,
+ "gx": 40227,
+ "gy": 2168,
+ "gy": 1164,
+ "gya": 43214,
+ "gyan": 43814,
+ "gye": 21728,
+ "gyllen": 49348,
+ "gym": 9902,
+ "gym": 5222,
+ "gymna": 13517,
+ "gymnasium": 42847,
+ "gymnast": 42658,
+ "gymnastics": 20116,
+ "gyn": 39603,
+ "gyne": 45836,
+ "gyp": 40053,
+ "gypsy": 22354,
+ "gypt": 41921,
+ "gz": 45937,
+ "gz": 35841,
+ "gö": 40778,
+ "gü": 31907,
+ "h": 71,
+ "h": 327,
+ "ha": 560,
+ "ha": 1429,
+ "haa": 26814,
+ "haal": 35869,
+ "haan": 36284,
+ "haar": 45247,
+ "haar": 35859,
+ "haas": 27443,
+ "haasan": 26601,
+ "hab": 20573,
+ "hab": 20002,
+ "haban": 46225,
+ "haber": 44737,
+ "habit": 8491,
+ "habit": 17215,
+ "habitat": 11747,
+ "habitats": 35344,
+ "habits": 14540,
+ "habs": 27489,
+ "hac": 20343,
+ "hace": 43623,
+ "haci": 40674,
+ "hack": 6610,
+ "hack": 11182,
+ "hackathon": 25182,
+ "hacked": 19575,
+ "hacker": 22376,
+ "hackers": 21498,
+ "hacking": 12939,
+ "hackney": 48811,
+ "hackney": 24928,
+ "hacks": 19965,
+ "had": 10660,
+ "had": 1100,
+ "hadi": 39058,
+ "hadid": 26415,
+ "hadith": 46907,
+ "hadley": 44995,
+ "hadn": 21480,
+ "hadoop": 43868,
+ "hae": 30723,
+ "hae": 27193,
+ "hafi": 39914,
+ "hag": 26855,
+ "hag": 43207,
+ "hagan": 47489,
+ "hagen": 14664,
+ "hager": 48773,
+ "hagg": 26324,
+ "hague": 28988,
+ "hah": 18108,
+ "hah": 13680,
+ "haha": 1913,
+ "haha": 3060,
+ "hahah": 27253,
+ "hahah": 15441,
+ "hahaha": 4722,
+ "hahahah": 37513,
+ "hahahah": 20096,
+ "hahahaha": 8058,
+ "hahahaha": 9501,
+ "hahahahah": 33334,
+ "hahahahaha": 16347,
+ "hahahahahaha": 26487,
+ "hahahahahahaha": 43653,
+ "hahahahahahahaha": 36126,
+ "hahahha": 49205,
+ "hahn": 35596,
+ "hai": 8734,
+ "hai": 5234,
+ "haider": 42200,
+ "haiku": 19542,
+ "hail": 15272,
+ "hail": 8634,
+ "hailed": 44604,
+ "hailey": 27703,
+ "hailing": 47288,
+ "hails": 32571,
+ "hailstate": 35063,
+ "hain": 23861,
+ "hair": 4658,
+ "hair": 2225,
+ "haircare": 43682,
+ "haircut": 14711,
+ "hairdresser": 47468,
+ "haired": 27202,
+ "hairs": 27951,
+ "hairstyle": 22324,
+ "hairstyles": 40627,
+ "hairy": 26513,
+ "haiti": 17368,
+ "haitian": 37577,
+ "haj": 27885,
+ "haj": 43191,
+ "haji": 41889,
+ "hajj": 35576,
+ "hak": 25142,
+ "hak": 40671,
+ "haka": 44011,
+ "hake": 41663,
+ "hal": 1296,
+ "hal": 8708,
+ "hala": 25918,
+ "halal": 34216,
+ "halam": 29061,
+ "halamadrid": 31132,
+ "halder": 32201,
+ "hale": 37038,
+ "hale": 14701,
+ "halen": 39204,
+ "halep": 49017,
+ "haley": 37330,
+ "haley": 16839,
+ "half": 7453,
+ "half": 2349,
+ "halftime": 13742,
+ "halfway": 16736,
+ "hali": 9860,
+ "hali": 43030,
+ "halibut": 49030,
+ "halifax": 13411,
+ "hall": 6850,
+ "hall": 2140,
+ "halla": 29569,
+ "halle": 27763,
+ "halle": 32239,
+ "hallelujah": 36993,
+ "halli": 32665,
+ "hallmark": 31040,
+ "hallmark": 32053,
+ "hallmarkchannel": 36840,
+ "hallo": 3463,
+ "halloffame": 48578,
+ "halloween": 28537,
+ "halloween": 3739,
+ "halls": 18052,
+ "hallucin": 35385,
+ "hallway": 26845,
+ "halo": 33331,
+ "halo": 11918,
+ "halsey": 34256,
+ "halt": 25640,
+ "halter": 47194,
+ "halton": 45445,
+ "ham": 1522,
+ "ham": 1714,
+ "hama": 17944,
+ "hamas": 14818,
+ "hamburg": 18409,
+ "hamburger": 33928,
+ "hamid": 32377,
+ "hamil": 6725,
+ "hamill": 45784,
+ "hamill": 48729,
+ "hamillhimself": 47324,
+ "hamilton": 22448,
+ "hamilton": 7684,
+ "hamlet": 27722,
+ "hamlin": 49326,
+ "hamm": 46110,
+ "hammer": 15331,
+ "hammer": 9401,
+ "hammered": 37251,
+ "hammers": 35649,
+ "hammersmith": 42127,
+ "hammock": 33682,
+ "hammond": 21761,
+ "hamont": 18518,
+ "hamp": 6665,
+ "hamper": 27692,
+ "hampshire": 16006,
+ "hampstead": 37340,
+ "hampton": 36582,
+ "hampton": 12285,
+ "hamptons": 42415,
+ "hamr": 47979,
+ "hamradio": 36712,
+ "hams": 25619,
+ "hamster": 33313,
+ "hamstring": 39990,
+ "hamza": 45762,
+ "han": 1545,
+ "han": 3565,
+ "hana": 16801,
+ "hand": 1722,
+ "hand": 2463,
+ "handbag": 22654,
+ "handbags": 35667,
+ "handball": 27988,
+ "handbook": 25147,
+ "handcrafted": 22185,
+ "handed": 10881,
+ "handedly": 48656,
+ "handel": 40072,
+ "handful": 23725,
+ "handheld": 26812,
+ "handic": 17812,
+ "handicap": 27063,
+ "handicapp": 42349,
+ "handing": 19196,
+ "handle": 43681,
+ "handle": 7245,
+ "handled": 26824,
+ "handler": 29097,
+ "handles": 22124,
+ "handling": 14071,
+ "handmade": 18054,
+ "handmade": 6737,
+ "handmadehour": 25724,
+ "handover": 46922,
+ "hands": 3500,
+ "handshake": 38418,
+ "handsome": 7438,
+ "handwriting": 29986,
+ "handwritten": 35192,
+ "handy": 13479,
+ "hane": 28411,
+ "hang": 3351,
+ "hang": 5592,
+ "hangar": 33439,
+ "hanged": 40807,
+ "hanger": 28905,
+ "hangin": 22670,
+ "hanging": 4850,
+ "hangout": 17572,
+ "hangover": 20755,
+ "hangs": 21785,
+ "hani": 39944,
+ "hani": 18374,
+ "hank": 35993,
+ "hank": 17655,
+ "hanks": 29943,
+ "hanley": 47284,
+ "hann": 5584,
+ "hanna": 10075,
+ "hannah": 18622,
+ "hannah": 9142,
+ "hannel": 43477,
+ "hanni": 19493,
+ "hannibal": 25149,
+ "hannity": 24569,
+ "hannover": 39976,
+ "hanoi": 36134,
+ "hanover": 33246,
+ "hans": 35172,
+ "hans": 16628,
+ "hansen": 19729,
+ "hanson": 24602,
+ "hant": 40641,
+ "hanuk": 32774,
+ "hanukkah": 34247,
+ "hanuman": 46975,
+ "hao": 27184,
+ "hap": 44981,
+ "hap": 47988,
+ "happ": 784,
+ "happen": 21486,
+ "happen": 4506,
+ "happened": 4402,
+ "happening": 4284,
+ "happeningnow": 43107,
+ "happenings": 41998,
+ "happens": 4988,
+ "happier": 14118,
+ "happiest": 13811,
+ "happily": 17316,
+ "happiness": 5096,
+ "happy": 2952,
+ "happy": 900,
+ "happybirthday": 9651,
+ "happybirthday": 12207,
+ "happydays": 25106,
+ "happye": 33922,
+ "happyeaster": 38745,
+ "happyfathersday": 43534,
+ "happyfriday": 33340,
+ "happyhalloween": 28750,
+ "happyholidays": 32186,
+ "happyhour": 32036,
+ "happymonday": 47364,
+ "happymothersday": 42425,
+ "happynewyear": 18655,
+ "happythanksgiving": 40593,
+ "happyvalentinesday": 42403,
+ "haps": 9114,
+ "haq": 32445,
+ "har": 915,
+ "har": 5888,
+ "hara": 10367,
+ "haram": 35732,
+ "haram": 22950,
+ "haran": 27921,
+ "harare": 43562,
+ "haras": 26644,
+ "harass": 16481,
+ "harassed": 43067,
+ "harassment": 16641,
+ "harat": 28984,
+ "harb": 5856,
+ "harbaugh": 45220,
+ "harbor": 40686,
+ "harbor": 10202,
+ "harbour": 35430,
+ "harbour": 10011,
+ "harcourt": 48093,
+ "hard": 3312,
+ "hard": 1626,
+ "hardcover": 31123,
+ "harden": 27350,
+ "harder": 12274,
+ "hardest": 15258,
+ "hardin": 43802,
+ "harding": 24382,
+ "hardly": 17363,
+ "hardro": 28126,
+ "hardrock": 48365,
+ "hardrock": 40739,
+ "hards": 44048,
+ "hardship": 45085,
+ "hardt": 17922,
+ "hardware": 11957,
+ "hardwell": 45572,
+ "hardwick": 46864,
+ "hardwood": 28167,
+ "hardwork": 42554,
+ "hardwork": 27404,
+ "hardworking": 28095,
+ "hardworkpaysoff": 49193,
+ "hardy": 48179,
+ "hardy": 14113,
+ "hare": 27903,
+ "hare": 18464,
+ "harga": 39738,
+ "hari": 25472,
+ "hari": 8981,
+ "harlan": 49133,
+ "harle": 29096,
+ "harlem": 17771,
+ "harley": 24702,
+ "harley": 13632,
+ "harleydavidson": 39183,
+ "harlow": 34113,
+ "harm": 16656,
+ "harm": 14452,
+ "harman": 42434,
+ "harmed": 39637,
+ "harmful": 21725,
+ "harmless": 44369,
+ "harmon": 10828,
+ "harmon": 28729,
+ "harmony": 10785,
+ "harms": 46703,
+ "harne": 43323,
+ "harness": 23205,
+ "harold": 16917,
+ "harp": 27339,
+ "harper": 31288,
+ "harper": 12634,
+ "harri": 6639,
+ "harrier": 37372,
+ "harriet": 27154,
+ "harrington": 34340,
+ "harris": 25356,
+ "harris": 6925,
+ "harrisburg": 40590,
+ "harrison": 34389,
+ "harrison": 10540,
+ "harro": 18939,
+ "harrogate": 30842,
+ "harrow": 38807,
+ "harry": 11094,
+ "harry": 3600,
+ "harrypotter": 23375,
+ "harsh": 30596,
+ "harsh": 16944,
+ "hart": 9335,
+ "hart": 7752,
+ "hartford": 23434,
+ "harth": 35619,
+ "hartle": 47482,
+ "hartley": 31268,
+ "hartman": 43294,
+ "haru": 35099,
+ "harvard": 28118,
+ "harvard": 12848,
+ "harve": 6405,
+ "harvest": 44495,
+ "harvest": 8971,
+ "harvested": 35899,
+ "harvesting": 26674,
+ "harvey": 33289,
+ "harvey": 9586,
+ "harvick": 46983,
+ "haryana": 27661,
+ "has": 13855,
+ "has": 791,
+ "hasan": 30049,
+ "hasbro": 37405,
+ "hash": 6338,
+ "hash": 19199,
+ "hashi": 41831,
+ "hashmi": 35852,
+ "hashtag": 34015,
+ "hashtag": 9238,
+ "hashtags": 23514,
+ "haskell": 48550,
+ "hasn": 9143,
+ "hass": 9298,
+ "hassan": 15829,
+ "hassee": 37117,
+ "hassel": 32204,
+ "hassle": 35762,
+ "hast": 18146,
+ "hasta": 36623,
+ "hastings": 22035,
+ "hat": 3447,
+ "hat": 3801,
+ "hatch": 24202,
+ "hatch": 17809,
+ "hatchback": 42348,
+ "hatched": 42158,
+ "hate": 23546,
+ "hate": 3753,
+ "hated": 21298,
+ "hateful": 36418,
+ "hater": 36917,
+ "haters": 14027,
+ "hates": 14957,
+ "hatfield": 38448,
+ "hath": 27894,
+ "hath": 34416,
+ "hathaway": 31801,
+ "hati": 26045,
+ "hating": 25668,
+ "hatred": 19046,
+ "hats": 9812,
+ "hatt": 8747,
+ "hatton": 44861,
+ "hau": 5152,
+ "hauer": 48751,
+ "haul": 23743,
+ "haul": 12332,
+ "hauled": 46620,
+ "hauling": 43132,
+ "haun": 9676,
+ "haunt": 31039,
+ "haunted": 14944,
+ "haunting": 24034,
+ "haunts": 48035,
+ "haus": 41755,
+ "haus": 16478,
+ "hausen": 33338,
+ "hauser": 46586,
+ "haute": 28854,
+ "hav": 13443,
+ "hav": 20447,
+ "havan": 36304,
+ "havana": 23357,
+ "havas": 46261,
+ "have": 18053,
+ "have": 720,
+ "haven": 33074,
+ "haven": 3871,
+ "havent": 29130,
+ "haver": 27876,
+ "haves": 49088,
+ "havin": 31937,
+ "having": 1977,
+ "havoc": 24447,
+ "haw": 2788,
+ "haw": 26954,
+ "hawa": 6067,
+ "hawa": 46278,
+ "hawai": 15800,
+ "hawaii": 32413,
+ "hawaii": 8265,
+ "hawaiian": 17734,
+ "hawan": 27765,
+ "hawk": 14704,
+ "hawk": 8218,
+ "hawke": 38178,
+ "hawker": 39051,
+ "hawkeye": 38666,
+ "hawkeyes": 34266,
+ "hawking": 33437,
+ "hawkins": 19740,
+ "hawks": 44806,
+ "hawks": 5841,
+ "hawthorn": 45372,
+ "hawthorne": 36730,
+ "hay": 4871,
+ "hay": 11367,
+ "haya": 41325,
+ "hayat": 49360,
+ "hayden": 19806,
+ "haydn": 48207,
+ "haye": 36583,
+ "hayes": 13555,
+ "hayley": 39986,
+ "hayley": 22204,
+ "haynes": 30496,
+ "hays": 41524,
+ "hayward": 29400,
+ "haz": 5040,
+ "haz": 39921,
+ "hazard": 26174,
+ "hazard": 15178,
+ "hazardous": 27102,
+ "hazards": 30639,
+ "haze": 22785,
+ "hazel": 19838,
+ "hazel": 21882,
+ "hazelnut": 35816,
+ "hazi": 22740,
+ "hazmat": 48887,
+ "hazrat": 45775,
+ "hazy": 32655,
+ "hb": 6854,
+ "hb": 12576,
+ "hbcu": 40008,
+ "hbd": 25277,
+ "hbd": 13594,
+ "hbo": 15252,
+ "hc": 15831,
+ "hc": 7821,
+ "hcs": 46850,
+ "hd": 11601,
+ "hd": 4414,
+ "hdd": 40508,
+ "hdmi": 33302,
+ "hdr": 28065,
+ "he": 651,
+ "he": 797,
+ "hea": 27150,
+ "hea": 32790,
+ "head": 1603,
+ "head": 1375,
+ "headache": 23849,
+ "headaches": 38025,
+ "headband": 28556,
+ "headed": 6153,
+ "header": 11077,
+ "heading": 4409,
+ "headless": 45219,
+ "headlights": 42422,
+ "headline": 10891,
+ "headliner": 38880,
+ "headlines": 14706,
+ "headlining": 26971,
+ "headphone": 37524,
+ "headphones": 14906,
+ "headquarters": 13041,
+ "heads": 5174,
+ "headset": 23883,
+ "headshot": 34890,
+ "heal": 1231,
+ "heal": 13833,
+ "healed": 31456,
+ "healer": 38328,
+ "healey": 38985,
+ "healing": 9295,
+ "heals": 32384,
+ "health": 2145,
+ "health": 1728,
+ "healthand": 43704,
+ "healthcare": 42500,
+ "healthcare": 6023,
+ "healthier": 18242,
+ "healthtech": 42694,
+ "healthy": 10330,
+ "healthy": 3782,
+ "healthye": 31532,
+ "healthyeating": 33761,
+ "healthyfood": 39996,
+ "healthylifestyle": 46254,
+ "healthyliving": 27293,
+ "healy": 34299,
+ "heap": 34781,
+ "heaps": 44446,
+ "hear": 2749,
+ "hear": 2584,
+ "heard": 4063,
+ "hearing": 46353,
+ "hearing": 5541,
+ "hearings": 33175,
+ "hearn": 36613,
+ "hears": 25395,
+ "heart": 4975,
+ "heart": 1936,
+ "heartbeat": 29154,
+ "heartbreak": 29281,
+ "heartbreaking": 21322,
+ "heartbroken": 35383,
+ "hearted": 21679,
+ "heartfelt": 22904,
+ "hearth": 31563,
+ "hearthstone": 34054,
+ "hearti": 29345,
+ "hearties": 44572,
+ "heartland": 31923,
+ "heartless": 47022,
+ "heartnews": 40426,
+ "hearts": 5516,
+ "heartw": 30002,
+ "heartwarming": 34080,
+ "hearty": 26994,
+ "heat": 12175,
+ "heat": 4403,
+ "heated": 17057,
+ "heater": 23246,
+ "heath": 12794,
+ "heath": 11719,
+ "heather": 20230,
+ "heather": 12470,
+ "heathrow": 24171,
+ "heating": 12478,
+ "heaton": 34557,
+ "heats": 36106,
+ "heatwave": 25726,
+ "heav": 2409,
+ "heaven": 15520,
+ "heaven": 5545,
+ "heavenly": 19117,
+ "heavens": 26026,
+ "heavier": 31253,
+ "heaviest": 33268,
+ "heavily": 14123,
+ "heavy": 12048,
+ "heavy": 4200,
+ "heavymetal": 39804,
+ "heavyweight": 17448,
+ "heb": 24700,
+ "heb": 34515,
+ "hebdo": 41817,
+ "hebrew": 27298,
+ "hebrides": 45121,
+ "hebron": 45725,
+ "hec": 18932,
+ "heck": 22985,
+ "heck": 14427,
+ "hectares": 44162,
+ "hectic": 37245,
+ "hector": 25852,
+ "hed": 18271,
+ "hedge": 16229,
+ "hedge": 20294,
+ "hedgehog": 21940,
+ "hedges": 41345,
+ "hee": 18364,
+ "hee": 15773,
+ "heechul": 42487,
+ "heed": 15118,
+ "heel": 33646,
+ "heel": 16861,
+ "heels": 10909,
+ "heem": 30061,
+ "heer": 40473,
+ "hef": 29473,
+ "heff": 48756,
+ "hefty": 48584,
+ "heg": 41995,
+ "heh": 25834,
+ "hehe": 48723,
+ "hehe": 10658,
+ "hehehe": 24138,
+ "hei": 6101,
+ "hei": 29051,
+ "heidel": 42927,
+ "heidelberg": 48445,
+ "heidi": 44860,
+ "heidi": 23867,
+ "heifer": 48219,
+ "heigh": 43883,
+ "height": 10788,
+ "heights": 8418,
+ "heim": 10931,
+ "heim": 9768,
+ "heimer": 39517,
+ "hein": 15487,
+ "hein": 43206,
+ "heine": 28742,
+ "heineken": 36874,
+ "heinrich": 47877,
+ "heinz": 32359,
+ "heir": 27083,
+ "heir": 34007,
+ "heirloom": 34232,
+ "heirs": 43834,
+ "heis": 21849,
+ "heisman": 34537,
+ "heist": 31035,
+ "heit": 37255,
+ "hel": 919,
+ "hel": 11579,
+ "hela": 48212,
+ "held": 4042,
+ "hele": 46129,
+ "helen": 17576,
+ "helen": 11291,
+ "helena": 23109,
+ "helene": 41591,
+ "helens": 45940,
+ "heli": 33874,
+ "heli": 40183,
+ "helicop": 10035,
+ "helicopter": 11956,
+ "helicopters": 26922,
+ "helium": 46505,
+ "helix": 35247,
+ "hell": 8410,
+ "hell": 4141,
+ "hella": 19800,
+ "hellboy": 48428,
+ "helle": 48600,
+ "helle": 46968,
+ "hellenic": 42544,
+ "heller": 44464,
+ "hello": 12887,
+ "hello": 3306,
+ "hells": 47989,
+ "helly": 48690,
+ "helm": 47970,
+ "helm": 19520,
+ "helmet": 11122,
+ "helmets": 21843,
+ "help": 8641,
+ "help": 1318,
+ "helped": 4845,
+ "helper": 29321,
+ "helpers": 36316,
+ "helpful": 12695,
+ "helping": 3875,
+ "helpless": 47638,
+ "helpline": 43101,
+ "helps": 5144,
+ "helsin": 17842,
+ "helsinki": 19626,
+ "hem": 20270,
+ "hem": 11148,
+ "hemi": 14256,
+ "hemi": 46856,
+ "heming": 30819,
+ "hemingway": 33470,
+ "hemisphere": 32767,
+ "hemmings": 34882,
+ "hemo": 43788,
+ "hemp": 28225,
+ "hemp": 18467,
+ "hems": 32451,
+ "hemsworth": 39428,
+ "hen": 2385,
+ "hen": 8047,
+ "hence": 23640,
+ "hend": 11560,
+ "hender": 49248,
+ "henderson": 14348,
+ "hendrick": 45296,
+ "hendricks": 37588,
+ "hendrix": 23605,
+ "henge": 33104,
+ "henley": 27853,
+ "henna": 39455,
+ "hennessy": 42667,
+ "henri": 19431,
+ "henri": 21610,
+ "henrik": 35772,
+ "henry": 16018,
+ "henry": 5508,
+ "hens": 31742,
+ "henson": 32935,
+ "hep": 17724,
+ "hep": 48791,
+ "hepat": 23767,
+ "hepatitis": 32169,
+ "hepburn": 26348,
+ "her": 1223,
+ "her": 899,
+ "hera": 38724,
+ "heral": 37809,
+ "herald": 27625,
+ "herald": 12851,
+ "herb": 26116,
+ "herb": 15302,
+ "herbal": 21868,
+ "herbali": 44087,
+ "herbalife": 48364,
+ "herbert": 19935,
+ "herbs": 17320,
+ "hercules": 26539,
+ "herd": 36142,
+ "herd": 18589,
+ "here": 9134,
+ "here": 763,
+ "hered": 47976,
+ "hereford": 35543,
+ "heres": 13566,
+ "hereto": 47673,
+ "heri": 31392,
+ "herit": 4720,
+ "heritag": 38273,
+ "heritage": 20962,
+ "heritage": 5455,
+ "herman": 31890,
+ "herman": 21568,
+ "hermann": 40942,
+ "hermes": 34563,
+ "hermi": 35265,
+ "hermione": 45502,
+ "hermit": 43953,
+ "hermitage": 47706,
+ "hermo": 40967,
+ "hermosa": 42531,
+ "hern": 30571,
+ "hern": 43576,
+ "hernandez": 17707,
+ "hero": 7338,
+ "hero": 3756,
+ "heroes": 38010,
+ "heroes": 5506,
+ "heroic": 24255,
+ "heroin": 23841,
+ "heroine": 27420,
+ "heron": 22593,
+ "heros": 37642,
+ "herr": 38537,
+ "herrera": 27755,
+ "herring": 30211,
+ "hers": 25359,
+ "herself": 9207,
+ "hersh": 20379,
+ "hershey": 29734,
+ "hert": 26744,
+ "hertfordshire": 41070,
+ "herts": 35784,
+ "herty": 23454,
+ "hertz": 49383,
+ "hes": 30553,
+ "hes": 12784,
+ "hesit": 23933,
+ "hesitate": 34967,
+ "hess": 41888,
+ "hester": 31105,
+ "het": 37527,
+ "het": 19678,
+ "hetero": 26405,
+ "heu": 20105,
+ "heughan": 32298,
+ "hew": 48141,
+ "hew": 43051,
+ "hewitt": 28871,
+ "hex": 16255,
+ "hex": 31241,
+ "hey": 10759,
+ "hey": 2189,
+ "hez": 34591,
+ "hezbollah": 37636,
+ "hf": 26606,
+ "hf": 20603,
+ "hfx": 47297,
+ "hg": 23986,
+ "hg": 26237,
+ "hgtv": 47657,
+ "hh": 3280,
+ "hh": 5180,
+ "hhh": 8281,
+ "hhhh": 19391,
+ "hhhh": 13121,
+ "hhhhh": 24246,
+ "hhhhhh": 37278,
+ "hhs": 27006,
+ "hi": 677,
+ "hi": 1883,
+ "hia": 20672,
+ "hiatus": 27823,
+ "hib": 15922,
+ "hiber": 38799,
+ "hibis": 36226,
+ "hibiscus": 36460,
+ "hibition": 24658,
+ "hibs": 42814,
+ "hic": 3549,
+ "hic": 38079,
+ "hick": 14813,
+ "hickman": 49148,
+ "hickory": 29905,
+ "hicks": 23429,
+ "hid": 15552,
+ "hid": 14451,
+ "hidalgo": 47464,
+ "hidden": 28305,
+ "hidden": 7029,
+ "hiddleston": 31444,
+ "hide": 17725,
+ "hide": 9379,
+ "hideous": 46588,
+ "hides": 30800,
+ "hiding": 11371,
+ "hie": 15763,
+ "hier": 23433,
+ "hier": 29913,
+ "hierarchy": 44442,
+ "hifi": 38168,
+ "hig": 38108,
+ "higgins": 21783,
+ "high": 1487,
+ "high": 1400,
+ "higher": 5321,
+ "highered": 27072,
+ "highest": 5317,
+ "highland": 32244,
+ "highland": 16062,
+ "highlander": 46251,
+ "highlanders": 40445,
+ "highlands": 16883,
+ "highlight": 8264,
+ "highlighted": 22252,
+ "highlighter": 45460,
+ "highlighting": 17344,
+ "highlights": 6173,
+ "highly": 5302,
+ "highness": 38694,
+ "highs": 15144,
+ "highschool": 23102,
+ "highway": 45344,
+ "highway": 7620,
+ "highways": 28007,
+ "higu": 39115,
+ "hihi": 36240,
+ "hii": 42315,
+ "hijab": 31407,
+ "hika": 41356,
+ "hikari": 44624,
+ "hike": 9404,
+ "hiked": 36471,
+ "hiker": 40947,
+ "hikers": 46090,
+ "hikes": 27076,
+ "hiking": 9118,
+ "hiko": 48708,
+ "hil": 3508,
+ "hil": 17927,
+ "hila": 38837,
+ "hilar": 37337,
+ "hilari": 7784,
+ "hilarious": 8358,
+ "hilariously": 43476,
+ "hilary": 45898,
+ "hilary": 25415,
+ "hilde": 45382,
+ "hill": 3671,
+ "hill": 2682,
+ "hillary": 13257,
+ "hillary": 7074,
+ "hillaryclinton": 15357,
+ "hilli": 32513,
+ "hills": 24178,
+ "hills": 5289,
+ "hillsborough": 32157,
+ "hillside": 37194,
+ "hilltop": 45858,
+ "hilly": 32483,
+ "hilton": 33621,
+ "hilton": 14012,
+ "him": 4128,
+ "him": 1269,
+ "himach": 29132,
+ "himachal": 35461,
+ "himalay": 17552,
+ "himalayan": 30318,
+ "himalayas": 32872,
+ "hime": 45892,
+ "himself": 4530,
+ "himss": 41730,
+ "hin": 1676,
+ "hin": 37930,
+ "hina": 40571,
+ "hinakhan": 45518,
+ "hinch": 49320,
+ "hind": 34460,
+ "hind": 23293,
+ "hindi": 14967,
+ "hinds": 47859,
+ "hindu": 17587,
+ "hindu": 12053,
+ "hinduism": 40592,
+ "hindus": 25701,
+ "hindustan": 46553,
+ "hines": 37462,
+ "hing": 37968,
+ "hini": 33564,
+ "hino": 45343,
+ "hint": 11868,
+ "hinton": 47165,
+ "hints": 20594,
+ "hio": 32897,
+ "hip": 11725,
+ "hip": 6584,
+ "hipho": 8819,
+ "hiphop": 26598,
+ "hiphop": 10914,
+ "hipp": 13607,
+ "hippie": 28637,
+ "hippo": 28398,
+ "hippo": 36729,
+ "hips": 30191,
+ "hipstamatic": 31002,
+ "hipster": 19987,
+ "hipsters": 48265,
+ "hir": 4959,
+ "hir": 14728,
+ "hira": 42577,
+ "hire": 32356,
+ "hire": 8243,
+ "hired": 17602,
+ "hires": 24133,
+ "hiring": 7835,
+ "hiro": 17396,
+ "hiro": 20588,
+ "hiroshima": 33867,
+ "hirsch": 46967,
+ "his": 15211,
+ "his": 787,
+ "hism": 23502,
+ "hispan": 16843,
+ "hispanic": 22676,
+ "hist": 21710,
+ "hist": 13779,
+ "histo": 33479,
+ "histor": 2993,
+ "historia": 46010,
+ "historian": 20697,
+ "historians": 35200,
+ "historic": 30195,
+ "historic": 5726,
+ "historical": 34154,
+ "historical": 8039,
+ "historically": 30445,
+ "histories": 34736,
+ "history": 11142,
+ "history": 1695,
+ "historymonth": 19356,
+ "historyof": 35905,
+ "hit": 5453,
+ "hit": 2341,
+ "hitch": 22937,
+ "hitch": 36203,
+ "hitler": 16518,
+ "hitman": 33290,
+ "hits": 4712,
+ "hitter": 23538,
+ "hitters": 39724,
+ "hitting": 7957,
+ "hiv": 44410,
+ "hiv": 11018,
+ "hive": 38162,
+ "hive": 18521,
+ "hiya": 42393,
+ "hk": 22648,
+ "hk": 12307,
+ "hl": 8297,
+ "hl": 5956,
+ "hle": 32389,
+ "hler": 35418,
+ "hm": 17913,
+ "hm": 7631,
+ "hmm": 13725,
+ "hmmm": 17032,
+ "hmmmm": 34598,
+ "hms": 14625,
+ "hmu": 21630,
+ "hmv": 49288,
+ "hn": 22905,
+ "hn": 7478,
+ "hns": 48412,
+ "ho": 606,
+ "ho": 2971,
+ "hoa": 37517,
+ "hoar": 31628,
+ "hoax": 33438,
+ "hob": 18212,
+ "hobart": 31646,
+ "hobb": 16175,
+ "hobbies": 36370,
+ "hobbit": 23207,
+ "hobbs": 34343,
+ "hobby": 41120,
+ "hobby": 17557,
+ "hobo": 34613,
+ "hobo": 41334,
+ "hoboken": 41568,
+ "hoc": 35880,
+ "hoch": 43772,
+ "hock": 34914,
+ "hock": 46574,
+ "hockey": 16499,
+ "hockey": 4111,
+ "hoco": 34771,
+ "hod": 31062,
+ "hodg": 23660,
+ "hodge": 40585,
+ "hodges": 35061,
+ "hodgson": 37044,
+ "hoe": 32502,
+ "hoe": 11262,
+ "hoek": 40073,
+ "hoes": 21164,
+ "hof": 20186,
+ "hof": 12789,
+ "hofer": 38654,
+ "hoff": 32860,
+ "hoff": 22751,
+ "hofficial": 41949,
+ "hoffman": 22026,
+ "hog": 12075,
+ "hog": 13255,
+ "hogan": 19757,
+ "hogg": 42005,
+ "hogs": 23242,
+ "hogwarts": 29168,
+ "hoh": 43947,
+ "hoi": 39295,
+ "hok": 26942,
+ "hok": 47167,
+ "hokies": 35168,
+ "hokkaido": 49145,
+ "hol": 1187,
+ "hol": 7349,
+ "hola": 28724,
+ "hold": 36496,
+ "hold": 3254,
+ "holden": 21869,
+ "holder": 7862,
+ "holders": 10074,
+ "holding": 5050,
+ "holdings": 24832,
+ "holds": 7286,
+ "hole": 47242,
+ "hole": 5341,
+ "holes": 11266,
+ "holi": 2093,
+ "holi": 21926,
+ "holic": 16348,
+ "holics": 29782,
+ "holiday": 13168,
+ "holiday": 2878,
+ "holidays": 5372,
+ "holiness": 37259,
+ "holistic": 26300,
+ "holl": 27699,
+ "holla": 26500,
+ "holland": 31608,
+ "holland": 9978,
+ "hollande": 47690,
+ "holler": 49047,
+ "holli": 24019,
+ "holliday": 41624,
+ "hollow": 41221,
+ "hollow": 16691,
+ "holloway": 29435,
+ "holly": 12731,
+ "holly": 11923,
+ "hollyo": 41525,
+ "hollyoaks": 43352,
+ "hollywood": 24655,
+ "hollywood": 5518,
+ "holm": 34758,
+ "holm": 12739,
+ "holme": 46149,
+ "holmes": 12756,
+ "holo": 10317,
+ "holocau": 14688,
+ "holocaust": 16476,
+ "hols": 33344,
+ "holt": 18868,
+ "holtz": 44743,
+ "holy": 13910,
+ "holy": 4874,
+ "hom": 906,
+ "hom": 47397,
+ "homa": 9557,
+ "homage": 17746,
+ "home": 2143,
+ "home": 1137,
+ "homebrew": 35046,
+ "homec": 33869,
+ "homecoming": 9008,
+ "homedecor": 15695,
+ "homedepot": 38707,
+ "homegrown": 32554,
+ "homeitems": 42972,
+ "homeland": 21633,
+ "homeless": 18403,
+ "homeless": 9661,
+ "homelessness": 19851,
+ "homemade": 7889,
+ "homeof": 48856,
+ "homeowner": 37267,
+ "homeowners": 29882,
+ "homepage": 29828,
+ "homer": 29307,
+ "homer": 16931,
+ "homers": 38333,
+ "homes": 19480,
+ "homes": 5416,
+ "homeschool": 40994,
+ "homestead": 32609,
+ "homeswee": 46298,
+ "hometown": 12238,
+ "homework": 12495,
+ "homicide": 21520,
+ "homie": 12540,
+ "homies": 18893,
+ "homme": 26193,
+ "homo": 18129,
+ "homo": 30504,
+ "homophobia": 37875,
+ "homophobic": 40975,
+ "homosexual": 44288,
+ "homosexuality": 46720,
+ "homs": 45413,
+ "hon": 1279,
+ "hon": 10296,
+ "honda": 8553,
+ "honduras": 29715,
+ "hone": 38640,
+ "honest": 7814,
+ "honest": 9602,
+ "honestly": 9155,
+ "honesty": 24939,
+ "honey": 9843,
+ "honey": 6406,
+ "honeycomb": 48583,
+ "honeymoon": 22527,
+ "hong": 12144,
+ "hong": 8598,
+ "hongkong": 16659,
+ "honi": 17918,
+ "honolulu": 28096,
+ "honor": 9206,
+ "honor": 3402,
+ "honorable": 19498,
+ "honorary": 15675,
+ "honore": 25868,
+ "honored": 5494,
+ "honoree": 38993,
+ "honorees": 43012,
+ "honoring": 10771,
+ "honors": 10248,
+ "honour": 8240,
+ "honourable": 29855,
+ "honoured": 11945,
+ "honouring": 37754,
+ "honours": 22558,
+ "hoo": 2300,
+ "hoo": 7920,
+ "hood": 18681,
+ "hood": 3222,
+ "hooded": 33631,
+ "hoodie": 13444,
+ "hoodies": 25974,
+ "hoods": 16664,
+ "hoof": 44555,
+ "hook": 30488,
+ "hook": 10395,
+ "hookah": 34214,
+ "hooked": 18138,
+ "hookem": 31465,
+ "hooker": 37891,
+ "hooking": 35240,
+ "hooks": 25068,
+ "hooligans": 48176,
+ "hoon": 21368,
+ "hooo": 44538,
+ "hoop": 31516,
+ "hoop": 19573,
+ "hooper": 35221,
+ "hoops": 9351,
+ "hoor": 22155,
+ "hooray": 24940,
+ "hoos": 46462,
+ "hoosier": 48886,
+ "hoosiers": 42780,
+ "hoot": 29164,
+ "hoover": 25691,
+ "hop": 10848,
+ "hop": 5833,
+ "hope": 5263,
+ "hope": 1683,
+ "hoped": 30628,
+ "hopeful": 21453,
+ "hopefully": 7602,
+ "hopeless": 35586,
+ "hopes": 10018,
+ "hoping": 7207,
+ "hopkins": 17821,
+ "hopp": 48839,
+ "hopped": 34220,
+ "hopper": 21748,
+ "hopping": 27606,
+ "hoppy": 38359,
+ "hops": 21137,
+ "hor": 1407,
+ "hor": 33847,
+ "hora": 26013,
+ "horace": 39282,
+ "horan": 26857,
+ "horde": 44947,
+ "hore": 15380,
+ "horiz": 8144,
+ "horizon": 17924,
+ "horizon": 11920,
+ "horizons": 29685,
+ "horizontal": 25775,
+ "hormon": 27096,
+ "hormone": 31283,
+ "hormones": 35162,
+ "horn": 15771,
+ "horn": 9607,
+ "horne": 38143,
+ "horned": 34526,
+ "hornet": 28739,
+ "hornets": 20124,
+ "horns": 22109,
+ "horny": 32622,
+ "horo": 21500,
+ "horoscope": 38453,
+ "horowitz": 44669,
+ "horri": 8656,
+ "horrible": 13726,
+ "horribly": 45484,
+ "horrific": 25314,
+ "horrifying": 38901,
+ "horror": 13787,
+ "horror": 5032,
+ "horrormovies": 46682,
+ "horrors": 33321,
+ "horse": 8562,
+ "horse": 4558,
+ "horseback": 43673,
+ "horseman": 48885,
+ "horsepower": 36882,
+ "horser": 23096,
+ "horseracing": 30693,
+ "horses": 8809,
+ "horseshoe": 29242,
+ "horst": 37182,
+ "hort": 19482,
+ "horticul": 27141,
+ "horticulture": 39998,
+ "horton": 25945,
+ "hortons": 38422,
+ "horus": 29794,
+ "hos": 44320,
+ "hos": 25008,
+ "hosa": 44618,
+ "hose": 19662,
+ "hoseok": 38817,
+ "hosp": 2847,
+ "hosp": 37853,
+ "hospice": 20533,
+ "hospit": 7180,
+ "hospital": 29399,
+ "hospital": 3851,
+ "hospitality": 11657,
+ "hospitalized": 36915,
+ "hospitals": 13816,
+ "host": 17403,
+ "host": 3953,
+ "hostage": 26119,
+ "hoste": 31700,
+ "hosted": 6017,
+ "hostel": 27225,
+ "hostess": 39692,
+ "hostile": 28074,
+ "hosting": 4857,
+ "hosts": 8718,
+ "hot": 2851,
+ "hot": 2069,
+ "hota": 43289,
+ "hotdog": 43758,
+ "hotel": 14591,
+ "hotel": 2738,
+ "hotels": 8654,
+ "hotline": 30516,
+ "hotmail": 46427,
+ "hotness": 39803,
+ "hotra": 27109,
+ "hotro": 47823,
+ "hotspot": 36606,
+ "hotspur": 35176,
+ "hotter": 23591,
+ "hottest": 8279,
+ "hottie": 22804,
+ "hotties": 46027,
+ "hou": 1011,
+ "hou": 10122,
+ "hough": 44529,
+ "houghton": 36133,
+ "houn": 39273,
+ "houn": 33607,
+ "hound": 33996,
+ "hound": 13561,
+ "hounds": 21178,
+ "hounews": 48373,
+ "hour": 14930,
+ "hour": 2232,
+ "hourly": 30918,
+ "hours": 2382,
+ "house": 4107,
+ "house": 1212,
+ "housed": 37518,
+ "household": 12412,
+ "households": 27167,
+ "housel": 48685,
+ "housemusic": 28468,
+ "houseof": 19928,
+ "houses": 7791,
+ "housewives": 38523,
+ "housing": 32924,
+ "housing": 5734,
+ "houston": 16564,
+ "houston": 5663,
+ "hov": 40291,
+ "hove": 29674,
+ "hoven": 35559,
+ "hover": 36252,
+ "hover": 49016,
+ "hovering": 43437,
+ "how": 7470,
+ "how": 829,
+ "howar": 37672,
+ "howard": 25447,
+ "howard": 7632,
+ "howdy": 42216,
+ "howe": 8179,
+ "howe": 24614,
+ "howell": 25297,
+ "hower": 32920,
+ "however": 8467,
+ "howi": 47883,
+ "howie": 42939,
+ "howl": 40332,
+ "howling": 41771,
+ "howto": 38191,
+ "howto": 44060,
+ "hoy": 39625,
+ "hoy": 13278,
+ "hoya": 40978,
+ "hp": 23753,
+ "hp": 6371,
+ "hpa": 30983,
+ "hpc": 39936,
+ "hpe": 33787,
+ "hpv": 45765,
+ "hq": 33571,
+ "hq": 4693,
+ "hr": 4810,
+ "hr": 4086,
+ "hra": 21320,
+ "hra": 17212,
+ "hrc": 18139,
+ "hrh": 29103,
+ "hri": 21068,
+ "hrithik": 45371,
+ "hrs": 7157,
+ "hru": 24127,
+ "hrw": 25064,
+ "hs": 9343,
+ "hs": 2466,
+ "hsbc": 31508,
+ "hsc": 43510,
+ "hse": 34057,
+ "hsfb": 29539,
+ "hsv": 47311,
+ "ht": 11123,
+ "ht": 7801,
+ "hta": 23452,
+ "hta": 49384,
+ "htafc": 42821,
+ "htc": 48942,
+ "htc": 17635,
+ "html": 18231,
+ "hts": 43710,
+ "htt": 10620,
+ "http": 15066,
+ "https": 30901,
+ "httr": 49372,
+ "httweets": 43198,
+ "hu": 845,
+ "hu": 5949,
+ "hua": 22138,
+ "huan": 41405,
+ "huang": 32013,
+ "huar": 46916,
+ "huawe": 17709,
+ "huawei": 21128,
+ "hub": 18775,
+ "hub": 7028,
+ "hubb": 23183,
+ "hubbard": 33288,
+ "hubble": 30421,
+ "hubby": 16947,
+ "hubert": 40699,
+ "hubs": 29327,
+ "huck": 22909,
+ "huckabee": 43666,
+ "hud": 7169,
+ "hud": 28563,
+ "hudder": 22629,
+ "huddersfield": 24220,
+ "huddle": 33435,
+ "hudson": 25873,
+ "hudson": 11260,
+ "hue": 48380,
+ "hue": 21465,
+ "hues": 38003,
+ "huey": 39663,
+ "huff": 18746,
+ "huff": 44999,
+ "huffpost": 45887,
+ "hug": 40790,
+ "hug": 10359,
+ "huge": 2699,
+ "hugely": 24648,
+ "hugged": 41333,
+ "hugging": 27058,
+ "hugh": 8723,
+ "hugh": 15385,
+ "hughes": 11418,
+ "hugo": 43935,
+ "hugo": 17132,
+ "hugs": 14248,
+ "huh": 13348,
+ "huhu": 32134,
+ "hui": 29978,
+ "hul": 7911,
+ "hula": 40145,
+ "hulk": 17637,
+ "hull": 25154,
+ "hull": 10375,
+ "hulu": 24666,
+ "hum": 5823,
+ "hum": 16283,
+ "human": 3175,
+ "human": 2751,
+ "humane": 20220,
+ "humanitarian": 14170,
+ "humanities": 24949,
+ "humanity": 9420,
+ "humanright": 44385,
+ "humanrights": 14148,
+ "humans": 8324,
+ "humb": 9988,
+ "humber": 30602,
+ "humber": 38063,
+ "humble": 38703,
+ "humble": 10889,
+ "humbled": 19682,
+ "humbling": 39757,
+ "humbold": 24739,
+ "humboldt": 31389,
+ "hume": 38197,
+ "humid": 14778,
+ "humid": 27447,
+ "humidi": 47666,
+ "humidity": 15469,
+ "humil": 27205,
+ "humili": 25332,
+ "humility": 28535,
+ "humming": 26515,
+ "hummingbird": 33072,
+ "hummus": 31785,
+ "humor": 29369,
+ "humor": 11186,
+ "humorous": 38173,
+ "humour": 19161,
+ "hump": 16673,
+ "hump": 24529,
+ "humpback": 47662,
+ "humpday": 27693,
+ "humph": 19767,
+ "humphrey": 31549,
+ "hun": 1616,
+ "hun": 10795,
+ "hundre": 8505,
+ "hundred": 11898,
+ "hundreds": 8879,
+ "hung": 13825,
+ "hungar": 19420,
+ "hungarian": 23325,
+ "hungary": 17232,
+ "hunger": 25565,
+ "hunger": 10184,
+ "hungergames": 47507,
+ "hungover": 41110,
+ "hungry": 44845,
+ "hungry": 8451,
+ "hunk": 33912,
+ "hunt": 16498,
+ "hunt": 5774,
+ "hunted": 37373,
+ "hunter": 16531,
+ "hunter": 6099,
+ "hunters": 16115,
+ "hunting": 27830,
+ "hunting": 7507,
+ "huntington": 23521,
+ "hunts": 34041,
+ "huntsville": 34544,
+ "hur": 2305,
+ "hur": 34523,
+ "hurd": 44915,
+ "hurdle": 27486,
+ "hurdles": 25440,
+ "huri": 42486,
+ "hurley": 30166,
+ "hurling": 24738,
+ "huron": 36147,
+ "hurrah": 40599,
+ "hurric": 6543,
+ "hurrican": 36105,
+ "hurricane": 24051,
+ "hurricane": 8782,
+ "hurricanes": 22357,
+ "hurry": 10921,
+ "hurst": 44742,
+ "hurst": 11760,
+ "hurt": 7413,
+ "hurting": 24017,
+ "hurts": 13059,
+ "hus": 5111,
+ "hus": 35853,
+ "husband": 6179,
+ "husbands": 33612,
+ "hush": 28728,
+ "husk": 19246,
+ "huskers": 26946,
+ "huskies": 20988,
+ "husky": 20421,
+ "huss": 13733,
+ "hussain": 17940,
+ "hussein": 31336,
+ "hust": 27279,
+ "hustle": 15709,
+ "huston": 46480,
+ "hut": 20924,
+ "hut": 16503,
+ "hutch": 31018,
+ "hutch": 33203,
+ "hutchinson": 35721,
+ "hutto": 27662,
+ "hutton": 38321,
+ "hv": 17209,
+ "hv": 18593,
+ "hvac": 27492,
+ "hw": 27491,
+ "hw": 18876,
+ "hwa": 32352,
+ "hwan": 44390,
+ "hwang": 46775,
+ "hwy": 13812,
+ "hy": 1441,
+ "hy": 17827,
+ "hya": 31600,
+ "hyacin": 47263,
+ "hyatt": 44856,
+ "hyatt": 25146,
+ "hybri": 9084,
+ "hybrid": 10156,
+ "hyd": 42382,
+ "hyde": 46484,
+ "hyde": 16343,
+ "hyder": 13960,
+ "hyderabad": 14801,
+ "hydr": 8031,
+ "hydra": 44414,
+ "hydra": 40420,
+ "hydrange": 43298,
+ "hydrate": 29628,
+ "hydrated": 23300,
+ "hydrating": 47653,
+ "hydration": 24174,
+ "hydrau": 26017,
+ "hydraulic": 26189,
+ "hydro": 8368,
+ "hydro": 22595,
+ "hydrogen": 20974,
+ "hye": 32724,
+ "hye": 25792,
+ "hygi": 16277,
+ "hygiene": 19591,
+ "hymn": 41350,
+ "hyo": 38960,
+ "hyo": 35078,
+ "hyp": 16964,
+ "hype": 30353,
+ "hype": 11111,
+ "hyped": 22507,
+ "hyper": 7997,
+ "hyper": 22146,
+ "hypertension": 40698,
+ "hypno": 23355,
+ "hypnosis": 48138,
+ "hypnoti": 40440,
+ "hypo": 10252,
+ "hypocr": 30711,
+ "hypocri": 25606,
+ "hypocrisy": 26296,
+ "hypocrite": 44125,
+ "hypothe": 46966,
+ "hypothesis": 44956,
+ "hyster": 24235,
+ "hysteria": 45965,
+ "hysterical": 48627,
+ "hyuk": 20452,
+ "hyun": 11831,
+ "hyun": 8589,
+ "hyundai": 17094,
+ "hyung": 46901,
+ "hyung": 16551,
+ "hz": 32533,
+ "i": 72,
+ "i": 328,
+ "ia": 12486,
+ "ia": 1073,
+ "iac": 32838,
+ "iac": 44063,
+ "iaf": 40789,
+ "iah": 35052,
+ "iain": 30103,
+ "ial": 11530,
+ "ial": 1974,
+ "ials": 20940,
+ "iam": 3579,
+ "iam": 11415,
+ "iambic": 43668,
+ "iambicpent": 43891,
+ "iamsrk": 15103,
+ "ian": 7723,
+ "ian": 1800,
+ "ians": 6451,
+ "iansomerhalder": 47077,
+ "iart": 18413,
+ "iartg": 18669,
+ "ias": 32303,
+ "ias": 14620,
+ "ib": 3962,
+ "ib": 13554,
+ "iba": 39763,
+ "ibadan": 44691,
+ "iban": 47145,
+ "ibc": 49014,
+ "ibd": 40732,
+ "iber": 23814,
+ "ibi": 12337,
+ "ibis": 47048,
+ "ibiza": 13853,
+ "ible": 37792,
+ "ibles": 44102,
+ "ibm": 23415,
+ "ibm": 13918,
+ "ibn": 25729,
+ "ibooks": 46887,
+ "ibra": 15476,
+ "ibrahi": 40350,
+ "ibrahim": 20816,
+ "ibrox": 46883,
+ "ibs": 41993,
+ "ibu": 43587,
+ "ibu": 46117,
+ "ic": 535,
+ "ic": 1029,
+ "ica": 2576,
+ "icago": 37492,
+ "ical": 6082,
+ "ical": 1110,
+ "ically": 3161,
+ "icals": 13999,
+ "ican": 17653,
+ "ican": 5246,
+ "icans": 20511,
+ "icar": 37211,
+ "ication": 21629,
+ "icc": 12945,
+ "ice": 2739,
+ "ice": 733,
+ "iceberg": 33662,
+ "icec": 13636,
+ "icecream": 21334,
+ "iced": 8049,
+ "icelan": 34114,
+ "iceland": 46716,
+ "iceland": 11935,
+ "icelandic": 34705,
+ "ices": 1931,
+ "ich": 5333,
+ "ich": 1232,
+ "icha": 31453,
+ "iche": 28972,
+ "iche": 21143,
+ "ichi": 21669,
+ "ichi": 14647,
+ "ichick": 45022,
+ "ichiro": 43787,
+ "ici": 948,
+ "ici": 22189,
+ "icia": 11774,
+ "icial": 17543,
+ "icial": 6397,
+ "ician": 40522,
+ "ician": 5374,
+ "icians": 6264,
+ "iciary": 21329,
+ "icic": 46006,
+ "icide": 6558,
+ "icides": 28253,
+ "icing": 7676,
+ "icio": 24207,
+ "icion": 45905,
+ "icious": 3325,
+ "icist": 21165,
+ "icists": 42171,
+ "icity": 7243,
+ "ick": 1168,
+ "ick": 1068,
+ "icked": 39799,
+ "icker": 40357,
+ "ickers": 30701,
+ "icki": 35468,
+ "icking": 6619,
+ "icks": 3727,
+ "icky": 11587,
+ "icn": 44516,
+ "ico": 13697,
+ "ico": 3040,
+ "icom": 17693,
+ "icom": 29796,
+ "icon": 13843,
+ "icon": 5646,
+ "iconic": 6959,
+ "icons": 15553,
+ "icop": 9389,
+ "icos": 32002,
+ "ics": 1324,
+ "ict": 6349,
+ "icted": 36515,
+ "iction": 40560,
+ "icton": 36548,
+ "icu": 45118,
+ "icu": 30443,
+ "icular": 40660,
+ "icus": 31459,
+ "icy": 28780,
+ "icy": 3495,
+ "icymi": 5315,
+ "icz": 46387,
+ "id": 1568,
+ "id": 1014,
+ "ida": 11032,
+ "ida": 11600,
+ "idad": 22462,
+ "idaho": 48817,
+ "idaho": 15165,
+ "idal": 39684,
+ "idan": 17929,
+ "idc": 22386,
+ "ide": 1909,
+ "ide": 14104,
+ "idea": 3612,
+ "ideal": 8789,
+ "ideally": 48247,
+ "ideals": 45096,
+ "ideas": 4452,
+ "ident": 7113,
+ "identi": 6009,
+ "identical": 25587,
+ "identification": 23337,
+ "identified": 15217,
+ "identifies": 35712,
+ "identify": 10949,
+ "identifying": 23589,
+ "identities": 34292,
+ "identity": 8892,
+ "ideology": 25840,
+ "iders": 8980,
+ "ides": 31791,
+ "idf": 28987,
+ "idge": 35567,
+ "idh": 44325,
+ "idi": 9611,
+ "idi": 14264,
+ "idio": 15994,
+ "idiot": 14087,
+ "idiots": 20856,
+ "idk": 8972,
+ "idle": 34754,
+ "idlib": 36199,
+ "ido": 6763,
+ "ido": 29641,
+ "idol": 24866,
+ "idol": 8884,
+ "idols": 21398,
+ "idr": 10106,
+ "idri": 46435,
+ "idris": 41312,
+ "ids": 6111,
+ "idu": 28655,
+ "idy": 33058,
+ "idyl": 44879,
+ "idyllic": 46632,
+ "ie": 6789,
+ "ie": 1718,
+ "iec": 44773,
+ "ied": 10059,
+ "ieee": 39860,
+ "iel": 27875,
+ "iel": 22729,
+ "ience": 1542,
+ "ient": 13115,
+ "ier": 33173,
+ "ier": 5912,
+ "iers": 45060,
+ "ies": 27912,
+ "ies": 963,
+ "iest": 10818,
+ "if": 8063,
+ "if": 878,
+ "ifa": 37574,
+ "ifc": 36524,
+ "ife": 41172,
+ "ife": 19590,
+ "iff": 35753,
+ "ification": 35755,
+ "ified": 41403,
+ "ift": 31143,
+ "iftar": 35153,
+ "ifu": 41523,
+ "ify": 32807,
+ "ig": 1089,
+ "ig": 3072,
+ "iga": 16493,
+ "igan": 27468,
+ "igans": 25419,
+ "igbo": 44591,
+ "ige": 10806,
+ "igen": 33070,
+ "iger": 30758,
+ "iger": 20685,
+ "igers": 40755,
+ "igers": 48928,
+ "iggy": 46219,
+ "iggy": 27604,
+ "igh": 2712,
+ "igh": 5451,
+ "ight": 14571,
+ "ight": 897,
+ "ighton": 35292,
+ "igi": 21901,
+ "igle": 29912,
+ "iglesias": 39432,
+ "ign": 7303,
+ "ign": 2326,
+ "ignati": 37573,
+ "ignatius": 48318,
+ "igne": 45843,
+ "ignite": 25210,
+ "ignition": 36115,
+ "igno": 15375,
+ "ignor": 7653,
+ "ignorance": 22735,
+ "ignorant": 26933,
+ "ignore": 12304,
+ "ignored": 20428,
+ "ignores": 40129,
+ "ignoring": 23969,
+ "igor": 33024,
+ "igs": 31344,
+ "igu": 21279,
+ "ih": 12162,
+ "ih": 34135,
+ "ihear": 13043,
+ "iheart": 30332,
+ "iheartawards": 18811,
+ "iheartradio": 25934,
+ "ihop": 45511,
+ "ihri": 39108,
+ "ihrithik": 39326,
+ "ii": 5103,
+ "ii": 2329,
+ "iii": 46236,
+ "iii": 6572,
+ "iiii": 20133,
+ "iiii": 45393,
+ "iiot": 30704,
+ "iit": 39330,
+ "iit": 33238,
+ "ij": 7337,
+ "ija": 42802,
+ "ik": 3903,
+ "ik": 10177,
+ "ika": 18188,
+ "ike": 12329,
+ "ike": 19696,
+ "ikea": 20528,
+ "iker": 38653,
+ "ikh": 44655,
+ "ikh": 12758,
+ "iklan": 32028,
+ "iklan": 29584,
+ "iko": 35659,
+ "iko": 39272,
+ "ikon": 38543,
+ "ikon": 19156,
+ "iku": 17780,
+ "il": 543,
+ "il": 958,
+ "ila": 4344,
+ "ilah": 32211,
+ "ilan": 13889,
+ "ilan": 28076,
+ "iland": 20957,
+ "ilation": 16180,
+ "ilay": 45093,
+ "ild": 22278,
+ "ild": 17164,
+ "ile": 18398,
+ "ile": 989,
+ "iled": 3358,
+ "iler": 22446,
+ "iler": 3615,
+ "ilers": 8975,
+ "iles": 42274,
+ "ili": 2076,
+ "ili": 19601,
+ "ilia": 14855,
+ "ilian": 10272,
+ "iliary": 32585,
+ "ilife": 42835,
+ "ilike": 44989,
+ "ilinan": 48497,
+ "iling": 3299,
+ "ilio": 47256,
+ "ilion": 12561,
+ "ilis": 43442,
+ "ilit": 11178,
+ "ilities": 5446,
+ "ility": 1787,
+ "ilive": 26478,
+ "ill": 828,
+ "ill": 660,
+ "illa": 8877,
+ "illa": 3043,
+ "illac": 17218,
+ "illage": 48922,
+ "illard": 21920,
+ "illary": 33667,
+ "illas": 23404,
+ "ille": 18213,
+ "ille": 5559,
+ "illed": 2527,
+ "illeg": 35808,
+ "illegal": 7983,
+ "illegally": 24466,
+ "illegals": 40490,
+ "iller": 23341,
+ "iller": 2956,
+ "illers": 30547,
+ "illery": 14514,
+ "illes": 20037,
+ "illi": 1086,
+ "illi": 25187,
+ "illia": 48776,
+ "illiams": 30301,
+ "illian": 48775,
+ "illian": 17355,
+ "illic": 37152,
+ "illicit": 40998,
+ "illie": 26083,
+ "illin": 35868,
+ "illing": 2803,
+ "illini": 28957,
+ "illino": 8920,
+ "illinois": 9414,
+ "illion": 35542,
+ "illion": 2035,
+ "illness": 11145,
+ "illnesses": 33861,
+ "illo": 34153,
+ "illo": 7588,
+ "illon": 20516,
+ "ills": 1900,
+ "illu": 3025,
+ "illumin": 11446,
+ "illuminate": 43261,
+ "illuminated": 28814,
+ "illuminati": 34551,
+ "illuminating": 46601,
+ "illumination": 43680,
+ "illus": 41386,
+ "illusion": 20318,
+ "illusions": 47429,
+ "illustr": 6268,
+ "illustrate": 37468,
+ "illustrated": 13151,
+ "illustrates": 38129,
+ "illustrating": 43322,
+ "illustration": 6052,
+ "illustrations": 17852,
+ "illustrator": 16649,
+ "illustri": 43116,
+ "illustrious": 44304,
+ "illy": 11707,
+ "illy": 9532,
+ "ilm": 36326,
+ "ilo": 4220,
+ "ilo": 14835,
+ "ilove": 7183,
+ "ilove": 32914,
+ "iloveart": 41114,
+ "ilovemy": 28863,
+ "iloveyou": 28829,
+ "ils": 1543,
+ "ilt": 25334,
+ "ilton": 28494,
+ "ilu": 27337,
+ "ilwx": 43777,
+ "ily": 4881,
+ "ily": 1026,
+ "ilya": 33377,
+ "ilysm": 29228,
+ "im": 732,
+ "im": 1496,
+ "ima": 2414,
+ "ima": 6432,
+ "imac": 40675,
+ "imacele": 47281,
+ "imag": 2316,
+ "image": 24101,
+ "image": 2867,
+ "imagery": 22828,
+ "images": 4952,
+ "imagin": 18178,
+ "imaginary": 30417,
+ "imagination": 13783,
+ "imaginative": 47233,
+ "imagine": 35752,
+ "imagine": 4826,
+ "imagined": 18478,
+ "imagines": 47379,
+ "imaging": 14231,
+ "imagining": 27384,
+ "imam": 37552,
+ "imam": 19024,
+ "iman": 45684,
+ "iman": 16247,
+ "imation": 44566,
+ "imax": 32066,
+ "imc": 45616,
+ "imdanielpadilla": 36357,
+ "imdb": 30407,
+ "ime": 44937,
+ "ime": 31151,
+ "imel": 31594,
+ "iment": 37157,
+ "imer": 21802,
+ "imes": 47744,
+ "imf": 28403,
+ "img": 24157,
+ "imi": 23559,
+ "imin": 23942,
+ "imit": 23462,
+ "imitation": 41630,
+ "imma": 19487,
+ "immac": 25085,
+ "immaculate": 29649,
+ "immature": 45531,
+ "immedi": 7366,
+ "immediate": 14440,
+ "immediately": 10108,
+ "immen": 17278,
+ "immense": 22722,
+ "immensely": 35013,
+ "immer": 13954,
+ "immerse": 46240,
+ "immersion": 31861,
+ "immersive": 27521,
+ "immigr": 5851,
+ "immigrant": 16474,
+ "immigrants": 14460,
+ "immigration": 9588,
+ "imminent": 27299,
+ "immort": 39244,
+ "immortal": 24717,
+ "immun": 8961,
+ "immune": 15606,
+ "immuni": 44571,
+ "immunity": 26254,
+ "immuno": 24361,
+ "immunology": 44483,
+ "immunotherapy": 39185,
+ "imo": 26349,
+ "imo": 13738,
+ "imp": 3335,
+ "imp": 31037,
+ "impac": 7573,
+ "impact": 33036,
+ "impact": 3844,
+ "impacted": 21424,
+ "impactful": 41631,
+ "impacting": 29359,
+ "impacts": 15069,
+ "impair": 36451,
+ "impaired": 28028,
+ "impairment": 44501,
+ "impala": 36641,
+ "impe": 23612,
+ "impeach": 16874,
+ "impeach": 43497,
+ "impeachment": 32979,
+ "impeachtrump": 38006,
+ "impecc": 34511,
+ "impeccable": 40111,
+ "impending": 34486,
+ "imper": 7727,
+ "imperative": 39833,
+ "imperfect": 46034,
+ "imperi": 30911,
+ "imperial": 32425,
+ "imperial": 12361,
+ "imperialism": 48855,
+ "imperson": 25551,
+ "implant": 33106,
+ "implants": 32202,
+ "imple": 7423,
+ "implement": 17966,
+ "implementation": 15102,
+ "implemented": 24315,
+ "implementing": 22862,
+ "implic": 15269,
+ "implications": 19229,
+ "implo": 40337,
+ "impo": 45704,
+ "import": 2336,
+ "import": 16294,
+ "importance": 6821,
+ "important": 2829,
+ "importantly": 21580,
+ "imported": 28798,
+ "imports": 25286,
+ "impose": 35879,
+ "imposed": 25871,
+ "imposing": 42289,
+ "impossible": 9815,
+ "impre": 3763,
+ "impress": 20015,
+ "impressed": 9689,
+ "impression": 14468,
+ "impressionism": 36114,
+ "impressionist": 44904,
+ "impressions": 22276,
+ "impressive": 6634,
+ "imprint": 43863,
+ "imprison": 22141,
+ "imprisoned": 32999,
+ "imprisonment": 39024,
+ "impro": 2531,
+ "impromp": 28100,
+ "impromptu": 28611,
+ "improv": 22868,
+ "improve": 4971,
+ "improved": 9446,
+ "improvement": 10790,
+ "improvements": 16320,
+ "improves": 18035,
+ "improving": 10381,
+ "improvis": 32343,
+ "improvised": 40886,
+ "impulse": 29683,
+ "impy": 42690,
+ "imran": 19647,
+ "imran": 19212,
+ "imrankhan": 25956,
+ "imrankhanpti": 26688,
+ "ims": 17800,
+ "imsa": 37262,
+ "imv": 35731,
+ "imvkohli": 37136,
+ "imwith": 26822,
+ "imwithher": 32651,
+ "in": 512,
+ "in": 530,
+ "ina": 18026,
+ "ina": 1366,
+ "inability": 47517,
+ "inaccurate": 49192,
+ "inaction": 41916,
+ "inactive": 49274,
+ "inadequate": 43403,
+ "inak": 46549,
+ "inal": 19178,
+ "inals": 26438,
+ "inan": 26204,
+ "inappropriate": 26722,
+ "inari": 48620,
+ "inary": 11337,
+ "inas": 36731,
+ "inas": 12362,
+ "inated": 38530,
+ "ination": 4706,
+ "inau": 10832,
+ "inaugu": 11309,
+ "inaugur": 11448,
+ "inaugural": 11340,
+ "inaugurated": 29011,
+ "inauguration": 16805,
+ "inbound": 24420,
+ "inbox": 18683,
+ "inc": 14570,
+ "inc": 4438,
+ "incan": 45964,
+ "incar": 18070,
+ "incarcer": 26334,
+ "incarcerated": 49178,
+ "incarceration": 39887,
+ "incase": 30463,
+ "ince": 44303,
+ "incen": 13259,
+ "incense": 35059,
+ "incentive": 29024,
+ "incentives": 29813,
+ "inception": 36653,
+ "inch": 6523,
+ "incheon": 30645,
+ "inches": 10809,
+ "inci": 5747,
+ "incidence": 43371,
+ "incident": 10103,
+ "incidents": 22120,
+ "incindia": 26161,
+ "inciner": 46434,
+ "incl": 27857,
+ "incl": 13338,
+ "inclined": 45470,
+ "inclu": 1738,
+ "include": 5942,
+ "included": 7414,
+ "includes": 6197,
+ "including": 2814,
+ "inclusion": 12079,
+ "inclusive": 13393,
+ "income": 8044,
+ "incoming": 15416,
+ "incomparable": 36027,
+ "incompetent": 45069,
+ "incomplete": 34040,
+ "incon": 42372,
+ "inconvenience": 40563,
+ "incorpor": 19335,
+ "incorporate": 34168,
+ "incorporated": 29494,
+ "incorporating": 40303,
+ "incorrect": 31872,
+ "incre": 1870,
+ "increase": 5230,
+ "increased": 9156,
+ "increases": 13797,
+ "increasing": 10270,
+ "increasingly": 16106,
+ "incredi": 2883,
+ "incredible": 22128,
+ "incredible": 3457,
+ "incredibleindia": 24680,
+ "incredibles": 48641,
+ "incredibly": 9513,
+ "incu": 38830,
+ "incub": 24587,
+ "incubator": 35736,
+ "incumb": 32246,
+ "incumbent": 38038,
+ "incur": 42356,
+ "ind": 5386,
+ "ind": 4655,
+ "inda": 15710,
+ "inde": 2645,
+ "indeed": 10031,
+ "indefin": 29501,
+ "indefinitely": 43750,
+ "independ": 4147,
+ "independence": 23117,
+ "independence": 7955,
+ "independenceday": 25971,
+ "independent": 33844,
+ "independent": 7088,
+ "independently": 39831,
+ "inder": 29225,
+ "index": 35209,
+ "index": 9458,
+ "indhoven": 44229,
+ "indi": 1098,
+ "indi": 46536,
+ "india": 27067,
+ "india": 1762,
+ "indian": 7685,
+ "indian": 3606,
+ "indiana": 8615,
+ "indianapolis": 17196,
+ "indianfootball": 45979,
+ "indians": 10271,
+ "indic": 7136,
+ "indicate": 26679,
+ "indicated": 39416,
+ "indicates": 29412,
+ "indication": 38539,
+ "indicator": 24776,
+ "indicators": 30054,
+ "indicted": 34992,
+ "indictment": 42278,
+ "indie": 5260,
+ "indie": 9383,
+ "indiedev": 10863,
+ "indiefilm": 22588,
+ "indiegame": 17969,
+ "indiegamedev": 40466,
+ "indiegames": 35864,
+ "indiegogo": 38057,
+ "indies": 23618,
+ "indiffe": 41372,
+ "indigen": 8348,
+ "indigenous": 9303,
+ "indigo": 21002,
+ "indira": 43887,
+ "indirec": 26398,
+ "indirect": 35416,
+ "indivi": 5649,
+ "individu": 9574,
+ "individual": 8512,
+ "individually": 33782,
+ "individuals": 11990,
+ "indo": 26303,
+ "indo": 18297,
+ "indom": 42926,
+ "indone": 6180,
+ "indonesia": 7229,
+ "indonesian": 19593,
+ "indoor": 44478,
+ "indoor": 9546,
+ "indoors": 22973,
+ "indore": 46143,
+ "indu": 2298,
+ "induc": 7973,
+ "induced": 24103,
+ "inducted": 20596,
+ "inductee": 39558,
+ "inductees": 44796,
+ "induction": 18338,
+ "indul": 19402,
+ "indulg": 28388,
+ "indulge": 24851,
+ "indulgence": 40856,
+ "indulgent": 49147,
+ "industri": 5082,
+ "industrial": 30853,
+ "industrial": 7520,
+ "industries": 11700,
+ "industry": 47407,
+ "industry": 3318,
+ "indv": 16942,
+ "indy": 9821,
+ "indy": 10098,
+ "indycar": 20484,
+ "indyref": 22569,
+ "ine": 855,
+ "ine": 715,
+ "ineau": 38122,
+ "inec": 45214,
+ "ined": 2038,
+ "inee": 43252,
+ "inee": 7986,
+ "inees": 13056,
+ "ineffe": 47202,
+ "inely": 18234,
+ "inem": 48876,
+ "inema": 29232,
+ "inen": 44365,
+ "inequalities": 45507,
+ "inequality": 17372,
+ "iner": 17438,
+ "iner": 5155,
+ "iners": 41863,
+ "ines": 2137,
+ "inese": 35966,
+ "iness": 1463,
+ "inet": 8121,
+ "inette": 38911,
+ "inev": 19527,
+ "inevit": 45871,
+ "inevitable": 25004,
+ "inews": 24300,
+ "inexpensive": 38614,
+ "iney": 30254,
+ "inez": 12700,
+ "inf": 1529,
+ "inf": 35241,
+ "infamous": 18688,
+ "infan": 17219,
+ "infant": 19192,
+ "infantry": 21655,
+ "infants": 34726,
+ "infe": 7164,
+ "infec": 26088,
+ "infected": 26136,
+ "infection": 14774,
+ "infections": 22227,
+ "infectious": 29157,
+ "infeld": 25035,
+ "infer": 16258,
+ "inferno": 31290,
+ "infertility": 40701,
+ "infield": 48933,
+ "infiltr": 28683,
+ "infin": 6246,
+ "infinite": 12748,
+ "infiniti": 34644,
+ "infinity": 34863,
+ "infinity": 12895,
+ "infl": 7627,
+ "inflam": 16080,
+ "inflammation": 24893,
+ "inflammatory": 26831,
+ "inflatable": 30135,
+ "inflation": 17497,
+ "inflicted": 48188,
+ "influ": 4835,
+ "influen": 13229,
+ "influence": 9199,
+ "influenced": 21183,
+ "influencer": 25013,
+ "influencers": 29891,
+ "influences": 24926,
+ "influencing": 45126,
+ "influential": 17553,
+ "influenza": 39897,
+ "info": 5680,
+ "info": 2222,
+ "infographic": 10076,
+ "infographics": 33172,
+ "infor": 31773,
+ "inform": 10241,
+ "inform": 19449,
+ "informal": 25705,
+ "informat": 29625,
+ "informatics": 35685,
+ "information": 3204,
+ "informative": 19364,
+ "informed": 13876,
+ "informing": 45388,
+ "informs": 48440,
+ "infosec": 17863,
+ "infr": 29718,
+ "infra": 7312,
+ "infra": 45877,
+ "infrared": 22867,
+ "infrastructure": 9034,
+ "infringe": 44882,
+ "infringement": 48712,
+ "infront": 37668,
+ "infu": 15048,
+ "infuri": 48461,
+ "infused": 21461,
+ "infusion": 43464,
+ "ing": 653,
+ "ing": 519,
+ "inga": 15233,
+ "ingco": 40444,
+ "ingday": 16561,
+ "ingdon": 38731,
+ "inge": 11790,
+ "inge": 7071,
+ "inged": 30046,
+ "ingen": 19088,
+ "ingeni": 36884,
+ "inger": 33883,
+ "inger": 3541,
+ "ingfor": 33430,
+ "ingh": 9170,
+ "ingh": 30495,
+ "ingham": 24497,
+ "ingham": 4291,
+ "inghamshire": 39289,
+ "inghour": 42728,
+ "inging": 4066,
+ "ingl": 45662,
+ "ingle": 22228,
+ "ingle": 17005,
+ "ingles": 24490,
+ "ingley": 44428,
+ "inglis": 46327,
+ "ingly": 4796,
+ "ingnow": 34766,
+ "ingo": 30175,
+ "ingo": 9012,
+ "ingra": 45165,
+ "ingrad": 44124,
+ "ingram": 26998,
+ "ingredi": 9272,
+ "ingredient": 19799,
+ "ingredients": 11788,
+ "ingrid": 33496,
+ "ings": 895,
+ "ingthe": 20170,
+ "ingtips": 39373,
+ "ington": 11846,
+ "ington": 2156,
+ "ingu": 8714,
+ "ingual": 22795,
+ "ingue": 36838,
+ "ingui": 12788,
+ "inguish": 36146,
+ "inha": 32612,
+ "inhabit": 36189,
+ "inhabitants": 44968,
+ "inhal": 30786,
+ "inhe": 32617,
+ "inher": 24611,
+ "inherent": 47327,
+ "inherit": 34322,
+ "inheritance": 39341,
+ "inherited": 39111,
+ "inhi": 25557,
+ "inhibit": 32196,
+ "inho": 12984,
+ "ini": 6154,
+ "ini": 3581,
+ "inian": 36638,
+ "inim": 38717,
+ "inindia": 34021,
+ "ining": 1389,
+ "inist": 30976,
+ "init": 42670,
+ "initi": 4580,
+ "initial": 13980,
+ "initially": 28123,
+ "initials": 48794,
+ "initiated": 27756,
+ "initiation": 41009,
+ "initiative": 8152,
+ "initiatives": 16549,
+ "inity": 22126,
+ "inj": 5112,
+ "injec": 13688,
+ "injection": 21438,
+ "inju": 5006,
+ "injured": 7505,
+ "injuries": 9481,
+ "injury": 6223,
+ "injustice": 20541,
+ "ink": 4547,
+ "ink": 967,
+ "inka": 40685,
+ "inked": 29356,
+ "inki": 46176,
+ "inkigayo": 47882,
+ "inking": 37586,
+ "inks": 20966,
+ "inktober": 9387,
+ "inland": 21943,
+ "inlet": 35161,
+ "inline": 45004,
+ "inlove": 28415,
+ "inmate": 32341,
+ "inmates": 28216,
+ "inmy": 42657,
+ "inn": 27260,
+ "inn": 5569,
+ "inna": 35088,
+ "inner": 24512,
+ "inner": 6955,
+ "inning": 4415,
+ "innings": 11580,
+ "innis": 44059,
+ "inno": 7961,
+ "innocence": 26383,
+ "innocent": 11241,
+ "innov": 2890,
+ "innovate": 24549,
+ "innovation": 33063,
+ "innovation": 4272,
+ "innovations": 18817,
+ "innovative": 8494,
+ "innovator": 34735,
+ "innovators": 27834,
+ "ino": 4211,
+ "ino": 2691,
+ "inoa": 25649,
+ "inos": 21828,
+ "inous": 47801,
+ "inox": 22698,
+ "input": 16952,
+ "inputs": 48763,
+ "inqu": 10628,
+ "inqui": 18527,
+ "inquirer": 45172,
+ "inquiries": 29469,
+ "inquiry": 15865,
+ "inquis": 31171,
+ "inr": 36325,
+ "ins": 12786,
+ "ins": 1041,
+ "insan": 7875,
+ "insane": 10260,
+ "insanely": 27846,
+ "insanity": 26645,
+ "inscribed": 49168,
+ "inscription": 41127,
+ "insec": 15744,
+ "insect": 21297,
+ "insects": 18714,
+ "insecure": 35112,
+ "insecurity": 36964,
+ "inser": 13830,
+ "insert": 18807,
+ "insi": 3453,
+ "inside": 19141,
+ "inside": 2912,
+ "insider": 13300,
+ "insiders": 32171,
+ "insig": 40503,
+ "insight": 8795,
+ "insightful": 20354,
+ "insights": 8729,
+ "insignia": 48864,
+ "insist": 35504,
+ "insisted": 40423,
+ "insists": 27255,
+ "inski": 32630,
+ "insky": 24607,
+ "insol": 42366,
+ "insom": 21755,
+ "insomni": 42040,
+ "insomnia": 30598,
+ "inson": 21007,
+ "insp": 1597,
+ "inspec": 7915,
+ "inspect": 40815,
+ "inspecting": 40565,
+ "inspection": 15142,
+ "inspections": 39513,
+ "inspector": 20514,
+ "inspir": 2573,
+ "inspiration": 4195,
+ "inspirational": 41936,
+ "inspirational": 9855,
+ "inspirations": 35093,
+ "inspire": 27901,
+ "inspire": 8583,
+ "inspired": 39849,
+ "inspired": 3516,
+ "inspires": 17245,
+ "inspiring": 41847,
+ "inspiring": 5705,
+ "inspo": 26897,
+ "inst": 1264,
+ "inst": 1581,
+ "insta": 22411,
+ "insta": 11694,
+ "instability": 41377,
+ "instac": 46678,
+ "instaf": 33800,
+ "instag": 14612,
+ "instagood": 23718,
+ "instagram": 27910,
+ "instagram": 2659,
+ "instal": 38805,
+ "install": 6940,
+ "install": 11168,
+ "installation": 9358,
+ "installations": 27909,
+ "installed": 8807,
+ "installing": 18301,
+ "installment": 25315,
+ "installs": 45568,
+ "instalment": 47766,
+ "instance": 34572,
+ "instant": 38810,
+ "instant": 10635,
+ "instantly": 17703,
+ "instap": 23758,
+ "instapic": 34378,
+ "instaweather": 43078,
+ "instaweatherpro": 43150,
+ "inste": 3571,
+ "instead": 4191,
+ "instein": 13421,
+ "instem": 27030,
+ "instin": 23382,
+ "instinct": 30544,
+ "institu": 4257,
+ "institute": 5861,
+ "institutes": 43674,
+ "institution": 18823,
+ "institutional": 27442,
+ "institutions": 15207,
+ "instore": 41679,
+ "instru": 4544,
+ "instruc": 19648,
+ "instruction": 19407,
+ "instructional": 31022,
+ "instructions": 17040,
+ "instructor": 16087,
+ "instructors": 31998,
+ "instrument": 42196,
+ "instrument": 15806,
+ "instrumental": 23041,
+ "instruments": 14793,
+ "instyle": 41321,
+ "insu": 8805,
+ "insul": 9615,
+ "insulated": 42051,
+ "insulation": 28194,
+ "insulin": 29311,
+ "insult": 26673,
+ "insulting": 39646,
+ "insults": 40451,
+ "insur": 5024,
+ "insurance": 5870,
+ "insured": 31321,
+ "insurers": 43142,
+ "insurtech": 28716,
+ "int": 1828,
+ "int": 1207,
+ "inta": 38314,
+ "intact": 26870,
+ "intake": 19539,
+ "intan": 47695,
+ "inte": 1598,
+ "inte": 41900,
+ "intech": 26504,
+ "inted": 6147,
+ "integr": 5151,
+ "integral": 27018,
+ "integrate": 25735,
+ "integrated": 12797,
+ "integrating": 31555,
+ "integration": 12583,
+ "integrity": 14791,
+ "intel": 11778,
+ "intel": 11426,
+ "intellec": 13281,
+ "intellect": 47828,
+ "intellectu": 31966,
+ "intellectual": 18069,
+ "intelli": 5324,
+ "intellig": 5632,
+ "intelligence": 6846,
+ "intelligent": 14063,
+ "inten": 2967,
+ "intend": 36674,
+ "intended": 16812,
+ "intense": 10258,
+ "intensi": 22928,
+ "intensity": 19956,
+ "intensive": 21049,
+ "intent": 18881,
+ "intention": 26786,
+ "intentional": 29536,
+ "intentionally": 31215,
+ "intentions": 26710,
+ "inter": 1006,
+ "inter": 10093,
+ "interact": 21736,
+ "interacting": 35045,
+ "interaction": 17650,
+ "interactions": 22162,
+ "interactive": 9456,
+ "intercep": 23676,
+ "interception": 48762,
+ "interceptions": 45313,
+ "interchange": 34222,
+ "intercontinental": 31983,
+ "interdisciplinary": 38132,
+ "intere": 2008,
+ "interest": 5095,
+ "interested": 4620,
+ "interesting": 3628,
+ "interests": 16425,
+ "interface": 18753,
+ "interfaith": 38399,
+ "interference": 29099,
+ "interim": 19509,
+ "interior": 10700,
+ "interior": 7305,
+ "interiordesign": 12902,
+ "interiors": 14836,
+ "intermedi": 20246,
+ "intermediate": 24304,
+ "intermission": 44805,
+ "intermitt": 44946,
+ "intern": 9976,
+ "intern": 14068,
+ "internal": 11285,
+ "internally": 41134,
+ "internation": 42534,
+ "international": 8566,
+ "international": 2436,
+ "internationaldayof": 41518,
+ "internationally": 24059,
+ "internationalwomensday": 17682,
+ "interne": 32713,
+ "internet": 30180,
+ "internet": 4757,
+ "internetof": 44449,
+ "internetofthings": 45925,
+ "interns": 19902,
+ "internship": 16661,
+ "internships": 39410,
+ "interoper": 45754,
+ "interpre": 11162,
+ "interpret": 49154,
+ "interpret": 40459,
+ "interpretation": 20652,
+ "interpreted": 42157,
+ "interpreting": 46525,
+ "interro": 29548,
+ "interrup": 21609,
+ "interrupt": 48449,
+ "interrupted": 30288,
+ "intersec": 45246,
+ "intersection": 19210,
+ "interstate": 21963,
+ "interstellar": 41506,
+ "interval": 36032,
+ "intervals": 44884,
+ "interven": 18245,
+ "intervention": 16804,
+ "interventions": 28848,
+ "interview": 2885,
+ "interviewed": 11688,
+ "interviewing": 16399,
+ "interviews": 9910,
+ "intestin": 37938,
+ "intestinal": 38896,
+ "inthe": 7486,
+ "inti": 14459,
+ "intim": 38832,
+ "intimacy": 46430,
+ "intimate": 16382,
+ "intimid": 24041,
+ "intimidating": 44405,
+ "intimidation": 49258,
+ "inting": 15571,
+ "intl": 38186,
+ "intl": 14224,
+ "intment": 9020,
+ "intments": 21420,
+ "into": 35235,
+ "into": 1095,
+ "intoler": 28534,
+ "intolerance": 37808,
+ "intothe": 38511,
+ "intra": 20922,
+ "intrac": 46195,
+ "intram": 40956,
+ "intre": 29397,
+ "intrepid": 39127,
+ "intri": 15421,
+ "intric": 23763,
+ "intricate": 29616,
+ "intrigu": 18856,
+ "intrigue": 45140,
+ "intrigued": 40034,
+ "intriguing": 24334,
+ "intrin": 45181,
+ "intro": 2999,
+ "intro": 13224,
+ "introduc": 3621,
+ "introduce": 9813,
+ "introduced": 10446,
+ "introduces": 12933,
+ "introducing": 6256,
+ "introduction": 11812,
+ "introductory": 38121,
+ "intru": 22949,
+ "ints": 2514,
+ "intu": 17225,
+ "intuition": 40897,
+ "intuitive": 35224,
+ "inu": 21131,
+ "inuit": 41250,
+ "inus": 45857,
+ "inv": 2279,
+ "inv": 43786,
+ "inva": 10084,
+ "invade": 34609,
+ "invaded": 32596,
+ "invaders": 35188,
+ "invading": 40101,
+ "invali": 31592,
+ "invalid": 46998,
+ "invaluable": 33976,
+ "invasi": 38100,
+ "invasion": 13378,
+ "invasive": 19554,
+ "inve": 2024,
+ "inven": 26233,
+ "invent": 11665,
+ "invent": 23558,
+ "invented": 14100,
+ "invention": 23607,
+ "inventions": 44914,
+ "inventor": 22836,
+ "inventory": 19444,
+ "inver": 12061,
+ "inverness": 33080,
+ "inverte": 46397,
+ "inverted": 40709,
+ "invest": 4180,
+ "invest": 9716,
+ "invested": 22536,
+ "investig": 4626,
+ "investigate": 15703,
+ "investigated": 29180,
+ "investigates": 29621,
+ "investigating": 13713,
+ "investigation": 8194,
+ "investigations": 24020,
+ "investigative": 30233,
+ "investigator": 30528,
+ "investigators": 24121,
+ "investin": 40195,
+ "investing": 10554,
+ "investment": 5605,
+ "investments": 14675,
+ "investor": 15490,
+ "investors": 10486,
+ "invests": 38378,
+ "invic": 25253,
+ "invigor": 48722,
+ "invin": 30252,
+ "invincible": 38052,
+ "invisible": 16093,
+ "invit": 12454,
+ "invitation": 15032,
+ "invitational": 14511,
+ "invitations": 40120,
+ "invite": 8109,
+ "invited": 7731,
+ "invites": 16034,
+ "inviting": 14349,
+ "invo": 29417,
+ "invol": 4000,
+ "involve": 26325,
+ "involved": 5320,
+ "involvement": 19502,
+ "involves": 22652,
+ "involving": 14786,
+ "inwx": 35674,
+ "iny": 23257,
+ "inyour": 47954,
+ "io": 3167,
+ "io": 3752,
+ "ioc": 43018,
+ "iom": 33000,
+ "iom": 31135,
+ "ion": 14871,
+ "ion": 3668,
+ "ions": 26289,
+ "ior": 7354,
+ "ior": 2498,
+ "iority": 46016,
+ "iors": 6427,
+ "ios": 6614,
+ "iot": 32694,
+ "iot": 6627,
+ "iota": 37294,
+ "ious": 6994,
+ "iously": 38233,
+ "iow": 7439,
+ "iowa": 38847,
+ "iowa": 8290,
+ "ip": 1719,
+ "ip": 8600,
+ "ipa": 11199,
+ "ipad": 39067,
+ "ipad": 7491,
+ "ipads": 35281,
+ "ipc": 41981,
+ "iphone": 26030,
+ "iphone": 4314,
+ "iphones": 37561,
+ "ipl": 13440,
+ "ipment": 37824,
+ "ipo": 40218,
+ "ipo": 24090,
+ "ipod": 17889,
+ "ipp": 31706,
+ "ips": 26910,
+ "ipsw": 22221,
+ "ipswich": 24494,
+ "iq": 15554,
+ "iq": 19996,
+ "iqbal": 33553,
+ "ir": 582,
+ "ir": 742,
+ "ira": 4923,
+ "ira": 5371,
+ "irah": 35724,
+ "iran": 19273,
+ "iran": 5075,
+ "irandeal": 46533,
+ "irani": 37984,
+ "iranian": 14158,
+ "iraq": 8543,
+ "iraqi": 18617,
+ "irc": 41527,
+ "ird": 2770,
+ "ire": 3013,
+ "ire": 1454,
+ "ired": 32728,
+ "ired": 2995,
+ "ireland": 32806,
+ "ireland": 4157,
+ "irene": 21600,
+ "ires": 12435,
+ "irez": 21581,
+ "irgc": 47942,
+ "iri": 2155,
+ "iri": 13880,
+ "irical": 33366,
+ "irie": 42979,
+ "irina": 46664,
+ "iring": 10169,
+ "iris": 16437,
+ "irish": 9386,
+ "irish": 4889,
+ "irl": 34494,
+ "irl": 8570,
+ "irling": 26493,
+ "irls": 24344,
+ "irma": 22406,
+ "irn": 42603,
+ "iro": 23209,
+ "iro": 7280,
+ "iron": 7699,
+ "iron": 5391,
+ "ironic": 24518,
+ "ironically": 36779,
+ "ironing": 46655,
+ "ironman": 20330,
+ "irons": 30032,
+ "irony": 20681,
+ "irport": 27769,
+ "irr": 24641,
+ "irrational": 47413,
+ "irregular": 38692,
+ "irrelevant": 34677,
+ "irresi": 31200,
+ "irresistible": 35252,
+ "irresponsible": 44714,
+ "irri": 21484,
+ "irrigation": 23761,
+ "irrit": 24218,
+ "irs": 6086,
+ "irst": 32701,
+ "iru": 48206,
+ "irvin": 47053,
+ "irvine": 24201,
+ "irving": 19738,
+ "irwin": 23750,
+ "iry": 7239,
+ "is": 595,
+ "is": 533,
+ "isa": 11034,
+ "isa": 6536,
+ "isaac": 37544,
+ "isaac": 13659,
+ "isab": 13357,
+ "isabel": 27466,
+ "isabella": 26192,
+ "isabelle": 31072,
+ "isable": 46631,
+ "isai": 15365,
+ "isaiah": 17952,
+ "isak": 40619,
+ "isance": 46893,
+ "isation": 7194,
+ "isback": 43811,
+ "isc": 39316,
+ "isch": 47888,
+ "isco": 5736,
+ "iscoming": 26458,
+ "isd": 46816,
+ "isd": 12002,
+ "ise": 7669,
+ "ise": 1479,
+ "ised": 2861,
+ "iselle": 48491,
+ "iser": 23080,
+ "iser": 5626,
+ "isers": 34879,
+ "ises": 5153,
+ "isf": 44036,
+ "isgreat": 34595,
+ "ish": 6844,
+ "ish": 1061,
+ "isha": 28050,
+ "ishable": 37949,
+ "ished": 35341,
+ "ishere": 46053,
+ "ishi": 26224,
+ "ishq": 27996,
+ "ishqba": 32503,
+ "ishqbaaaz": 36591,
+ "isi": 7233,
+ "isi": 17880,
+ "isil": 34636,
+ "isin": 37676,
+ "ising": 3426,
+ "isis": 7531,
+ "isk": 30171,
+ "isl": 31368,
+ "isla": 22807,
+ "islam": 6003,
+ "islam": 8770,
+ "islamabad": 19959,
+ "islamic": 31627,
+ "islamic": 9552,
+ "islamist": 38798,
+ "islamophobia": 43459,
+ "island": 13408,
+ "island": 2619,
+ "islander": 45651,
+ "islanders": 27804,
+ "islands": 7145,
+ "islay": 49279,
+ "isle": 19082,
+ "isle": 11849,
+ "isleof": 24718,
+ "isles": 21816,
+ "islife": 26433,
+ "islington": 34945,
+ "ism": 47730,
+ "ism": 1935,
+ "isma": 43937,
+ "ismail": 36140,
+ "isme": 43570,
+ "ismo": 41926,
+ "isms": 18700,
+ "isn": 2923,
+ "isner": 48246,
+ "isnow": 43694,
+ "isnt": 19416,
+ "iso": 2462,
+ "iso": 12263,
+ "isol": 11414,
+ "isolated": 19044,
+ "isolation": 26400,
+ "ison": 12949,
+ "ison": 4553,
+ "isons": 33318,
+ "isoo": 35857,
+ "isp": 31397,
+ "isp": 39041,
+ "isra": 3591,
+ "israel": 20837,
+ "israel": 4779,
+ "israeli": 8994,
+ "israelis": 45713,
+ "isreal": 47147,
+ "isro": 44841,
+ "iss": 11738,
+ "iss": 4950,
+ "issa": 38579,
+ "issa": 7560,
+ "issan": 49358,
+ "issance": 40828,
+ "issant": 38828,
+ "isse": 18986,
+ "ission": 37946,
+ "issu": 2049,
+ "issue": 3202,
+ "issued": 9246,
+ "issues": 4082,
+ "issuing": 37226,
+ "ist": 9751,
+ "ist": 2304,
+ "istanbul": 12258,
+ "istandwith": 33820,
+ "iste": 32563,
+ "ister": 14555,
+ "isthe": 46748,
+ "istic": 29556,
+ "ists": 8426,
+ "isu": 17030,
+ "isu": 23328,
+ "it": 529,
+ "it": 585,
+ "ita": 36920,
+ "ita": 2864,
+ "itable": 8915,
+ "ital": 2306,
+ "ital": 1660,
+ "itali": 11644,
+ "italia": 11025,
+ "italian": 20264,
+ "italian": 5175,
+ "italians": 44744,
+ "italk": 32894,
+ "italy": 4052,
+ "itan": 18383,
+ "itans": 40711,
+ "itar": 47161,
+ "itarian": 11599,
+ "itary": 17604,
+ "itas": 31634,
+ "itas": 13436,
+ "itate": 42457,
+ "itated": 36744,
+ "itation": 5070,
+ "itative": 22892,
+ "itc": 36449,
+ "itch": 2387,
+ "itch": 8147,
+ "itchen": 32664,
+ "itchy": 41980,
+ "ite": 2732,
+ "ite": 802,
+ "iteam": 37828,
+ "itec": 3099,
+ "itec": 43936,
+ "itech": 44215,
+ "itech": 23040,
+ "ited": 8603,
+ "ited": 1108,
+ "itel": 44638,
+ "itely": 4605,
+ "item": 8532,
+ "items": 6207,
+ "iter": 7938,
+ "iter": 19773,
+ "iteracy": 39634,
+ "iterate": 43106,
+ "iteration": 38790,
+ "ites": 2454,
+ "itez": 42131,
+ "itf": 35436,
+ "itfc": 36519,
+ "ith": 6133,
+ "ith": 1757,
+ "ithaca": 46257,
+ "iti": 760,
+ "iti": 6165,
+ "itia": 22634,
+ "itian": 23365,
+ "itic": 11950,
+ "itical": 48767,
+ "itics": 33967,
+ "ities": 41423,
+ "ities": 1480,
+ "itim": 15676,
+ "itiner": 32803,
+ "itinerary": 41564,
+ "iting": 1257,
+ "ition": 25263,
+ "ition": 1104,
+ "itions": 5540,
+ "itious": 13329,
+ "itis": 33539,
+ "itis": 8388,
+ "itive": 3067,
+ "itly": 42240,
+ "ito": 22167,
+ "ito": 4661,
+ "iton": 21119,
+ "itor": 47267,
+ "itor": 4584,
+ "itors": 22005,
+ "itos": 24560,
+ "its": 7140,
+ "its": 902,
+ "itsa": 45032,
+ "itself": 7290,
+ "itsme": 41125,
+ "itss": 47040,
+ "itt": 1031,
+ "itt": 11228,
+ "itta": 21233,
+ "itte": 31962,
+ "itted": 24429,
+ "itten": 30014,
+ "itten": 4343,
+ "itter": 11456,
+ "itters": 13082,
+ "itti": 28629,
+ "ittin": 25646,
+ "itting": 3147,
+ "ittle": 24208,
+ "ittle": 21366,
+ "ittles": 38989,
+ "itton": 25707,
+ "itty": 35096,
+ "itu": 1668,
+ "itu": 32128,
+ "itude": 43382,
+ "itude": 5012,
+ "itudes": 20459,
+ "itunes": 7007,
+ "itup": 35838,
+ "iture": 25547,
+ "itus": 24364,
+ "itutes": 32883,
+ "itv": 20159,
+ "itv": 12805,
+ "ity": 2480,
+ "ity": 696,
+ "itya": 32055,
+ "itz": 14544,
+ "itz": 7807,
+ "iu": 14292,
+ "iu": 15575,
+ "ium": 10762,
+ "ius": 6740,
+ "iv": 6775,
+ "iv": 9315,
+ "iva": 42463,
+ "ivan": 15544,
+ "ivan": 15689,
+ "ivanka": 37914,
+ "ive": 26885,
+ "ive": 8653,
+ "ived": 15654,
+ "iver": 36849,
+ "iver": 44254,
+ "ives": 27333,
+ "ivf": 39159,
+ "iving": 45136,
+ "ivory": 16776,
+ "ivote": 45835,
+ "ivy": 36939,
+ "ivy": 16045,
+ "iw": 13058,
+ "iw": 46604,
+ "iwant": 42747,
+ "iwd": 16815,
+ "iwm": 44237,
+ "ix": 13272,
+ "ix": 8756,
+ "iy": 13704,
+ "iya": 18595,
+ "iyaki": 48395,
+ "iz": 2845,
+ "iz": 8407,
+ "iza": 37704,
+ "ization": 10847,
+ "ize": 10885,
+ "ized": 7690,
+ "izen": 34776,
+ "izer": 23895,
+ "izes": 45434,
+ "izing": 17354,
+ "izo": 46910,
+ "izz": 31779,
+ "izz": 46128,
+ "izzy": 28861,
+ "j": 73,
+ "j": 329,
+ "ja": 1586,
+ "ja": 2641,
+ "jaan": 25052,
+ "jab": 8059,
+ "jab": 9439,
+ "jac": 2293,
+ "jac": 30198,
+ "jace": 43286,
+ "jack": 2679,
+ "jack": 3267,
+ "jacked": 27923,
+ "jacket": 6164,
+ "jackets": 14745,
+ "jacki": 47418,
+ "jackie": 28023,
+ "jackie": 11716,
+ "jacking": 40929,
+ "jackman": 35723,
+ "jackpot": 23926,
+ "jacks": 19649,
+ "jackson": 12321,
+ "jackson": 4363,
+ "jacksonville": 19263,
+ "jaco": 6840,
+ "jacob": 14385,
+ "jacob": 9222,
+ "jacobs": 17482,
+ "jacobson": 46826,
+ "jacqu": 14495,
+ "jacqueline": 22843,
+ "jacques": 17799,
+ "jad": 12976,
+ "jad": 38691,
+ "jada": 37416,
+ "jade": 25123,
+ "jade": 14513,
+ "jaden": 37174,
+ "jadine": 37445,
+ "jae": 16869,
+ "jae": 15765,
+ "jaejoong": 43610,
+ "jaf": 19362,
+ "jag": 7984,
+ "jag": 36236,
+ "jagan": 48530,
+ "jagger": 30835,
+ "jags": 31086,
+ "jagu": 10096,
+ "jaguar": 44777,
+ "jaguar": 14757,
+ "jaguars": 21854,
+ "jah": 20067,
+ "jah": 11084,
+ "jahan": 44404,
+ "jahan": 47827,
+ "jai": 10542,
+ "jai": 13819,
+ "jail": 18574,
+ "jail": 9332,
+ "jailbreak": 45990,
+ "jailed": 19456,
+ "jails": 47833,
+ "jaime": 24716,
+ "jain": 21999,
+ "jaipur": 23593,
+ "jais": 48607,
+ "jait": 28910,
+ "jaitley": 32776,
+ "jak": 9225,
+ "jak": 30589,
+ "jakarta": 15471,
+ "jake": 13140,
+ "jake": 7419,
+ "jakob": 47358,
+ "jal": 8380,
+ "jal": 26773,
+ "jalan": 27270,
+ "jalap": 49081,
+ "jalape": 34263,
+ "jalapeño": 43017,
+ "jalen": 33548,
+ "jam": 1434,
+ "jam": 5201,
+ "jama": 8977,
+ "jama": 35366,
+ "jamaica": 13019,
+ "jamaican": 25144,
+ "jamal": 26108,
+ "jambo": 35599,
+ "jamboree": 38506,
+ "jame": 12341,
+ "james": 6963,
+ "james": 2392,
+ "jamesbond": 44704,
+ "jamesc": 47004,
+ "jameson": 31731,
+ "jami": 15092,
+ "jamie": 16454,
+ "jamie": 8078,
+ "jamiedor": 34310,
+ "jamiedornan": 34896,
+ "jammed": 35590,
+ "jammin": 35223,
+ "jamming": 25862,
+ "jammu": 25926,
+ "jams": 20243,
+ "jan": 1891,
+ "jan": 3334,
+ "jana": 18182,
+ "jane": 12389,
+ "jane": 6736,
+ "janeiro": 31740,
+ "janet": 29665,
+ "janet": 15872,
+ "jang": 41526,
+ "jang": 22074,
+ "jani": 22606,
+ "janice": 36048,
+ "janine": 46896,
+ "janis": 44233,
+ "jann": 35377,
+ "jans": 22578,
+ "jansen": 45354,
+ "janu": 3623,
+ "january": 3697,
+ "jap": 2299,
+ "jap": 49062,
+ "japan": 4502,
+ "japan": 3400,
+ "japanese": 27211,
+ "japanese": 4925,
+ "japs": 42121,
+ "jar": 5120,
+ "jar": 10837,
+ "jard": 25778,
+ "jardin": 37371,
+ "jare": 17654,
+ "jared": 35597,
+ "jared": 12571,
+ "jaredle": 36739,
+ "jaredleto": 37106,
+ "jaro": 35505,
+ "jarpad": 44497,
+ "jarre": 23385,
+ "jarrett": 30531,
+ "jars": 27583,
+ "jarvis": 29286,
+ "jas": 4492,
+ "jas": 17559,
+ "jasmin": 42989,
+ "jasmin": 47700,
+ "jasmine": 17056,
+ "jason": 10009,
+ "jason": 5395,
+ "jasper": 19827,
+ "jat": 26106,
+ "jau": 26932,
+ "jauregui": 48175,
+ "jav": 6234,
+ "java": 12918,
+ "javascri": 16289,
+ "javascript": 16423,
+ "jave": 46218,
+ "javed": 42268,
+ "javelin": 41701,
+ "javi": 47627,
+ "javier": 23307,
+ "jaw": 14804,
+ "jaw": 17307,
+ "jawa": 44790,
+ "jaws": 25491,
+ "jax": 22348,
+ "jax": 12390,
+ "jay": 3427,
+ "jay": 4155,
+ "jaya": 21960,
+ "jayanti": 37732,
+ "jaye": 45703,
+ "jayne": 35228,
+ "jays": 12393,
+ "jaz": 3465,
+ "jaz": 32874,
+ "jazeera": 38260,
+ "jazz": 11488,
+ "jazz": 4528,
+ "jazzfest": 36683,
+ "jazzy": 28191,
+ "jb": 21915,
+ "jb": 13637,
+ "jc": 14991,
+ "jc": 11517,
+ "jd": 18289,
+ "jd": 14125,
+ "jdm": 42013,
+ "je": 1013,
+ "je": 8776,
+ "jeal": 9964,
+ "jealous": 11093,
+ "jealousy": 37654,
+ "jean": 13943,
+ "jean": 6473,
+ "jeanette": 48167,
+ "jeanne": 29201,
+ "jeans": 10157,
+ "jeb": 35101,
+ "jec": 1347,
+ "ject": 6070,
+ "jed": 12166,
+ "jed": 38748,
+ "jeddah": 40982,
+ "jedi": 16681,
+ "jee": 29250,
+ "jee": 14870,
+ "jeep": 16593,
+ "jeep": 11286,
+ "jeeplife": 43100,
+ "jeet": 45542,
+ "jeet": 30944,
+ "jef": 10276,
+ "jeff": 6245,
+ "jeff": 5550,
+ "jefferson": 44711,
+ "jefferson": 13976,
+ "jeffery": 41470,
+ "jeffree": 45994,
+ "jeffrey": 32886,
+ "jeffrey": 16027,
+ "jeho": 42437,
+ "jeky": 43893,
+ "jekyll": 49405,
+ "jel": 9794,
+ "jelena": 48218,
+ "jelly": 19110,
+ "jelly": 13762,
+ "jellyfish": 30988,
+ "jem": 46326,
+ "jem": 37530,
+ "jen": 2554,
+ "jen": 12997,
+ "jenkins": 16162,
+ "jenn": 33921,
+ "jenn": 29869,
+ "jenna": 17125,
+ "jenner": 14260,
+ "jenni": 6774,
+ "jennie": 28875,
+ "jennifer": 19786,
+ "jennifer": 8613,
+ "jennings": 21564,
+ "jenny": 20165,
+ "jenny": 13414,
+ "jens": 40806,
+ "jensen": 35558,
+ "jensen": 19004,
+ "jensenackles": 41011,
+ "jeon": 45200,
+ "jeon": 43337,
+ "jeong": 47146,
+ "jeong": 39264,
+ "jeopar": 22988,
+ "jeopardy": 29613,
+ "jer": 2310,
+ "jer": 35307,
+ "jere": 5614,
+ "jeremi": 22362,
+ "jeremiah": 27301,
+ "jeremy": 14656,
+ "jeremy": 8127,
+ "jeremycorbyn": 37484,
+ "jeric": 25084,
+ "jericho": 28892,
+ "jerk": 23917,
+ "jerky": 40079,
+ "jermaine": 40722,
+ "jerome": 19876,
+ "jerry": 18163,
+ "jerry": 9164,
+ "jersey": 21921,
+ "jersey": 4471,
+ "jerseys": 15518,
+ "jerus": 12257,
+ "jerusalem": 12557,
+ "jes": 7686,
+ "jes": 35826,
+ "jess": 5313,
+ "jess": 13758,
+ "jesse": 23112,
+ "jesse": 11770,
+ "jessi": 24373,
+ "jessic": 14881,
+ "jessica": 45421,
+ "jessica": 8178,
+ "jessie": 19424,
+ "jester": 44225,
+ "jesu": 19777,
+ "jesuit": 33234,
+ "jesus": 4070,
+ "jet": 11515,
+ "jet": 6565,
+ "jetblue": 45021,
+ "jeter": 38450,
+ "jets": 38584,
+ "jets": 10025,
+ "jett": 44541,
+ "jetty": 46382,
+ "jew": 27450,
+ "jewel": 4880,
+ "jewel": 17591,
+ "jewell": 9777,
+ "jewellers": 46265,
+ "jewellery": 11192,
+ "jewelry": 28018,
+ "jewelry": 6039,
+ "jewels": 20205,
+ "jewish": 29594,
+ "jewish": 9104,
+ "jews": 14200,
+ "jf": 31130,
+ "jf": 33718,
+ "jfc": 43652,
+ "jfk": 18486,
+ "jg": 41986,
+ "jg": 35138,
+ "jh": 24858,
+ "jh": 21485,
+ "jha": 47012,
+ "jha": 38092,
+ "jhal": 45695,
+ "jhar": 31546,
+ "jharkhand": 39001,
+ "jhb": 34631,
+ "ji": 3252,
+ "ji": 2697,
+ "jia": 32907,
+ "jian": 33427,
+ "jiang": 43309,
+ "jiang": 25762,
+ "jic": 48350,
+ "jic": 40215,
+ "jid": 24403,
+ "jie": 40005,
+ "jig": 15136,
+ "jig": 47430,
+ "jigsaw": 32987,
+ "jiha": 23194,
+ "jihad": 29637,
+ "jihoon": 44765,
+ "jil": 36225,
+ "jill": 24136,
+ "jill": 15254,
+ "jillian": 37820,
+ "jim": 3190,
+ "jim": 4550,
+ "jima": 20679,
+ "jimcantore": 43950,
+ "jimenez": 35947,
+ "jimi": 30565,
+ "jimin": 16286,
+ "jimmie": 45679,
+ "jimmy": 12215,
+ "jimmy": 6817,
+ "jimmyfallon": 45265,
+ "jin": 7927,
+ "jin": 8485,
+ "jind": 40609,
+ "jing": 34933,
+ "jing": 28607,
+ "jingle": 28699,
+ "jinnah": 43141,
+ "jinping": 39308,
+ "jinx": 42977,
+ "jinyoung": 38051,
+ "jio": 40501,
+ "jis": 25988,
+ "jis": 23515,
+ "jisoo": 43070,
+ "jit": 11947,
+ "jit": 20308,
+ "jitsu": 24530,
+ "jiu": 43351,
+ "jiu": 44123,
+ "jj": 12502,
+ "jj": 12790,
+ "jk": 20189,
+ "jk": 9702,
+ "jkt": 21494,
+ "jl": 25027,
+ "jl": 22911,
+ "jlo": 31017,
+ "jm": 24044,
+ "jm": 18657,
+ "jn": 24576,
+ "jn": 21717,
+ "jnr": 37145,
+ "jnu": 47142,
+ "jo": 683,
+ "jo": 3804,
+ "joachim": 48979,
+ "joan": 28064,
+ "joan": 12710,
+ "joann": 35484,
+ "joanna": 25357,
+ "joanne": 43736,
+ "joanne": 25092,
+ "joao": 45666,
+ "joaqu": 25140,
+ "joaquin": 30745,
+ "job": 13114,
+ "job": 2075,
+ "jobs": 3735,
+ "jobsearch": 45459,
+ "joburg": 39343,
+ "jocel": 36879,
+ "jocelyn": 47259,
+ "jock": 34485,
+ "jockey": 20126,
+ "jodh": 48689,
+ "jodi": 36812,
+ "jodi": 26888,
+ "jodie": 33100,
+ "jody": 32959,
+ "joe": 9309,
+ "joe": 3305,
+ "joel": 19819,
+ "joel": 11429,
+ "joes": 34756,
+ "joey": 16281,
+ "joey": 10455,
+ "jog": 37967,
+ "jog": 31691,
+ "jogging": 37922,
+ "joh": 1201,
+ "johan": 17416,
+ "johan": 27789,
+ "johann": 31180,
+ "johanna": 41494,
+ "johannes": 37779,
+ "johannesburg": 28377,
+ "johansson": 41512,
+ "johar": 34871,
+ "john": 2004,
+ "john": 1742,
+ "johncena": 46820,
+ "johnnie": 47947,
+ "johnny": 14464,
+ "johnny": 6904,
+ "johns": 14515,
+ "johnson": 26036,
+ "johnson": 4010,
+ "johnston": 19791,
+ "johnstone": 40766,
+ "johor": 34750,
+ "join": 14737,
+ "join": 1384,
+ "joined": 4954,
+ "joining": 5118,
+ "joins": 5681,
+ "joint": 6640,
+ "jointhe": 30422,
+ "jointly": 37471,
+ "joints": 27204,
+ "jojo": 41484,
+ "jojo": 22075,
+ "joke": 7198,
+ "joker": 18200,
+ "jokers": 44101,
+ "jokes": 11336,
+ "joking": 26112,
+ "joko": 44975,
+ "jol": 9174,
+ "jol": 36470,
+ "jolie": 31633,
+ "jolla": 46109,
+ "jolly": 21516,
+ "jom": 32152,
+ "jon": 3026,
+ "jon": 6139,
+ "jona": 6629,
+ "jonah": 47934,
+ "jonah": 27556,
+ "jonas": 42373,
+ "jonas": 13650,
+ "jonathan": 19026,
+ "jonathan": 7762,
+ "jone": 33934,
+ "jones": 19091,
+ "jones": 3538,
+ "jong": 20214,
+ "jong": 14726,
+ "jonghyun": 29023,
+ "jongin": 36957,
+ "joni": 43177,
+ "jonny": 28454,
+ "jonny": 21895,
+ "joo": 25807,
+ "joo": 27680,
+ "joom": 47543,
+ "joon": 18547,
+ "joong": 26544,
+ "jop": 30486,
+ "joplin": 42688,
+ "jor": 2482,
+ "jor": 31595,
+ "jordan": 14644,
+ "jordan": 4388,
+ "jordani": 46898,
+ "jordi": 44795,
+ "jorge": 48761,
+ "jorge": 18225,
+ "jos": 20560,
+ "jos": 19661,
+ "jose": 4647,
+ "jose": 7075,
+ "josef": 36584,
+ "josel": 47800,
+ "joseph": 14163,
+ "joseph": 6478,
+ "josephine": 34866,
+ "josh": 9998,
+ "josh": 5679,
+ "joshi": 24786,
+ "joshu": 9112,
+ "joshua": 11852,
+ "josi": 33583,
+ "josie": 33167,
+ "joss": 42834,
+ "josé": 27922,
+ "jou": 19921,
+ "jou": 32029,
+ "jour": 2078,
+ "jour": 17142,
+ "journ": 4563,
+ "journal": 6626,
+ "journalism": 10123,
+ "journalist": 9914,
+ "journalists": 12249,
+ "journals": 24391,
+ "journe": 48833,
+ "journey": 32156,
+ "journey": 3749,
+ "journeys": 23329,
+ "journo": 37034,
+ "journos": 46437,
+ "jovi": 33866,
+ "joy": 6308,
+ "joy": 4273,
+ "joyce": 43753,
+ "joyce": 15275,
+ "joye": 34052,
+ "joyeux": 41876,
+ "joyful": 24139,
+ "joyous": 32245,
+ "joyride": 46949,
+ "joys": 22996,
+ "jp": 18249,
+ "jp": 10557,
+ "jpg": 36950,
+ "jpn": 36212,
+ "jr": 13973,
+ "jr": 3605,
+ "js": 46243,
+ "js": 8006,
+ "jst": 26523,
+ "jt": 39480,
+ "jt": 18119,
+ "ju": 669,
+ "ju": 9970,
+ "jual": 38720,
+ "juan": 17148,
+ "juan": 9274,
+ "juana": 9081,
+ "jubi": 15485,
+ "jubil": 47743,
+ "jubilee": 16907,
+ "juco": 31570,
+ "jud": 8363,
+ "juda": 32478,
+ "judah": 41066,
+ "judaism": 42217,
+ "judas": 39532,
+ "judd": 29770,
+ "judg": 20012,
+ "judge": 16824,
+ "judge": 5656,
+ "judged": 33453,
+ "judgement": 25246,
+ "judges": 12575,
+ "judging": 16570,
+ "judgment": 24191,
+ "judi": 42546,
+ "judice": 28032,
+ "judicial": 19579,
+ "judiciary": 24545,
+ "judith": 24047,
+ "judo": 27011,
+ "judy": 34663,
+ "judy": 16510,
+ "jug": 27619,
+ "jugg": 38628,
+ "juic": 38761,
+ "juice": 37954,
+ "juice": 6916,
+ "juices": 36757,
+ "juicy": 17623,
+ "juju": 43020,
+ "juke": 32519,
+ "jukebox": 36411,
+ "jul": 34662,
+ "jul": 15975,
+ "jule": 40819,
+ "jules": 21996,
+ "juli": 3614,
+ "juli": 49160,
+ "julia": 10207,
+ "julian": 25459,
+ "julian": 12643,
+ "juliana": 46059,
+ "julie": 22534,
+ "julie": 10505,
+ "julien": 32595,
+ "juliet": 20641,
+ "juliette": 44804,
+ "julio": 24888,
+ "julius": 20870,
+ "july": 2272,
+ "jum": 20791,
+ "jumbo": 24678,
+ "jume": 45989,
+ "jump": 5519,
+ "jump": 6423,
+ "jumped": 16901,
+ "jumper": 16558,
+ "jumpers": 36485,
+ "jumping": 11476,
+ "jumpman": 48803,
+ "jumps": 18911,
+ "jumpsuit": 31044,
+ "jun": 1637,
+ "jun": 7719,
+ "junction": 11320,
+ "june": 23188,
+ "june": 2345,
+ "jung": 13086,
+ "jung": 13031,
+ "jungkook": 20040,
+ "jungle": 42421,
+ "jungle": 10865,
+ "juni": 4029,
+ "junior": 21167,
+ "junior": 5027,
+ "juniors": 16811,
+ "juniper": 33829,
+ "junk": 16000,
+ "junkie": 27613,
+ "junkies": 41207,
+ "juno": 28845,
+ "junto": 34282,
+ "jupit": 15270,
+ "jupiter": 16212,
+ "jur": 15896,
+ "jura": 14715,
+ "jurassic": 28844,
+ "jurassic": 21255,
+ "jurgen": 39263,
+ "juris": 37010,
+ "jurisdic": 37714,
+ "jury": 12931,
+ "jus": 14999,
+ "just": 1770,
+ "just": 761,
+ "justi": 14700,
+ "justic": 30399,
+ "justice": 16904,
+ "justice": 3604,
+ "justicefor": 25812,
+ "justiceleague": 41929,
+ "justices": 44356,
+ "justified": 34546,
+ "justify": 28192,
+ "justin": 7537,
+ "justin": 4394,
+ "justinbieber": 12501,
+ "justine": 34418,
+ "justintrudeau": 32184,
+ "justsaying": 42922,
+ "juve": 47717,
+ "juve": 23092,
+ "juven": 12944,
+ "juvenile": 19333,
+ "juvent": 13908,
+ "juventus": 47378,
+ "juventus": 16208,
+ "jux": 33552,
+ "juxta": 34964,
+ "jv": 37932,
+ "jv": 11805,
+ "jw": 30221,
+ "jw": 24215,
+ "jy": 20979,
+ "jyo": 27378,
+ "jyoti": 48696,
+ "jä": 45381,
+ "k": 74,
+ "k": 330,
+ "ka": 1595,
+ "ka": 1525,
+ "kaa": 34496,
+ "kab": 6554,
+ "kab": 45134,
+ "kabaddi": 41749,
+ "kabir": 38619,
+ "kabo": 47974,
+ "kabul": 26160,
+ "kac": 21693,
+ "kach": 14341,
+ "kad": 10901,
+ "kade": 41130,
+ "kaduna": 38053,
+ "kae": 22542,
+ "kaeper": 30070,
+ "kaepernick": 30713,
+ "kaf": 19870,
+ "kag": 13666,
+ "kag": 31003,
+ "kah": 16068,
+ "kah": 15463,
+ "kahn": 35397,
+ "kai": 12752,
+ "kai": 9601,
+ "kaido": 40255,
+ "kail": 23623,
+ "kaine": 39028,
+ "kair": 33027,
+ "kaiser": 43685,
+ "kaiser": 29960,
+ "kait": 19326,
+ "kaitlyn": 34948,
+ "kaj": 44788,
+ "kaj": 40381,
+ "kak": 10401,
+ "kak": 40128,
+ "kaka": 47689,
+ "kaku": 30900,
+ "kal": 4187,
+ "kal": 18712,
+ "kala": 45453,
+ "kala": 33105,
+ "kalam": 40142,
+ "kalamaz": 42328,
+ "kalamazoo": 46264,
+ "kalb": 34483,
+ "kale": 17162,
+ "kale": 16625,
+ "kaleido": 41144,
+ "kali": 17844,
+ "kali": 26964,
+ "kalin": 42776,
+ "kalyan": 23825,
+ "kam": 4104,
+ "kam": 26011,
+ "kamal": 31371,
+ "kamal": 28619,
+ "kamala": 45003,
+ "kame": 45235,
+ "kamen": 40738,
+ "kami": 28707,
+ "kamloops": 36602,
+ "kamp": 35179,
+ "kamp": 29522,
+ "kampala": 37134,
+ "kan": 2532,
+ "kan": 8101,
+ "kana": 35178,
+ "kand": 17478,
+ "kane": 32218,
+ "kane": 9765,
+ "kang": 12226,
+ "kang": 20789,
+ "kangar": 20622,
+ "kangaroo": 25513,
+ "kani": 40907,
+ "kani": 41948,
+ "kann": 18533,
+ "kannada": 30053,
+ "kano": 28201,
+ "kans": 34012,
+ "kansas": 25507,
+ "kansas": 6539,
+ "kansascity": 46134,
+ "kant": 39923,
+ "kant": 47132,
+ "kanth": 24427,
+ "kanu": 44565,
+ "kany": 13590,
+ "kanye": 29680,
+ "kanye": 14965,
+ "kanyewest": 31943,
+ "kap": 6804,
+ "kap": 45279,
+ "kapam": 48561,
+ "kapil": 32337,
+ "kapil": 42709,
+ "kapilshar": 48978,
+ "kaplan": 37401,
+ "kapoor": 9117,
+ "kapp": 36717,
+ "kappa": 20239,
+ "kapur": 42371,
+ "kar": 1813,
+ "kar": 5933,
+ "kara": 12552,
+ "karab": 40916,
+ "karachi": 13671,
+ "karak": 40372,
+ "karan": 20077,
+ "karan": 20931,
+ "karanjohar": 47621,
+ "karao": 16262,
+ "karaoke": 16640,
+ "karate": 21211,
+ "kardashi": 13619,
+ "kardashian": 14578,
+ "kare": 14310,
+ "kare": 38354,
+ "kareem": 38885,
+ "kareena": 41569,
+ "karen": 17719,
+ "karen": 10349,
+ "kari": 15339,
+ "kari": 15161,
+ "karim": 33477,
+ "karin": 43917,
+ "karina": 40250,
+ "karl": 20967,
+ "karl": 13134,
+ "karla": 42309,
+ "karma": 17658,
+ "karnat": 13994,
+ "karnataka": 15515,
+ "karo": 45305,
+ "kart": 47841,
+ "kart": 21310,
+ "karthik": 41397,
+ "karti": 23053,
+ "kartikeyan": 32584,
+ "karting": 41655,
+ "kas": 6119,
+ "kas": 14372,
+ "kasa": 46111,
+ "kash": 6954,
+ "kash": 21371,
+ "kashi": 47945,
+ "kashmir": 20251,
+ "kashmir": 10783,
+ "kashmiri": 35331,
+ "kasi": 45870,
+ "kasi": 32819,
+ "kasich": 39666,
+ "kat": 2844,
+ "kat": 9341,
+ "kata": 14558,
+ "kate": 11620,
+ "kate": 6699,
+ "katelyn": 45963,
+ "kath": 7386,
+ "kath": 19745,
+ "katharine": 41473,
+ "katherine": 17687,
+ "kathle": 18721,
+ "kathleen": 21709,
+ "kathmandu": 34456,
+ "kathniel": 36159,
+ "kathr": 14905,
+ "kathryn": 33142,
+ "kathryn": 19999,
+ "kathy": 34775,
+ "kathy": 18795,
+ "kati": 6515,
+ "kati": 29928,
+ "katic": 48058,
+ "katie": 24117,
+ "katie": 9076,
+ "katniss": 47916,
+ "kato": 27573,
+ "katrin": 31282,
+ "katrina": 21397,
+ "katrinakaif": 45845,
+ "kats": 44213,
+ "katsu": 49296,
+ "katsu": 43712,
+ "katy": 17609,
+ "katy": 14435,
+ "katyperry": 28309,
+ "katz": 30790,
+ "kau": 9299,
+ "kau": 36895,
+ "kauai": 44050,
+ "kaufman": 37188,
+ "kaur": 30518,
+ "kav": 10228,
+ "kavan": 18576,
+ "kavanaugh": 20252,
+ "kaw": 10842,
+ "kaw": 42719,
+ "kawa": 33244,
+ "kawaii": 26891,
+ "kawasaki": 28227,
+ "kawhi": 41220,
+ "kay": 4673,
+ "kay": 9862,
+ "kaya": 22752,
+ "kayak": 27043,
+ "kayaking": 28977,
+ "kaye": 33003,
+ "kayla": 17139,
+ "kaylee": 47215,
+ "kayo": 37021,
+ "kaz": 8812,
+ "kaz": 39622,
+ "kazakh": 25451,
+ "kazakhstan": 26720,
+ "kazan": 47641,
+ "kb": 27381,
+ "kb": 19960,
+ "kbs": 27418,
+ "kc": 10869,
+ "kc": 8638,
+ "kca": 14347,
+ "kcon": 39970,
+ "kcr": 46181,
+ "kd": 21826,
+ "kd": 15597,
+ "kday": 31074,
+ "kdrama": 48628,
+ "ke": 643,
+ "ke": 618,
+ "kea": 47926,
+ "kean": 43288,
+ "keane": 28635,
+ "keanu": 40608,
+ "kear": 21562,
+ "kearney": 36435,
+ "keating": 40045,
+ "keaton": 29975,
+ "kebab": 36497,
+ "ked": 11730,
+ "ked": 1243,
+ "kee": 9724,
+ "kee": 6760,
+ "keef": 42323,
+ "keefe": 46965,
+ "keegan": 31122,
+ "keel": 48376,
+ "keen": 17714,
+ "keen": 13218,
+ "keenan": 36276,
+ "keep": 2924,
+ "keep": 1726,
+ "keeper": 7650,
+ "keepers": 16130,
+ "keepin": 41712,
+ "keeping": 38371,
+ "keeping": 4873,
+ "keepit": 28044,
+ "keeps": 6333,
+ "keer": 27412,
+ "keerth": 47500,
+ "keerthyofficial": 48185,
+ "kees": 10791,
+ "keg": 32785,
+ "keh": 41272,
+ "keh": 36983,
+ "kei": 18735,
+ "kei": 24835,
+ "keith": 18762,
+ "keith": 8252,
+ "kej": 15674,
+ "kejri": 16617,
+ "kejriwal": 17334,
+ "keke": 39195,
+ "kel": 2825,
+ "kel": 7553,
+ "kele": 41765,
+ "kell": 16082,
+ "kell": 40103,
+ "keller": 21407,
+ "kelley": 23776,
+ "kelli": 45852,
+ "kelli": 46190,
+ "kellie": 49224,
+ "kellogg": 44218,
+ "kelly": 13417,
+ "kelly": 5220,
+ "kelown": 31708,
+ "kelowna": 32963,
+ "kelsey": 42295,
+ "kelsey": 23018,
+ "kelvin": 32859,
+ "kem": 31013,
+ "kem": 17349,
+ "kemp": 18302,
+ "kemp": 25325,
+ "ken": 1838,
+ "ken": 1702,
+ "kend": 7497,
+ "kendal": 44836,
+ "kendall": 34607,
+ "kendall": 16238,
+ "kendra": 36074,
+ "kendrick": 41787,
+ "kendrick": 21953,
+ "kendricklamar": 47020,
+ "kenne": 6209,
+ "kennedy": 38631,
+ "kennedy": 9004,
+ "kennel": 39595,
+ "kenneth": 46900,
+ "kenneth": 17839,
+ "kenney": 41373,
+ "kenny": 20185,
+ "kenny": 9595,
+ "kens": 29765,
+ "kensing": 21505,
+ "kensington": 24988,
+ "kent": 13875,
+ "kent": 8214,
+ "kentu": 9045,
+ "kentucky": 32230,
+ "kentucky": 10014,
+ "keny": 17374,
+ "kenya": 6181,
+ "kenyan": 22624,
+ "kenyans": 36263,
+ "kenyatta": 31012,
+ "kenzie": 38087,
+ "keo": 43062,
+ "kept": 7737,
+ "ker": 2352,
+ "ker": 1485,
+ "keral": 35122,
+ "kerala": 11881,
+ "kered": 26690,
+ "kerel": 32232,
+ "keri": 43447,
+ "kermit": 40908,
+ "kern": 40150,
+ "kernel": 40684,
+ "kerr": 20491,
+ "kerri": 41849,
+ "kerry": 24795,
+ "kerry": 13097,
+ "kers": 30347,
+ "kers": 2880,
+ "kershaw": 40785,
+ "kerson": 42810,
+ "kerswednesday": 48152,
+ "kert": 47279,
+ "kes": 38398,
+ "kes": 1115,
+ "kesh": 19751,
+ "kesha": 36526,
+ "kest": 15080,
+ "ket": 2715,
+ "ket": 1236,
+ "ketball": 38240,
+ "ketch": 22590,
+ "ketch": 35371,
+ "ketchup": 26724,
+ "kete": 25404,
+ "keted": 41396,
+ "keting": 15951,
+ "keto": 27485,
+ "keto": 28754,
+ "kets": 1632,
+ "kett": 23124,
+ "kett": 10312,
+ "kettering": 43779,
+ "kettle": 41992,
+ "kettle": 24303,
+ "kev": 22758,
+ "kev": 29419,
+ "kevin": 9419,
+ "kevin": 4685,
+ "kew": 38014,
+ "kew": 31409,
+ "kex": 30251,
+ "key": 2891,
+ "key": 1458,
+ "keyan": 27617,
+ "keyboard": 13017,
+ "keyboards": 49237,
+ "keychain": 31050,
+ "keye": 40516,
+ "keye": 20635,
+ "keyes": 18336,
+ "keynes": 32462,
+ "keynote": 7556,
+ "keys": 48912,
+ "keys": 6355,
+ "keystone": 30688,
+ "keyword": 42284,
+ "keywords": 48122,
+ "kf": 33308,
+ "kf": 42119,
+ "kfc": 22032,
+ "kg": 36772,
+ "kg": 7817,
+ "kgs": 46629,
+ "kh": 2166,
+ "kh": 7452,
+ "kha": 7333,
+ "kha": 18929,
+ "khair": 43742,
+ "khaki": 41646,
+ "khal": 13070,
+ "khaled": 29343,
+ "khali": 11324,
+ "khalid": 27166,
+ "khalifa": 21389,
+ "khalil": 36229,
+ "kham": 24892,
+ "khan": 13318,
+ "khan": 3873,
+ "khand": 43384,
+ "khand": 31110,
+ "khanna": 29931,
+ "khar": 18340,
+ "khar": 28578,
+ "khart": 37458,
+ "khat": 43290,
+ "khe": 26360,
+ "kher": 43843,
+ "khi": 39062,
+ "khi": 42925,
+ "khil": 34101,
+ "khloe": 45312,
+ "kho": 14022,
+ "kho": 28774,
+ "khou": 30656,
+ "khs": 21239,
+ "khtar": 45593,
+ "khu": 14041,
+ "khur": 32083,
+ "khy": 40917,
+ "khz": 45604,
+ "ki": 848,
+ "ki": 2608,
+ "kia": 8712,
+ "kian": 43961,
+ "kian": 25708,
+ "kians": 44010,
+ "kib": 43108,
+ "kiba": 37207,
+ "kic": 24003,
+ "kic": 27633,
+ "kicchasu": 44665,
+ "kicchasudeep": 45560,
+ "kick": 4102,
+ "kick": 4289,
+ "kickass": 39299,
+ "kickboxing": 36041,
+ "kicked": 12479,
+ "kicker": 26338,
+ "kickin": 34597,
+ "kicking": 7802,
+ "kickoff": 10245,
+ "kicks": 6989,
+ "kickstart": 40780,
+ "kickstarter": 13228,
+ "kid": 3948,
+ "kid": 3551,
+ "kidd": 24082,
+ "kidding": 14535,
+ "kiddo": 36360,
+ "kiddos": 29205,
+ "kidlit": 39064,
+ "kidlit": 33515,
+ "kidlitart": 41600,
+ "kidman": 44931,
+ "kidnap": 45100,
+ "kidnapp": 16183,
+ "kidnapped": 24737,
+ "kidnapping": 32361,
+ "kidney": 37835,
+ "kidney": 14610,
+ "kids": 15561,
+ "kids": 1911,
+ "kidz": 41938,
+ "kie": 8544,
+ "kie": 3094,
+ "kiefer": 48026,
+ "kiel": 40940,
+ "kiel": 25509,
+ "kien": 28782,
+ "kier": 20403,
+ "kier": 35575,
+ "kieran": 29231,
+ "kies": 36601,
+ "kies": 4993,
+ "kiest": 29755,
+ "kiev": 24585,
+ "kiewicz": 47574,
+ "kigali": 40278,
+ "kii": 39340,
+ "kik": 36176,
+ "kiki": 23962,
+ "kiko": 40861,
+ "kil": 4912,
+ "kil": 39337,
+ "kildare": 45541,
+ "kili": 24386,
+ "kilig": 49172,
+ "kilimanjaro": 43470,
+ "kilkenny": 33805,
+ "kill": 6163,
+ "kill": 4367,
+ "killa": 41355,
+ "killarney": 48813,
+ "killed": 3733,
+ "killer": 28230,
+ "killer": 6613,
+ "killers": 17614,
+ "killin": 25903,
+ "killing": 37977,
+ "killing": 5923,
+ "killings": 24918,
+ "kills": 9795,
+ "kiln": 44150,
+ "kilo": 39281,
+ "kilom": 26285,
+ "kilometers": 39192,
+ "kilometres": 43278,
+ "kilt": 49319,
+ "kim": 4639,
+ "kim": 4606,
+ "kimber": 16796,
+ "kimberley": 39859,
+ "kimberly": 27465,
+ "kimchi": 41027,
+ "kimi": 31536,
+ "kimkardashian": 35400,
+ "kimmel": 27820,
+ "kimono": 40024,
+ "kin": 1442,
+ "kin": 2667,
+ "kina": 28518,
+ "kind": 7204,
+ "kind": 3044,
+ "kinda": 6612,
+ "kinder": 12711,
+ "kinder": 24159,
+ "kindergarten": 16749,
+ "kindle": 24704,
+ "kindle": 10746,
+ "kindleunlimited": 32164,
+ "kindly": 13952,
+ "kindness": 45112,
+ "kindness": 10614,
+ "kinds": 14879,
+ "kine": 17607,
+ "kineni": 49080,
+ "kinetic": 37699,
+ "king": 2365,
+ "king": 674,
+ "kingdom": 21870,
+ "kingdom": 7364,
+ "kingdomhearts": 48570,
+ "kingdoms": 43890,
+ "kingfisher": 34330,
+ "kingjames": 33153,
+ "kingly": 33642,
+ "kingof": 27878,
+ "kings": 18590,
+ "kings": 4232,
+ "kingsley": 41807,
+ "kingston": 40736,
+ "kingston": 15393,
+ "kini": 41644,
+ "kinky": 37006,
+ "kinney": 37233,
+ "kino": 39000,
+ "kins": 31060,
+ "kins": 4386,
+ "kinson": 12095,
+ "kio": 28210,
+ "kio": 39401,
+ "kiosk": 39146,
+ "kip": 27636,
+ "kip": 15986,
+ "kipp": 43329,
+ "kir": 3476,
+ "kir": 32949,
+ "kira": 33038,
+ "kiran": 43234,
+ "kiran": 36603,
+ "kirby": 17065,
+ "kiri": 34170,
+ "kiri": 45826,
+ "kirk": 10639,
+ "kirk": 11508,
+ "kirkland": 43061,
+ "kiro": 39749,
+ "kirstel": 46483,
+ "kirsten": 31813,
+ "kirsty": 37787,
+ "kis": 3199,
+ "kis": 22796,
+ "kish": 25662,
+ "kiss": 43757,
+ "kiss": 5946,
+ "kissed": 22561,
+ "kisses": 47876,
+ "kisses": 11220,
+ "kissing": 18637,
+ "kistan": 29580,
+ "kit": 4566,
+ "kit": 4274,
+ "kita": 29961,
+ "kitch": 3850,
+ "kitchen": 18131,
+ "kitchen": 4485,
+ "kitchener": 34428,
+ "kitchens": 28301,
+ "kite": 47777,
+ "kite": 19867,
+ "kites": 45829,
+ "kits": 13730,
+ "kitt": 10840,
+ "kitten": 13063,
+ "kittens": 17216,
+ "kitties": 36013,
+ "kitty": 25067,
+ "kitty": 8417,
+ "kiwan": 38709,
+ "kiwanis": 46513,
+ "kiwi": 22440,
+ "kiwis": 48108,
+ "kiya": 41610,
+ "kj": 27385,
+ "kj": 28238,
+ "kja": 41048,
+ "kjv": 37387,
+ "kk": 4390,
+ "kk": 10849,
+ "kka": 19002,
+ "kke": 44239,
+ "kker": 32399,
+ "kki": 44672,
+ "kkk": 20073,
+ "kkkk": 15834,
+ "kkkk": 47160,
+ "kkkkkkkk": 31042,
+ "kko": 43965,
+ "kkr": 40855,
+ "kl": 8498,
+ "kl": 14134,
+ "kla": 11249,
+ "klan": 46935,
+ "klar": 41374,
+ "klaus": 31788,
+ "kle": 7612,
+ "kle": 7432,
+ "klein": 33475,
+ "klein": 17579,
+ "kley": 18594,
+ "kli": 31640,
+ "klin": 44809,
+ "klin": 41647,
+ "kline": 47580,
+ "kling": 40270,
+ "klm": 38859,
+ "klo": 15296,
+ "klopp": 26446,
+ "kltu": 25978,
+ "klu": 21852,
+ "kly": 45090,
+ "km": 29954,
+ "km": 4590,
+ "kman": 33312,
+ "kms": 24996,
+ "kn": 4825,
+ "kn": 23693,
+ "knapp": 33945,
+ "kne": 6358,
+ "knee": 9897,
+ "knees": 19115,
+ "kner": 31578,
+ "knew": 5009,
+ "kni": 6312,
+ "knick": 33286,
+ "knicks": 17657,
+ "knife": 44176,
+ "knife": 8960,
+ "knigh": 43099,
+ "knight": 17949,
+ "knight": 7355,
+ "knights": 10385,
+ "knit": 18745,
+ "knit": 14313,
+ "knitted": 28151,
+ "knitting": 18863,
+ "knives": 20910,
+ "kno": 1482,
+ "kno": 25362,
+ "knob": 29736,
+ "knobs": 47504,
+ "knock": 14195,
+ "knock": 11583,
+ "knocked": 15325,
+ "knocking": 20380,
+ "knockout": 22602,
+ "knocks": 24296,
+ "knoll": 43882,
+ "knot": 18412,
+ "knots": 32428,
+ "know": 4179,
+ "know": 1038,
+ "knowing": 9267,
+ "knowledge": 27864,
+ "knowledge": 5510,
+ "knowledgeable": 43391,
+ "knowles": 32631,
+ "known": 3102,
+ "knows": 4309,
+ "knowyour": 30773,
+ "knox": 18630,
+ "knox": 21833,
+ "knoxville": 23232,
+ "knu": 14812,
+ "knuck": 21333,
+ "knuckle": 42023,
+ "knuckles": 40127,
+ "knw": 40803,
+ "ko": 1313,
+ "ko": 2448,
+ "koala": 36654,
+ "kobe": 42644,
+ "kobe": 14470,
+ "kobo": 42390,
+ "koch": 25331,
+ "kochi": 36710,
+ "kodak": 30425,
+ "kodi": 46611,
+ "kof": 17528,
+ "koff": 47303,
+ "kofi": 40400,
+ "koh": 13379,
+ "koh": 31216,
+ "kohl": 48479,
+ "kohli": 17549,
+ "koi": 28150,
+ "kojima": 46419,
+ "kok": 32045,
+ "kok": 11225,
+ "koko": 42426,
+ "koko": 40003,
+ "kol": 7142,
+ "kol": 31023,
+ "kolkata": 18011,
+ "kom": 6686,
+ "kom": 24181,
+ "kombat": 29670,
+ "kombucha": 48615,
+ "komo": 31820,
+ "kon": 5743,
+ "kon": 29519,
+ "kona": 30203,
+ "kong": 31784,
+ "kong": 6506,
+ "konstant": 46583,
+ "koo": 12225,
+ "koo": 40472,
+ "kook": 16003,
+ "kool": 36755,
+ "kool": 26444,
+ "kop": 16623,
+ "kop": 38999,
+ "kor": 6428,
+ "kor": 24175,
+ "kore": 3919,
+ "korea": 5915,
+ "korean": 31949,
+ "korean": 8034,
+ "kori": 42842,
+ "korn": 45412,
+ "korn": 31492,
+ "kors": 34535,
+ "kos": 47438,
+ "kos": 22951,
+ "kosh": 45233,
+ "kosher": 36502,
+ "koso": 23892,
+ "kosovo": 28343,
+ "kot": 23323,
+ "kot": 20701,
+ "kota": 21735,
+ "koto": 40945,
+ "koto": 29977,
+ "kou": 18502,
+ "kou": 39614,
+ "kour": 34134,
+ "kov": 17733,
+ "kov": 15156,
+ "kova": 26185,
+ "koval": 47903,
+ "kovic": 16886,
+ "kovich": 44794,
+ "kovsky": 33384,
+ "kow": 29764,
+ "kow": 23919,
+ "kowski": 17649,
+ "koz": 29598,
+ "kp": 16174,
+ "kp": 16894,
+ "kpa": 38759,
+ "kph": 41138,
+ "kpk": 42094,
+ "kpmg": 38243,
+ "kpop": 29534,
+ "kpop": 15859,
+ "kprc": 47832,
+ "kprs": 46253,
+ "kr": 7309,
+ "kr": 14107,
+ "kra": 5762,
+ "kraft": 28057,
+ "kraja": 29016,
+ "kraken": 48408,
+ "krakow": 40033,
+ "kram": 19075,
+ "kramer": 27495,
+ "kran": 33243,
+ "kranti": 47969,
+ "krat": 30470,
+ "kre": 8362,
+ "kreme": 43140,
+ "kremlin": 33979,
+ "kri": 3679,
+ "kris": 35251,
+ "kris": 12261,
+ "krish": 11487,
+ "krishna": 15863,
+ "krishnan": 46535,
+ "krispy": 49292,
+ "krist": 16490,
+ "kristen": 28881,
+ "kristen": 16644,
+ "kristi": 26895,
+ "kristin": 35408,
+ "kristin": 26785,
+ "kristina": 33180,
+ "krit": 36265,
+ "kro": 16193,
+ "kroger": 36344,
+ "kron": 25999,
+ "kru": 10609,
+ "kruger": 32948,
+ "krun": 43084,
+ "kry": 13995,
+ "krystal": 36554,
+ "ks": 10470,
+ "ks": 662,
+ "ksa": 25439,
+ "ksh": 36594,
+ "kst": 17420,
+ "kstate": 48590,
+ "ksu": 43496,
+ "kswx": 36180,
+ "kt": 17238,
+ "kt": 7792,
+ "ktm": 33989,
+ "ktn": 42170,
+ "kton": 37848,
+ "kts": 48577,
+ "ktv": 36444,
+ "ku": 1836,
+ "ku": 4827,
+ "kuala": 30336,
+ "kubball": 48995,
+ "kuber": 41336,
+ "kubernetes": 45144,
+ "kubrick": 37032,
+ "kuch": 39394,
+ "kud": 40818,
+ "kudos": 14481,
+ "kul": 11325,
+ "kul": 31514,
+ "kum": 18086,
+ "kum": 28148,
+ "kuma": 43139,
+ "kuma": 33920,
+ "kumar": 22329,
+ "kumar": 7674,
+ "kumb": 31391,
+ "kun": 6849,
+ "kun": 21842,
+ "kung": 39656,
+ "kung": 22347,
+ "kunst": 37881,
+ "kup": 39023,
+ "kups": 27240,
+ "kur": 4862,
+ "kurdi": 23504,
+ "kurdish": 21644,
+ "kurdistan": 24459,
+ "kurds": 20888,
+ "kuri": 46375,
+ "kuro": 28239,
+ "kuro": 47826,
+ "kurt": 31903,
+ "kurt": 14527,
+ "kus": 27618,
+ "kus": 27505,
+ "kush": 22264,
+ "kush": 24594,
+ "kushner": 36716,
+ "kut": 17283,
+ "kut": 36965,
+ "kuwait": 19679,
+ "kuya": 34815,
+ "kuz": 33253,
+ "kv": 27594,
+ "kv": 34249,
+ "kw": 10072,
+ "kw": 18339,
+ "kwa": 32784,
+ "kwa": 48576,
+ "kwame": 46681,
+ "kwan": 37100,
+ "kwan": 39447,
+ "kwang": 40260,
+ "kwe": 26050,
+ "kwi": 35327,
+ "kwon": 36369,
+ "kx": 28190,
+ "kx": 46442,
+ "ky": 2018,
+ "ky": 2383,
+ "kya": 29142,
+ "kyc": 37758,
+ "kyiv": 36422,
+ "kyle": 15847,
+ "kyle": 7539,
+ "kylie": 28282,
+ "kylie": 17983,
+ "kyliejenner": 47232,
+ "kylo": 47704,
+ "kyo": 13150,
+ "kyo": 6281,
+ "kyoto": 23223,
+ "kyr": 26329,
+ "kyrgy": 40013,
+ "kyrgyz": 48346,
+ "kyrie": 21857,
+ "kyu": 28296,
+ "kyu": 25490,
+ "kyuhyun": 37229,
+ "kyung": 41058,
+ "kyungsoo": 30280,
+ "kywx": 39940,
+ "kz": 48743,
+ "kz": 36848,
+ "kzn": 38264,
+ "kö": 32437,
+ "l": 75,
+ "l": 331,
+ "la": 572,
+ "la": 1210,
+ "laa": 44642,
+ "lab": 3537,
+ "lab": 4352,
+ "labe": 25749,
+ "label": 12235,
+ "label": 9093,
+ "labeled": 32720,
+ "labeling": 36825,
+ "labelled": 45188,
+ "labels": 17413,
+ "lable": 31879,
+ "labor": 11201,
+ "labor": 7878,
+ "laboratories": 43421,
+ "laboratory": 17664,
+ "laborday": 39324,
+ "labou": 32700,
+ "labour": 19586,
+ "labour": 6019,
+ "labourdoorstep": 37008,
+ "labout": 35961,
+ "labra": 37067,
+ "labrador": 25409,
+ "labs": 12021,
+ "laby": 29131,
+ "labyrin": 31782,
+ "labyrinth": 35594,
+ "lac": 4477,
+ "lac": 16189,
+ "lace": 30012,
+ "lace": 5421,
+ "laced": 36800,
+ "laces": 23281,
+ "lacey": 31754,
+ "lach": 30558,
+ "lack": 24915,
+ "lack": 8069,
+ "lacking": 30080,
+ "lacks": 34388,
+ "laco": 45882,
+ "lacrosse": 12915,
+ "lacy": 38645,
+ "lad": 15991,
+ "lad": 10707,
+ "ladak": 42312,
+ "ladakh": 45295,
+ "ladder": 16637,
+ "ladders": 47125,
+ "lade": 26447,
+ "laden": 28634,
+ "ladi": 12934,
+ "ladies": 28932,
+ "ladies": 3431,
+ "lads": 9803,
+ "lady": 7275,
+ "lady": 2909,
+ "ladybird": 43389,
+ "ladybug": 40038,
+ "ladygaga": 21232,
+ "laf": 47555,
+ "lafayette": 22683,
+ "lag": 30932,
+ "lag": 20394,
+ "laga": 30161,
+ "lage": 24369,
+ "lager": 36811,
+ "lager": 22989,
+ "lagh": 37237,
+ "laghate": 47565,
+ "laghateparth": 48780,
+ "lagi": 39786,
+ "lago": 42698,
+ "lago": 31476,
+ "lagoon": 22753,
+ "lagos": 12728,
+ "lagun": 18500,
+ "laguna": 23609,
+ "lah": 27315,
+ "lah": 4299,
+ "lahat": 42164,
+ "lahore": 16733,
+ "lai": 23947,
+ "laid": 42560,
+ "laid": 11160,
+ "lain": 46958,
+ "lain": 17151,
+ "laine": 35860,
+ "lair": 31981,
+ "lais": 34923,
+ "lak": 12890,
+ "lak": 26793,
+ "lake": 6441,
+ "lake": 2553,
+ "lakedistrict": 26437,
+ "lakel": 26133,
+ "lakeland": 34306,
+ "laker": 45717,
+ "lakers": 13570,
+ "lakes": 9265,
+ "lakeshore": 42595,
+ "lakeside": 30915,
+ "lakewood": 36417,
+ "lakh": 21487,
+ "lakhs": 37985,
+ "lakings": 34289,
+ "lakota": 45510,
+ "laksh": 24937,
+ "lakshmi": 39682,
+ "lal": 12301,
+ "lal": 19430,
+ "lala": 33661,
+ "lali": 21726,
+ "laliga": 32383,
+ "lam": 2022,
+ "lam": 5704,
+ "lama": 26049,
+ "lamar": 28678,
+ "lamar": 17284,
+ "lamb": 19863,
+ "lamb": 10034,
+ "lambda": 36687,
+ "lambert": 14574,
+ "lambeth": 43410,
+ "lambo": 45464,
+ "lamborgh": 18709,
+ "lamborghini": 19462,
+ "lambs": 30361,
+ "lame": 23192,
+ "lamin": 22337,
+ "laminated": 49079,
+ "lamo": 41461,
+ "lamont": 46719,
+ "lamp": 26700,
+ "lamp": 10725,
+ "lampard": 39989,
+ "lamps": 23424,
+ "lan": 1193,
+ "lan": 4872,
+ "lana": 15406,
+ "lanapar": 47437,
+ "lanaparrilla": 47819,
+ "lanc": 11872,
+ "lanca": 15694,
+ "lancashire": 20939,
+ "lancaster": 16446,
+ "lance": 26025,
+ "lance": 11609,
+ "lancer": 38195,
+ "lancers": 46392,
+ "lancia": 48698,
+ "lancs": 47540,
+ "land": 1567,
+ "land": 973,
+ "lande": 36556,
+ "landed": 9873,
+ "lander": 37247,
+ "lander": 9666,
+ "landers": 20019,
+ "landfall": 38465,
+ "landfill": 34947,
+ "landia": 41384,
+ "landing": 8292,
+ "landings": 46104,
+ "landlord": 28938,
+ "landlords": 35283,
+ "landmark": 15208,
+ "landmarks": 30393,
+ "lando": 25463,
+ "lando": 7065,
+ "landon": 32748,
+ "landrover": 38125,
+ "landry": 36137,
+ "lands": 40223,
+ "lands": 2961,
+ "landsc": 4384,
+ "landscape": 21123,
+ "landscape": 5727,
+ "landscapephotography": 28125,
+ "landscapes": 15344,
+ "landscaping": 25642,
+ "landslide": 31954,
+ "lane": 25534,
+ "lane": 3980,
+ "lanes": 10345,
+ "laney": 38552,
+ "lang": 7969,
+ "lang": 8578,
+ "lange": 32021,
+ "langford": 45615,
+ "langley": 28595,
+ "langu": 4095,
+ "language": 46103,
+ "language": 4781,
+ "languages": 13527,
+ "lani": 22964,
+ "lanka": 16221,
+ "lankan": 40531,
+ "lannister": 49056,
+ "lans": 43550,
+ "lansing": 30805,
+ "lant": 44504,
+ "lanta": 44768,
+ "lantern": 17185,
+ "lanterns": 33676,
+ "lantic": 32601,
+ "lantic": 27678,
+ "lants": 38425,
+ "lanyard": 46808,
+ "lao": 32475,
+ "lao": 29521,
+ "laos": 34353,
+ "lap": 7213,
+ "lap": 8639,
+ "lapd": 32557,
+ "lapel": 47961,
+ "lapland": 43633,
+ "laps": 18711,
+ "lapse": 33365,
+ "laptop": 10464,
+ "laptops": 32189,
+ "laq": 45026,
+ "lar": 1592,
+ "lar": 1652,
+ "lara": 19435,
+ "lard": 40347,
+ "lare": 22415,
+ "laredo": 48427,
+ "large": 40234,
+ "large": 3638,
+ "largely": 21418,
+ "larger": 12567,
+ "largest": 4960,
+ "largo": 44161,
+ "lari": 34676,
+ "lark": 43164,
+ "lark": 23536,
+ "larkin": 34769,
+ "larry": 18642,
+ "larry": 8242,
+ "lars": 8669,
+ "larsen": 39721,
+ "larson": 27973,
+ "larvae": 44840,
+ "las": 8295,
+ "las": 2552,
+ "lasag": 31210,
+ "lasagna": 40683,
+ "lasalle": 43866,
+ "laser": 25607,
+ "laser": 9885,
+ "lasers": 37060,
+ "lash": 31995,
+ "lash": 18480,
+ "lashes": 21015,
+ "lass": 24203,
+ "lass": 18263,
+ "lassic": 39430,
+ "last": 10600,
+ "last": 952,
+ "lasted": 25711,
+ "lasting": 13434,
+ "lastnight": 30159,
+ "lasts": 20141,
+ "lasvegas": 17789,
+ "lat": 1591,
+ "lat": 28437,
+ "lata": 47114,
+ "latam": 40012,
+ "late": 13267,
+ "late": 2325,
+ "latel": 49035,
+ "lately": 11824,
+ "latepost": 48328,
+ "later": 24109,
+ "later": 2941,
+ "lateral": 26646,
+ "latest": 46805,
+ "latest": 2053,
+ "latex": 27520,
+ "lati": 16357,
+ "latimes": 43356,
+ "latin": 16695,
+ "latin": 9888,
+ "latina": 27936,
+ "latino": 45734,
+ "latino": 19470,
+ "latinos": 40233,
+ "lation": 6191,
+ "latitude": 37392,
+ "lative": 15719,
+ "lator": 9291,
+ "lators": 28278,
+ "latt": 33561,
+ "latte": 17697,
+ "latter": 26198,
+ "latvia": 30034,
+ "lau": 1853,
+ "lau": 23090,
+ "lauderdale": 24352,
+ "laugh": 4969,
+ "laugh": 6332,
+ "laughed": 16746,
+ "laughing": 8301,
+ "laughs": 14322,
+ "laughter": 10722,
+ "laun": 2944,
+ "launch": 31168,
+ "launch": 2904,
+ "launched": 6125,
+ "launcher": 35782,
+ "launches": 7023,
+ "launching": 8565,
+ "laundering": 34079,
+ "laundry": 14797,
+ "laur": 15256,
+ "laura": 17091,
+ "laura": 7763,
+ "laure": 16932,
+ "laureate": 25675,
+ "laurel": 43370,
+ "laurel": 19942,
+ "lauren": 10456,
+ "lauren": 7634,
+ "laurence": 29353,
+ "laurent": 23226,
+ "laurie": 20326,
+ "laus": 38895,
+ "laus": 28111,
+ "lause": 22269,
+ "laut": 47688,
+ "lav": 13767,
+ "lav": 26919,
+ "lava": 16765,
+ "laven": 15047,
+ "lavender": 16033,
+ "laver": 28188,
+ "lavish": 35443,
+ "law": 2874,
+ "law": 2606,
+ "lawful": 33845,
+ "lawler": 47862,
+ "lawless": 39468,
+ "lawmaker": 37169,
+ "lawmakers": 21190,
+ "lawn": 31675,
+ "lawn": 11024,
+ "lawrence": 32221,
+ "lawrence": 8820,
+ "laws": 7306,
+ "lawson": 22152,
+ "lawsuit": 14346,
+ "lawsuits": 44331,
+ "lawyer": 10552,
+ "lawyers": 14232,
+ "lax": 17750,
+ "lax": 10024,
+ "lay": 7205,
+ "lay": 6360,
+ "laye": 25995,
+ "layer": 12411,
+ "layered": 28520,
+ "layers": 15900,
+ "laying": 12333,
+ "layla": 45050,
+ "layne": 48721,
+ "layo": 21738,
+ "layoffs": 29019,
+ "layout": 17314,
+ "lays": 19546,
+ "layton": 38061,
+ "laz": 18806,
+ "lazar": 33075,
+ "lazarus": 49126,
+ "laze": 41559,
+ "lazer": 43735,
+ "lazio": 33010,
+ "lazy": 32614,
+ "lazy": 10753,
+ "lb": 21958,
+ "lb": 7422,
+ "lbc": 37694,
+ "lbj": 45683,
+ "lbloggers": 48695,
+ "lbs": 8912,
+ "lc": 9584,
+ "lc": 7225,
+ "lcd": 21356,
+ "lcfc": 25339,
+ "lcs": 32279,
+ "ld": 1431,
+ "ld": 730,
+ "lder": 6945,
+ "lders": 43221,
+ "ldn": 37050,
+ "ldn": 2517,
+ "ldnont": 25827,
+ "ldnt": 21690,
+ "ldr": 37279,
+ "lds": 31235,
+ "le": 534,
+ "le": 579,
+ "lea": 2246,
+ "lea": 13324,
+ "leach": 35527,
+ "lead": 1328,
+ "lead": 2784,
+ "leader": 14806,
+ "leader": 3236,
+ "leaderboard": 34519,
+ "leaders": 3546,
+ "leadership": 36876,
+ "leadership": 3652,
+ "leading": 3833,
+ "leads": 5335,
+ "leaf": 9377,
+ "leaf": 7232,
+ "leaflet": 38289,
+ "leaflets": 39014,
+ "leafs": 16688,
+ "leafy": 42616,
+ "leagu": 13317,
+ "league": 16635,
+ "league": 2313,
+ "leagueof": 26022,
+ "leagueoflegends": 31737,
+ "leagues": 19888,
+ "leah": 24350,
+ "leah": 19308,
+ "leak": 42900,
+ "leak": 15489,
+ "leaked": 14353,
+ "leaking": 34097,
+ "leaks": 15657,
+ "leam": 39606,
+ "lean": 12447,
+ "lean": 8208,
+ "leaning": 24411,
+ "leanne": 41448,
+ "leans": 9357,
+ "leap": 29129,
+ "leap": 15392,
+ "leaps": 48080,
+ "lear": 1146,
+ "lear": 27663,
+ "learn": 16959,
+ "learn": 1768,
+ "learned": 6048,
+ "learnenglish": 49040,
+ "learner": 33547,
+ "learners": 19572,
+ "learning": 22632,
+ "learning": 2378,
+ "learns": 17569,
+ "learnt": 18959,
+ "leary": 36051,
+ "lease": 49041,
+ "lease": 14394,
+ "leased": 48352,
+ "leash": 36192,
+ "leasing": 29160,
+ "least": 3651,
+ "leather": 21417,
+ "leather": 5862,
+ "leau": 26498,
+ "leav": 3198,
+ "leave": 37512,
+ "leave": 3258,
+ "leaves": 5579,
+ "leaving": 5216,
+ "leban": 9360,
+ "lebanese": 23819,
+ "lebanon": 11695,
+ "leblanc": 46381,
+ "lebo": 44184,
+ "lebron": 11971,
+ "lebu": 47030,
+ "lec": 944,
+ "lec": 35374,
+ "leche": 46197,
+ "lect": 45392,
+ "lection": 18252,
+ "lections": 30995,
+ "lecture": 6617,
+ "lecturer": 23795,
+ "lectures": 21118,
+ "led": 8767,
+ "led": 912,
+ "ledge": 23647,
+ "ledge": 4815,
+ "ledger": 26817,
+ "leds": 36763,
+ "lee": 6224,
+ "lee": 2592,
+ "leed": 16483,
+ "leed": 40206,
+ "leeds": 38900,
+ "leeds": 7420,
+ "leek": 34585,
+ "leeminho": 37831,
+ "leen": 35311,
+ "leen": 15940,
+ "leep": 48875,
+ "leep": 10191,
+ "lees": 29324,
+ "lees": 34056,
+ "lef": 9152,
+ "left": 33949,
+ "left": 1823,
+ "leftist": 35143,
+ "lefto": 17437,
+ "leftover": 26414,
+ "leftovers": 28481,
+ "lefty": 33935,
+ "leg": 1211,
+ "leg": 4924,
+ "lega": 38674,
+ "legacy": 44108,
+ "legacy": 6447,
+ "legal": 17743,
+ "legal": 3998,
+ "legalization": 40584,
+ "legalize": 42921,
+ "legally": 14152,
+ "legate": 46009,
+ "lege": 8065,
+ "legen": 6105,
+ "legend": 5480,
+ "legend": 3539,
+ "legendary": 6053,
+ "legendof": 47915,
+ "legends": 6396,
+ "leges": 15356,
+ "legg": 18474,
+ "legg": 32511,
+ "legged": 25830,
+ "leggings": 22895,
+ "leggo": 43441,
+ "legi": 11183,
+ "legion": 35503,
+ "legion": 14525,
+ "legis": 7200,
+ "legislat": 16486,
+ "legislation": 14143,
+ "legislative": 16755,
+ "legislators": 31572,
+ "legislature": 22309,
+ "legit": 12563,
+ "legitim": 17656,
+ "legitimate": 24491,
+ "lego": 28117,
+ "lego": 7849,
+ "legos": 45359,
+ "legs": 7072,
+ "leh": 19105,
+ "leh": 29298,
+ "lehead": 28090,
+ "lehigh": 34527,
+ "lehman": 46094,
+ "lei": 15828,
+ "lei": 21830,
+ "leia": 32723,
+ "leic": 35073,
+ "leica": 30206,
+ "leice": 10026,
+ "leicester": 28795,
+ "leicester": 11510,
+ "leicestershire": 45358,
+ "leigh": 14849,
+ "leigh": 9292,
+ "leighton": 30782,
+ "leila": 41342,
+ "lein": 20026,
+ "lein": 28551,
+ "leinster": 32242,
+ "leip": 36401,
+ "leipzig": 41860,
+ "leis": 13133,
+ "leisure": 15849,
+ "leit": 35446,
+ "leith": 34141,
+ "lek": 26626,
+ "lek": 36535,
+ "lel": 46623,
+ "lele": 26075,
+ "lem": 10213,
+ "lem": 8428,
+ "leman": 24478,
+ "lemans": 26694,
+ "lement": 9693,
+ "lements": 15833,
+ "lemme": 23318,
+ "lemon": 12272,
+ "lemon": 7184,
+ "lemonade": 18884,
+ "lemons": 29576,
+ "lemore": 41147,
+ "len": 3687,
+ "len": 2159,
+ "lena": 22038,
+ "lend": 45397,
+ "lend": 24987,
+ "lender": 44734,
+ "lenders": 42443,
+ "lending": 20209,
+ "lene": 17628,
+ "leness": 36551,
+ "leng": 7861,
+ "length": 10130,
+ "lengths": 31858,
+ "lengthy": 32624,
+ "lenin": 41760,
+ "lennon": 18360,
+ "lennox": 45748,
+ "lenny": 48448,
+ "lenny": 30124,
+ "leno": 45357,
+ "lenovo": 25886,
+ "lens": 8666,
+ "lenses": 21264,
+ "lent": 20943,
+ "lent": 22605,
+ "lentil": 41511,
+ "lentils": 44269,
+ "leo": 24008,
+ "leo": 8312,
+ "leon": 6581,
+ "leon": 9763,
+ "leonard": 43849,
+ "leonard": 13142,
+ "leonardo": 20282,
+ "leone": 22864,
+ "leop": 11234,
+ "leopard": 15931,
+ "leopards": 40996,
+ "leopold": 45501,
+ "lep": 48884,
+ "leppard": 41656,
+ "lepre": 45641,
+ "ler": 5587,
+ "ler": 1803,
+ "lero": 15067,
+ "lerosis": 35455,
+ "leroy": 32441,
+ "lers": 6247,
+ "lery": 38184,
+ "les": 4339,
+ "les": 840,
+ "lesbian": 17419,
+ "lesbians": 43182,
+ "lesh": 32282,
+ "lesley": 25506,
+ "lesli": 13649,
+ "leslie": 16244,
+ "lesn": 39568,
+ "lesnar": 42223,
+ "less": 3242,
+ "less": 1285,
+ "lesser": 20369,
+ "lessly": 13103,
+ "lessness": 24847,
+ "lesson": 7714,
+ "lessons": 7199,
+ "lest": 24372,
+ "lest": 6794,
+ "lester": 23157,
+ "lester": 24023,
+ "lestwe": 29726,
+ "lestweforget": 30273,
+ "let": 1898,
+ "let": 1094,
+ "leta": 34319,
+ "lete": 34078,
+ "letes": 6815,
+ "leth": 30022,
+ "leth": 42462,
+ "lethal": 21905,
+ "lethbridge": 48390,
+ "leti": 34176,
+ "letics": 14504,
+ "letit": 46423,
+ "leto": 32203,
+ "leton": 37674,
+ "leton": 7462,
+ "lets": 10448,
+ "lets": 3243,
+ "letsgo": 16967,
+ "letsgo": 29789,
+ "letstalk": 35591,
+ "lett": 22428,
+ "lett": 9778,
+ "lette": 41798,
+ "lette": 10301,
+ "letter": 15567,
+ "letter": 4861,
+ "lettering": 26382,
+ "letterman": 38447,
+ "letters": 9181,
+ "letting": 9510,
+ "letto": 35449,
+ "lettu": 17933,
+ "lettuce": 18573,
+ "leu": 15691,
+ "leuke": 31031,
+ "leukemia": 32097,
+ "leum": 21571,
+ "leur": 45806,
+ "lev": 17022,
+ "lev": 29950,
+ "levan": 42543,
+ "leve": 36271,
+ "level": 21682,
+ "level": 2931,
+ "leveled": 48453,
+ "levels": 6295,
+ "leven": 44792,
+ "leven": 34729,
+ "lever": 20178,
+ "lever": 23094,
+ "leverage": 24030,
+ "leveraging": 37948,
+ "levi": 25630,
+ "levi": 19113,
+ "leviathan": 41736,
+ "levin": 36949,
+ "levine": 26594,
+ "levit": 22715,
+ "levy": 17147,
+ "lew": 5063,
+ "lew": 25329,
+ "lewan": 48349,
+ "lewd": 45241,
+ "lewes": 40431,
+ "lewi": 19589,
+ "lewis": 22043,
+ "lewis": 6020,
+ "lewisham": 37385,
+ "lewisham": 47633,
+ "lewishamilton": 42960,
+ "lewood": 37951,
+ "lex": 6586,
+ "lex": 9658,
+ "lexa": 48259,
+ "lexi": 44231,
+ "lexi": 24679,
+ "lexington": 22308,
+ "lexus": 20694,
+ "ley": 2565,
+ "ley": 1066,
+ "leye": 37061,
+ "leys": 45609,
+ "leys": 14834,
+ "leyton": 46573,
+ "lez": 26442,
+ "lf": 33960,
+ "lf": 22078,
+ "lfc": 37826,
+ "lfc": 8267,
+ "lfw": 28514,
+ "lg": 4546,
+ "lg": 11368,
+ "lga": 39348,
+ "lgb": 25401,
+ "lgbt": 11743,
+ "lgbt": 9592,
+ "lgbti": 42730,
+ "lgbtq": 47625,
+ "lgbtq": 14939,
+ "lgm": 39389,
+ "lh": 27794,
+ "lh": 31159,
+ "lhp": 45092,
+ "lhs": 33170,
+ "li": 554,
+ "li": 4250,
+ "lia": 26118,
+ "lia": 6964,
+ "liability": 29139,
+ "liaison": 39294,
+ "liam": 5258,
+ "liam": 7167,
+ "lian": 18058,
+ "liance": 40864,
+ "liar": 16334,
+ "liars": 23863,
+ "lias": 46021,
+ "lib": 10249,
+ "lib": 13345,
+ "libby": 36832,
+ "libdems": 40869,
+ "liber": 3425,
+ "liberal": 48032,
+ "liberal": 9985,
+ "liberalism": 40018,
+ "liberals": 15981,
+ "liberated": 38690,
+ "liberation": 19507,
+ "liberia": 32208,
+ "libertarian": 35067,
+ "liberties": 48623,
+ "liberty": 23397,
+ "liberty": 8480,
+ "libr": 2856,
+ "libra": 43038,
+ "librarian": 25148,
+ "librarians": 37806,
+ "libraries": 14277,
+ "library": 25713,
+ "library": 3519,
+ "libre": 49210,
+ "libre": 31681,
+ "libs": 26401,
+ "liby": 36390,
+ "libya": 16417,
+ "libyan": 42319,
+ "lic": 2508,
+ "lic": 3376,
+ "lice": 45691,
+ "licen": 6706,
+ "licence": 20550,
+ "license": 10337,
+ "licensed": 18752,
+ "licenses": 36414,
+ "licensing": 24219,
+ "lich": 23979,
+ "lich": 25875,
+ "lick": 29197,
+ "lick": 17541,
+ "licking": 33013,
+ "licks": 42117,
+ "lics": 44552,
+ "lid": 39369,
+ "lid": 17678,
+ "lidge": 45558,
+ "lido": 35683,
+ "lids": 41609,
+ "lie": 6570,
+ "lie": 2538,
+ "lieb": 45387,
+ "liebe": 37749,
+ "lied": 6486,
+ "lief": 38428,
+ "lien": 45716,
+ "lier": 3626,
+ "liers": 19303,
+ "lies": 37236,
+ "lies": 3205,
+ "liest": 14020,
+ "liet": 41107,
+ "lieu": 20401,
+ "lieu": 35313,
+ "lieutenant": 22538,
+ "lif": 16456,
+ "life": 2666,
+ "life": 970,
+ "lifeat": 27801,
+ "lifeboat": 37404,
+ "lifecycle": 49171,
+ "lifein": 48447,
+ "lifeis": 24824,
+ "lifeisgood": 46433,
+ "lifel": 15025,
+ "lifeline": 38438,
+ "lifelong": 21358,
+ "lifeof": 36061,
+ "lifesaving": 48016,
+ "lifespan": 49257,
+ "lifestyle": 46512,
+ "lifestyle": 7037,
+ "lifestyles": 48521,
+ "lifetime": 48737,
+ "lifetime": 9107,
+ "liff": 34404,
+ "liffe": 38942,
+ "lift": 33146,
+ "lift": 6779,
+ "lifted": 16783,
+ "lifter": 38555,
+ "lifting": 10857,
+ "lifts": 18291,
+ "lig": 19915,
+ "lig": 38493,
+ "liga": 16802,
+ "ligam": 31077,
+ "ligament": 48705,
+ "ligan": 27962,
+ "ligans": 42133,
+ "ligh": 7510,
+ "light": 3885,
+ "light": 1395,
+ "lighted": 18404,
+ "lighten": 32717,
+ "lightening": 28170,
+ "lighter": 14102,
+ "lighthouse": 13717,
+ "lighting": 5799,
+ "lightly": 26878,
+ "lightning": 7756,
+ "lightroom": 41454,
+ "lights": 3073,
+ "lightweight": 16278,
+ "ligu": 42920,
+ "ligue": 29196,
+ "lik": 4831,
+ "lik": 18495,
+ "like": 9175,
+ "like": 789,
+ "liked": 7112,
+ "likefor": 48444,
+ "likeli": 40666,
+ "likelihood": 48158,
+ "likely": 5256,
+ "liken": 36084,
+ "likes": 4724,
+ "liking": 16810,
+ "lil": 6012,
+ "lil": 4461,
+ "lilac": 33647,
+ "lili": 26686,
+ "lili": 48411,
+ "lilies": 38110,
+ "lillard": 47016,
+ "lille": 38705,
+ "lilli": 40920,
+ "lillian": 41563,
+ "lilly": 47825,
+ "lilly": 21815,
+ "lily": 23803,
+ "lily": 10647,
+ "lim": 2377,
+ "lim": 17204,
+ "lima": 17589,
+ "limb": 27061,
+ "limb": 32363,
+ "limbo": 46179,
+ "limbs": 34886,
+ "lime": 17385,
+ "lime": 11193,
+ "limel": 48658,
+ "limer": 16915,
+ "limerick": 19501,
+ "limestone": 27272,
+ "limit": 18933,
+ "limit": 9973,
+ "limitations": 32730,
+ "limited": 49229,
+ "limited": 3472,
+ "limiting": 35812,
+ "limitless": 35833,
+ "limits": 11966,
+ "limo": 33166,
+ "limous": 47287,
+ "limpopo": 47175,
+ "lin": 1254,
+ "lin": 2424,
+ "lina": 26110,
+ "lincol": 6239,
+ "lincoln": 16957,
+ "lincoln": 7454,
+ "lincolnshire": 29014,
+ "lind": 6492,
+ "linda": 45410,
+ "linda": 10760,
+ "linden": 44076,
+ "linden": 34832,
+ "lindo": 38467,
+ "lindsay": 29846,
+ "lindsay": 16858,
+ "lindsey": 29475,
+ "lindsey": 18128,
+ "line": 3674,
+ "line": 1148,
+ "linear": 19816,
+ "linebacker": 29848,
+ "lined": 11842,
+ "lineman": 31501,
+ "linen": 20032,
+ "liner": 11618,
+ "liners": 24463,
+ "lines": 3418,
+ "liness": 28633,
+ "lineup": 7316,
+ "lineups": 33589,
+ "ling": 4851,
+ "ling": 1358,
+ "linger": 29593,
+ "lingerie": 18473,
+ "lingering": 46494,
+ "lings": 11390,
+ "lington": 27673,
+ "lington": 9002,
+ "lingu": 34449,
+ "lingui": 29942,
+ "linguistic": 46847,
+ "linguistics": 48651,
+ "lining": 11589,
+ "link": 18433,
+ "link": 2468,
+ "linke": 15088,
+ "linked": 11059,
+ "linkedin": 16302,
+ "linkin": 40287,
+ "linkin": 49291,
+ "linking": 23296,
+ "links": 8113,
+ "linn": 37431,
+ "lino": 41189,
+ "lino": 34995,
+ "lins": 6567,
+ "linson": 15401,
+ "linton": 36479,
+ "linus": 49303,
+ "linux": 14061,
+ "lio": 19395,
+ "lion": 8872,
+ "lion": 5567,
+ "lionel": 19441,
+ "lions": 7093,
+ "lip": 8630,
+ "lip": 8546,
+ "lipo": 38795,
+ "lipp": 38074,
+ "lips": 8847,
+ "lipse": 10351,
+ "lipstick": 15618,
+ "liqu": 6310,
+ "lique": 32680,
+ "liqueur": 43612,
+ "liqui": 33817,
+ "liquid": 18366,
+ "liquid": 10158,
+ "liquidity": 42812,
+ "liquor": 17828,
+ "lis": 7297,
+ "lis": 12749,
+ "lisa": 25236,
+ "lisa": 7424,
+ "lisam": 43072,
+ "lisboa": 40052,
+ "lisbon": 17708,
+ "lish": 12658,
+ "lish": 2354,
+ "lished": 22620,
+ "lisle": 21529,
+ "lism": 34390,
+ "liss": 45489,
+ "liss": 35433,
+ "lisse": 49309,
+ "list": 1734,
+ "list": 1998,
+ "lista": 37812,
+ "listed": 6457,
+ "listen": 17454,
+ "listen": 2672,
+ "listened": 15347,
+ "listener": 34819,
+ "listeners": 26901,
+ "listening": 3656,
+ "listens": 25912,
+ "lister": 45109,
+ "listing": 8145,
+ "listings": 21987,
+ "liston": 48041,
+ "lists": 12281,
+ "lit": 2213,
+ "lit": 4350,
+ "lita": 30100,
+ "lite": 29273,
+ "lite": 13694,
+ "litecoin": 39063,
+ "liter": 3085,
+ "liter": 34904,
+ "literacy": 12841,
+ "literal": 24269,
+ "literally": 4719,
+ "literary": 13586,
+ "literature": 11072,
+ "litfest": 40369,
+ "lith": 37005,
+ "lithium": 22794,
+ "litho": 31088,
+ "lithograph": 49022,
+ "lithu": 21045,
+ "lithuania": 27068,
+ "liti": 24292,
+ "litigation": 31769,
+ "lito": 47381,
+ "litre": 25786,
+ "litres": 39919,
+ "litt": 1216,
+ "litt": 47583,
+ "litter": 45431,
+ "litter": 17118,
+ "litters": 45300,
+ "little": 7024,
+ "little": 1274,
+ "littlemix": 29731,
+ "littlest": 48969,
+ "litur": 36830,
+ "litz": 30357,
+ "liu": 20466,
+ "liv": 13895,
+ "liv": 19901,
+ "livan": 12785,
+ "live": 3215,
+ "live": 1064,
+ "lived": 8867,
+ "livel": 17973,
+ "liveli": 26566,
+ "livelihood": 46497,
+ "livelihoods": 47716,
+ "lively": 19663,
+ "liveme": 35396,
+ "livemusic": 15688,
+ "liven": 41057,
+ "liveon": 22815,
+ "livepd": 38742,
+ "livepd": 31899,
+ "liver": 4755,
+ "liver": 12639,
+ "liverpool": 29778,
+ "liverpool": 5366,
+ "livery": 23248,
+ "lives": 3247,
+ "livesmatter": 20348,
+ "livestock": 22079,
+ "livestream": 16844,
+ "livetweet": 38546,
+ "livin": 28061,
+ "living": 10965,
+ "living": 2815,
+ "livingston": 30551,
+ "lix": 45068,
+ "liz": 8632,
+ "liz": 12242,
+ "liza": 28787,
+ "lizard": 17221,
+ "lizards": 41991,
+ "lizasober": 44487,
+ "lizasoberano": 45076,
+ "lizz": 34430,
+ "lizzie": 29530,
+ "lizzy": 32306,
+ "lj": 34211,
+ "lj": 32273,
+ "lju": 44562,
+ "lk": 39110,
+ "lk": 26596,
+ "lka": 21881,
+ "ll": 1657,
+ "ll": 865,
+ "lla": 15419,
+ "llama": 36679,
+ "llan": 17281,
+ "llan": 38728,
+ "lland": 31150,
+ "llc": 17161,
+ "lle": 26550,
+ "lle": 29732,
+ "llen": 41197,
+ "ller": 7722,
+ "llers": 26426,
+ "lli": 47015,
+ "lli": 13368,
+ "llis": 25518,
+ "lll": 27177,
+ "llll": 34874,
+ "llll": 43485,
+ "llo": 19293,
+ "lloy": 10092,
+ "lloyd": 33339,
+ "lloyd": 12400,
+ "llp": 28042,
+ "lls": 40535,
+ "lly": 26379,
+ "lm": 6981,
+ "lm": 15282,
+ "lma": 4493,
+ "lmao": 5121,
+ "lmaoo": 32623,
+ "lmaooo": 33362,
+ "lmaoooo": 45232,
+ "lmfa": 8928,
+ "lmfao": 11068,
+ "lmfaooo": 47658,
+ "lmp": 43575,
+ "lms": 30381,
+ "ln": 31644,
+ "ln": 18654,
+ "lng": 22339,
+ "lnp": 39679,
+ "lo": 549,
+ "lo": 2982,
+ "loa": 39678,
+ "load": 4515,
+ "load": 2834,
+ "loaded": 6756,
+ "loader": 28492,
+ "loading": 9975,
+ "loads": 8691,
+ "loaf": 26467,
+ "loaf": 18273,
+ "loan": 28431,
+ "loan": 8176,
+ "loans": 14206,
+ "lob": 11197,
+ "lob": 46606,
+ "lobal": 34574,
+ "lobb": 27698,
+ "lobby": 12449,
+ "lobbying": 36047,
+ "lobe": 46325,
+ "lobes": 24148,
+ "lobo": 39323,
+ "lobos": 36586,
+ "lobster": 13793,
+ "loc": 1378,
+ "loc": 25826,
+ "local": 9202,
+ "local": 2029,
+ "localized": 49399,
+ "locally": 15603,
+ "locals": 15041,
+ "locate": 20490,
+ "located": 5677,
+ "location": 4372,
+ "locations": 9580,
+ "loch": 20188,
+ "loch": 14101,
+ "lock": 7201,
+ "lock": 4381,
+ "lockdown": 35636,
+ "locke": 29698,
+ "locked": 8371,
+ "locker": 14053,
+ "lockhart": 48642,
+ "lockheed": 36637,
+ "locking": 19978,
+ "locks": 13212,
+ "lockscreen": 42439,
+ "loco": 25555,
+ "locom": 22798,
+ "locomo": 46147,
+ "locomotive": 30439,
+ "locu": 33635,
+ "locust": 46237,
+ "lod": 45650,
+ "lodge": 10504,
+ "loe": 30113,
+ "loe": 25484,
+ "loeb": 49334,
+ "lof": 15011,
+ "loff": 31008,
+ "loft": 35707,
+ "loft": 20049,
+ "loftus": 46689,
+ "log": 3239,
+ "log": 7383,
+ "logan": 20655,
+ "logan": 10569,
+ "logans": 40752,
+ "logg": 43002,
+ "logged": 31457,
+ "logger": 39089,
+ "logging": 24444,
+ "logi": 3177,
+ "logia": 48031,
+ "logic": 10670,
+ "logical": 4791,
+ "logically": 24782,
+ "logie": 33445,
+ "logies": 7378,
+ "login": 31121,
+ "logist": 7407,
+ "logistics": 14755,
+ "logists": 12233,
+ "logne": 19911,
+ "logo": 31480,
+ "logo": 5750,
+ "logos": 24879,
+ "logs": 22745,
+ "logue": 27785,
+ "logy": 22721,
+ "logy": 1659,
+ "loh": 49129,
+ "loh": 37983,
+ "loi": 35128,
+ "loid": 31408,
+ "loin": 21760,
+ "loire": 46040,
+ "lois": 27040,
+ "lok": 19908,
+ "lok": 23575,
+ "loki": 24435,
+ "lol": 10721,
+ "lol": 1824,
+ "lola": 19065,
+ "lolita": 42615,
+ "lolla": 45483,
+ "lolli": 27906,
+ "lollipop": 34605,
+ "lolly": 48264,
+ "lolo": 16895,
+ "lolo": 37481,
+ "lolol": 25280,
+ "lololol": 34738,
+ "lolz": 35260,
+ "lom": 9279,
+ "loma": 42889,
+ "lombar": 25493,
+ "lombard": 46461,
+ "lombardi": 44346,
+ "lomond": 48941,
+ "lon": 1235,
+ "lon": 6507,
+ "london": 6835,
+ "london": 1789,
+ "londonmarathon": 35018,
+ "lone": 22220,
+ "lone": 13576,
+ "lonel": 28872,
+ "loneliness": 30310,
+ "lonely": 34509,
+ "lonely": 12368,
+ "lonelyplanet": 44984,
+ "long": 4792,
+ "long": 1538,
+ "longe": 25793,
+ "longer": 5349,
+ "longest": 10731,
+ "longevity": 35354,
+ "longh": 20286,
+ "longhorn": 41047,
+ "longhorns": 38295,
+ "longing": 38482,
+ "longlive": 47840,
+ "longs": 43618,
+ "longtime": 19685,
+ "loo": 731,
+ "loo": 11804,
+ "look": 8874,
+ "look": 1012,
+ "lookalike": 38307,
+ "lookbook": 39184,
+ "looked": 4913,
+ "lookin": 11254,
+ "looking": 36898,
+ "looking": 1312,
+ "lookout": 18330,
+ "looks": 1606,
+ "lool": 33125,
+ "loom": 37440,
+ "loom": 17199,
+ "looming": 35384,
+ "looms": 30550,
+ "loon": 28222,
+ "loona": 48137,
+ "looney": 45315,
+ "looo": 20902,
+ "loool": 36016,
+ "looool": 47038,
+ "looooo": 31484,
+ "loop": 19606,
+ "loop": 10408,
+ "loops": 21625,
+ "loos": 45723,
+ "loose": 43815,
+ "loose": 9786,
+ "loot": 21518,
+ "lop": 36734,
+ "lop": 17066,
+ "lopes": 49269,
+ "lopez": 12982,
+ "lor": 2179,
+ "lor": 11335,
+ "lord": 18896,
+ "lord": 3486,
+ "lorde": 35483,
+ "lords": 14969,
+ "lore": 12880,
+ "lore": 27218,
+ "loren": 13602,
+ "loren": 33398,
+ "lorenzo": 21342,
+ "lores": 34510,
+ "loretta": 40863,
+ "lori": 20164,
+ "lori": 23095,
+ "lorna": 46316,
+ "lorraine": 27602,
+ "lorry": 31354,
+ "los": 32217,
+ "los": 3087,
+ "losange": 14037,
+ "losangeles": 14638,
+ "lose": 43318,
+ "lose": 5354,
+ "loser": 18168,
+ "losers": 23201,
+ "loses": 14263,
+ "losing": 7918,
+ "loss": 34761,
+ "loss": 4327,
+ "losses": 16909,
+ "lost": 14258,
+ "lost": 2624,
+ "lostdog": 48482,
+ "lot": 5132,
+ "lot": 1954,
+ "loth": 43625,
+ "lothian": 31360,
+ "lothing": 42058,
+ "lotion": 25260,
+ "lotr": 34165,
+ "lots": 2958,
+ "lott": 42854,
+ "lotta": 29125,
+ "lotte": 16535,
+ "lotte": 7274,
+ "lottery": 16975,
+ "lottie": 48517,
+ "lotto": 28265,
+ "lotus": 13824,
+ "lou": 2207,
+ "lou": 9745,
+ "loubout": 38369,
+ "loud": 22884,
+ "loud": 7464,
+ "louder": 25904,
+ "loudest": 49214,
+ "loudly": 39256,
+ "lough": 21927,
+ "lough": 28045,
+ "loughborough": 49153,
+ "loui": 42173,
+ "louie": 25790,
+ "louis": 8916,
+ "louis": 4459,
+ "louisa": 40011,
+ "louise": 32275,
+ "louise": 13076,
+ "louisi": 12187,
+ "louisiana": 12946,
+ "louisville": 13860,
+ "louisvuitton": 44911,
+ "loun": 6466,
+ "lounge": 7141,
+ "lounging": 45430,
+ "lour": 29383,
+ "lourdes": 45071,
+ "louvre": 36995,
+ "lov": 8923,
+ "lov": 21229,
+ "lova": 37394,
+ "lovable": 38565,
+ "lovato": 18960,
+ "love": 2618,
+ "love": 793,
+ "lovecraft": 42405,
+ "loved": 3249,
+ "lovefl": 38884,
+ "loveher": 38306,
+ "lovehim": 45733,
+ "loveis": 30931,
+ "loveisland": 30970,
+ "loveislove": 43603,
+ "loveit": 24764,
+ "lovel": 8999,
+ "lovelies": 31412,
+ "lovelondon": 46493,
+ "lovely": 33250,
+ "lovely": 2165,
+ "lovemy": 20041,
+ "lovemyjob": 40130,
+ "loven": 33754,
+ "lover": 28508,
+ "lover": 7168,
+ "lovers": 48416,
+ "lovers": 5973,
+ "loves": 37773,
+ "loves": 3925,
+ "lovethe": 33040,
+ "lovethem": 48298,
+ "lovett": 47095,
+ "lovewins": 47687,
+ "loveyou": 39226,
+ "loveyou": 25964,
+ "loveyour": 26462,
+ "lovin": 33442,
+ "lovin": 16354,
+ "loving": 29568,
+ "loving": 3721,
+ "lovingly": 44100,
+ "low": 1049,
+ "low": 1042,
+ "loway": 16104,
+ "lowe": 17910,
+ "lowed": 22733,
+ "lowell": 24458,
+ "lower": 32578,
+ "lower": 4909,
+ "lowered": 34968,
+ "lowering": 35261,
+ "lowers": 36398,
+ "lowes": 38515,
+ "lowest": 12098,
+ "lowing": 8283,
+ "lowkey": 29481,
+ "lowry": 27444,
+ "lows": 4406,
+ "lox": 41725,
+ "loy": 4519,
+ "loy": 23929,
+ "loyal": 13032,
+ "loyalty": 14686,
+ "loyd": 44212,
+ "loyed": 29279,
+ "loyment": 18307,
+ "loyola": 32569,
+ "lp": 22282,
+ "lp": 6392,
+ "lpc": 44092,
+ "lpg": 47905,
+ "lpga": 34295,
+ "lps": 32094,
+ "lr": 20572,
+ "lr": 7041,
+ "lrt": 32996,
+ "ls": 19051,
+ "ls": 1268,
+ "lsd": 43766,
+ "lse": 46127,
+ "lse": 43886,
+ "lsu": 35428,
+ "lsu": 15672,
+ "lt": 13642,
+ "lt": 3333,
+ "ltc": 27664,
+ "ltd": 6802,
+ "lte": 25202,
+ "lton": 14237,
+ "lu": 664,
+ "lu": 9657,
+ "lub": 22469,
+ "lub": 11836,
+ "lubbock": 37660,
+ "lubric": 40963,
+ "luc": 7013,
+ "luc": 28014,
+ "luca": 21053,
+ "lucas": 23425,
+ "lucas": 10225,
+ "lucci": 45849,
+ "luce": 46217,
+ "lucent": 41552,
+ "lucer": 36042,
+ "luch": 36646,
+ "lucha": 38449,
+ "luci": 8787,
+ "lucia": 22290,
+ "luciano": 46365,
+ "lucid": 44540,
+ "lucie": 39461,
+ "lucifer": 46224,
+ "lucifer": 27687,
+ "lucille": 47454,
+ "lucin": 27523,
+ "luck": 9647,
+ "luck": 2820,
+ "luckiest": 42469,
+ "luckily": 20100,
+ "lucknow": 29407,
+ "lucky": 20495,
+ "lucky": 4133,
+ "lucrative": 41485,
+ "lucy": 17262,
+ "lucy": 10120,
+ "lud": 14288,
+ "lude": 28755,
+ "ludo": 40141,
+ "ludwig": 30633,
+ "lue": 45199,
+ "luf": 25264,
+ "lufc": 17818,
+ "luffy": 39047,
+ "lufthan": 37769,
+ "lufthansa": 39145,
+ "lug": 45521,
+ "lugg": 19673,
+ "luggage": 20138,
+ "luhan": 20975,
+ "luigi": 28444,
+ "luis": 25231,
+ "luis": 11339,
+ "luiz": 39633,
+ "lujah": 31639,
+ "luk": 21652,
+ "luka": 34878,
+ "lukaku": 37177,
+ "lukas": 37941,
+ "luke": 11970,
+ "luke": 5652,
+ "lul": 20861,
+ "lulla": 37019,
+ "lullaby": 41676,
+ "lulu": 32052,
+ "lulu": 26935,
+ "lum": 18112,
+ "lum": 5997,
+ "lumb": 36231,
+ "lumber": 27421,
+ "lumber": 34692,
+ "lumi": 41437,
+ "lumia": 31912,
+ "lumin": 15867,
+ "luminous": 37913,
+ "lump": 38704,
+ "lumpur": 34411,
+ "lun": 3221,
+ "lun": 49390,
+ "luna": 14425,
+ "lunar": 16043,
+ "lunatic": 45874,
+ "lunch": 10954,
+ "lunch": 2772,
+ "luncheon": 15104,
+ "lunches": 29705,
+ "lunchtime": 14330,
+ "lund": 30975,
+ "lund": 20181,
+ "lunes": 35648,
+ "lung": 38479,
+ "lung": 16271,
+ "lungs": 27366,
+ "lup": 27413,
+ "lupita": 49352,
+ "lupus": 36017,
+ "lur": 14439,
+ "lure": 31376,
+ "lures": 46747,
+ "lurking": 29941,
+ "lus": 7158,
+ "lusci": 38004,
+ "luscious": 39935,
+ "lush": 40382,
+ "lush": 16263,
+ "lust": 42071,
+ "lust": 12662,
+ "lustre": 46673,
+ "luther": 21848,
+ "luther": 17208,
+ "lutheran": 27341,
+ "luton": 28288,
+ "luv": 24726,
+ "luv": 8502,
+ "lux": 3439,
+ "lux": 16704,
+ "luxe": 26373,
+ "luxemb": 21314,
+ "luxembour": 22712,
+ "luxembourg": 23949,
+ "luxu": 16112,
+ "luxurious": 17292,
+ "luxury": 12083,
+ "luxury": 5247,
+ "luxurytravel": 29010,
+ "luz": 41008,
+ "lv": 10862,
+ "lv": 11184,
+ "lvl": 31256,
+ "lw": 40515,
+ "lw": 35115,
+ "lx": 30789,
+ "ly": 1251,
+ "ly": 597,
+ "lydia": 24316,
+ "lyf": 43688,
+ "lyfe": 30787,
+ "lyft": 32944,
+ "lying": 7175,
+ "lyk": 46376,
+ "lyle": 36828,
+ "lym": 20087,
+ "lyme": 31167,
+ "lymph": 30073,
+ "lymphoma": 37648,
+ "lyn": 3957,
+ "lyn": 5054,
+ "lynch": 31586,
+ "lynch": 13560,
+ "lynd": 33416,
+ "lynda": 42959,
+ "lyndon": 48518,
+ "lynn": 25303,
+ "lynn": 10667,
+ "lynne": 26900,
+ "lynx": 28941,
+ "lyon": 17176,
+ "lyons": 29453,
+ "lyric": 24366,
+ "lyric": 21291,
+ "lyrical": 33358,
+ "lyricist": 49013,
+ "lyrics": 9551,
+ "lyrix": 46814,
+ "lys": 45054,
+ "lyte": 40059,
+ "lywood": 4012,
+ "lz": 30818,
+ "lé": 39641,
+ "m": 76,
+ "m": 332,
+ "ma": 577,
+ "ma": 1226,
+ "maa": 42774,
+ "maa": 21555,
+ "maan": 33668,
+ "maar": 48927,
+ "maas": 43332,
+ "mab": 35639,
+ "mabel": 47319,
+ "mable": 23001,
+ "mably": 40082,
+ "mabu": 44682,
+ "mac": 1961,
+ "mac": 4945,
+ "macar": 21558,
+ "macaroni": 41824,
+ "macarthur": 36785,
+ "macau": 43984,
+ "macau": 33370,
+ "macbeth": 36321,
+ "macbook": 20617,
+ "macdonald": 20315,
+ "mace": 44869,
+ "maced": 21102,
+ "macedonia": 27071,
+ "macfar": 45374,
+ "macfarlane": 48825,
+ "mach": 2637,
+ "mach": 35091,
+ "machado": 42318,
+ "mache": 43220,
+ "macher": 29330,
+ "machi": 41783,
+ "machin": 17972,
+ "machine": 11539,
+ "machine": 4169,
+ "machinelearning": 13621,
+ "machinery": 21858,
+ "machines": 11108,
+ "machining": 45562,
+ "macho": 43977,
+ "macht": 45225,
+ "macin": 36533,
+ "mack": 8590,
+ "mack": 12145,
+ "mackay": 32497,
+ "macken": 48057,
+ "mackenzie": 22351,
+ "mackerel": 35002,
+ "mackin": 26010,
+ "macklemore": 41758,
+ "macle": 33843,
+ "maclean": 47137,
+ "macleod": 43684,
+ "macmillan": 36364,
+ "macmillan": 35191,
+ "macon": 35818,
+ "macos": 45469,
+ "macqu": 38365,
+ "macquarie": 40858,
+ "macro": 20891,
+ "macro": 16626,
+ "macron": 24859,
+ "macs": 46548,
+ "macy": 17113,
+ "macys": 47652,
+ "mad": 2740,
+ "mad": 3843,
+ "mada": 37799,
+ "madagas": 24758,
+ "madagascar": 25744,
+ "madam": 33634,
+ "madam": 27538,
+ "madame": 23507,
+ "madd": 31717,
+ "madden": 19093,
+ "maddie": 39959,
+ "maddie": 18875,
+ "maddow": 32644,
+ "maddy": 31734,
+ "made": 5388,
+ "made": 1105,
+ "madein": 13670,
+ "madeira": 33810,
+ "madel": 34532,
+ "madele": 29831,
+ "madeleine": 33264,
+ "madeline": 33905,
+ "madewith": 28627,
+ "madewithunity": 43190,
+ "madhu": 23000,
+ "madhuri": 38346,
+ "madhuridixit": 43889,
+ "madhya": 48302,
+ "madi": 6527,
+ "madi": 27282,
+ "madison": 24798,
+ "madison": 8791,
+ "madmen": 45452,
+ "madness": 8755,
+ "madon": 44852,
+ "madonna": 14137,
+ "madra": 27416,
+ "madras": 42046,
+ "madre": 42130,
+ "madri": 5529,
+ "madrid": 5909,
+ "mads": 41201,
+ "madu": 34913,
+ "madurai": 49159,
+ "maduro": 32912,
+ "mae": 16898,
+ "mae": 17339,
+ "maer": 47088,
+ "maestro": 24140,
+ "mafi": 47164,
+ "mafia": 14890,
+ "mag": 1191,
+ "mag": 4508,
+ "maga": 8694,
+ "magaz": 2974,
+ "magazine": 3113,
+ "magazines": 22253,
+ "magdal": 29673,
+ "mage": 46568,
+ "mage": 10923,
+ "magee": 43872,
+ "magenta": 38091,
+ "magento": 42442,
+ "mages": 31059,
+ "maggi": 29611,
+ "maggie": 41443,
+ "maggie": 14524,
+ "maggio": 49087,
+ "magh": 45555,
+ "magi": 19270,
+ "magic": 13061,
+ "magic": 3778,
+ "magical": 36408,
+ "magical": 7823,
+ "magician": 26368,
+ "magin": 42678,
+ "maging": 41310,
+ "magn": 10290,
+ "magna": 34076,
+ "magne": 9921,
+ "magnesium": 36379,
+ "magnet": 18240,
+ "magnetic": 13838,
+ "magnets": 33030,
+ "magni": 24297,
+ "magnific": 9725,
+ "magnificent": 10724,
+ "magnitude": 22955,
+ "magno": 21184,
+ "magnolia": 27123,
+ "magnu": 45198,
+ "magnum": 23496,
+ "magnus": 26275,
+ "magpie": 45973,
+ "mags": 31021,
+ "maguire": 26470,
+ "mah": 7206,
+ "mah": 10801,
+ "maha": 12237,
+ "maha": 33983,
+ "mahal": 22301,
+ "mahan": 45191,
+ "mahar": 11635,
+ "maharaj": 38488,
+ "maharashtra": 19328,
+ "mahat": 32434,
+ "mahatma": 40530,
+ "mahe": 15756,
+ "maher": 29826,
+ "mahesh": 33448,
+ "mahesh": 22095,
+ "mahi": 32529,
+ "mahi": 38659,
+ "mahin": 24113,
+ "mahindra": 31285,
+ "mahmoud": 41361,
+ "mahog": 30804,
+ "mahogany": 33084,
+ "mahon": 45864,
+ "mahon": 20371,
+ "mahone": 26634,
+ "mai": 7138,
+ "mai": 14595,
+ "maia": 46585,
+ "maid": 23148,
+ "maid": 10226,
+ "maidan": 37346,
+ "maiden": 37011,
+ "maiden": 13809,
+ "maids": 27305,
+ "maidstone": 44395,
+ "mail": 10478,
+ "mail": 2614,
+ "mailbox": 31482,
+ "mailed": 42314,
+ "mailing": 26680,
+ "mailonline": 26021,
+ "mails": 45213,
+ "main": 3904,
+ "main": 2623,
+ "maine": 18639,
+ "maine": 7836,
+ "mained": 15609,
+ "mainedcm": 15845,
+ "mainland": 27629,
+ "mainly": 15280,
+ "mains": 33656,
+ "mainst": 42102,
+ "mainstream": 18034,
+ "maintain": 12954,
+ "maintained": 26665,
+ "maintaining": 21964,
+ "maintains": 38335,
+ "mainten": 9399,
+ "maintenance": 9610,
+ "mais": 28153,
+ "maisie": 47355,
+ "maison": 37065,
+ "maison": 27626,
+ "mait": 26387,
+ "maize": 35386,
+ "maj": 2948,
+ "maj": 28723,
+ "maja": 47498,
+ "maje": 9852,
+ "majestic": 15335,
+ "majesty": 21188,
+ "major": 8008,
+ "major": 3350,
+ "majority": 10508,
+ "majors": 23597,
+ "mak": 11271,
+ "mak": 19253,
+ "makar": 42242,
+ "makati": 39402,
+ "make": 3232,
+ "make": 1078,
+ "makeaw": 45859,
+ "makeinindia": 42739,
+ "makeit": 26308,
+ "maken": 47093,
+ "makeover": 17926,
+ "maker": 15196,
+ "maker": 4836,
+ "makers": 6577,
+ "makerspace": 42400,
+ "makes": 2088,
+ "makeshift": 43274,
+ "makeu": 41707,
+ "makeup": 26402,
+ "makeup": 5853,
+ "makeyourown": 34090,
+ "makeyourownlane": 34823,
+ "maki": 34514,
+ "makin": 43096,
+ "makin": 22407,
+ "making": 17976,
+ "making": 1665,
+ "makk": 39852,
+ "maknae": 44118,
+ "mako": 49061,
+ "mal": 1662,
+ "mal": 3796,
+ "mala": 28290,
+ "malade": 36928,
+ "malaga": 35395,
+ "malala": 41137,
+ "malam": 48956,
+ "malaria": 24929,
+ "malawi": 23405,
+ "malay": 5323,
+ "malay": 42430,
+ "malayalam": 34860,
+ "malaysi": 39668,
+ "malaysia": 8146,
+ "malaysian": 21136,
+ "malbec": 47741,
+ "malcol": 12645,
+ "malcolm": 14139,
+ "maldives": 16795,
+ "male": 11326,
+ "male": 2801,
+ "males": 14426,
+ "malhotra": 28866,
+ "mali": 6701,
+ "mali": 22669,
+ "malia": 46714,
+ "malibu": 21723,
+ "malicious": 42147,
+ "malign": 41122,
+ "malik": 11394,
+ "mall": 10984,
+ "mall": 6220,
+ "mallorca": 28082,
+ "mallory": 38968,
+ "malls": 36447,
+ "malm": 44071,
+ "malnutrition": 41153,
+ "malo": 43518,
+ "malone": 19852,
+ "maloney": 45897,
+ "mals": 25370,
+ "malt": 21688,
+ "malta": 16989,
+ "maltese": 39838,
+ "malvern": 39356,
+ "malware": 24153,
+ "mam": 4404,
+ "mam": 17778,
+ "mama": 7133,
+ "mamamoo": 36012,
+ "mamas": 42395,
+ "mamba": 44189,
+ "mament": 45690,
+ "mami": 43858,
+ "mamma": 34893,
+ "mammal": 33385,
+ "mammals": 31987,
+ "mammoth": 28022,
+ "man": 723,
+ "man": 786,
+ "mana": 29467,
+ "mana": 15837,
+ "manafort": 40108,
+ "manag": 1830,
+ "manage": 9770,
+ "managed": 7928,
+ "management": 3319,
+ "manager": 3898,
+ "managerial": 44261,
+ "managers": 12853,
+ "manages": 29699,
+ "managing": 10892,
+ "manas": 44188,
+ "manatee": 46558,
+ "mance": 2324,
+ "manchester": 24424,
+ "manchester": 4651,
+ "mancini": 47681,
+ "mancity": 31538,
+ "mancrush": 36945,
+ "mancrushmonday": 39307,
+ "mand": 4325,
+ "mand": 27244,
+ "mandala": 41106,
+ "mandarin": 26455,
+ "mandate": 26228,
+ "mandatory": 19934,
+ "mandel": 34960,
+ "mandela": 16280,
+ "mandi": 38961,
+ "mandir": 35815,
+ "mando": 34006,
+ "mands": 12340,
+ "mandu": 31440,
+ "mandy": 41505,
+ "mandy": 24302,
+ "mane": 44471,
+ "mane": 16044,
+ "maneu": 33216,
+ "mang": 25616,
+ "mang": 31096,
+ "manga": 11873,
+ "mangal": 43027,
+ "manger": 48251,
+ "mango": 43831,
+ "mango": 13962,
+ "mangrove": 47180,
+ "manhatt": 10152,
+ "manhattan": 10961,
+ "mani": 5654,
+ "mani": 10718,
+ "mania": 8435,
+ "maniac": 31814,
+ "maniacs": 41444,
+ "manian": 40077,
+ "manic": 23017,
+ "manic": 37825,
+ "manicure": 33637,
+ "manife": 14379,
+ "manifest": 34422,
+ "manifestation": 48348,
+ "manifesto": 20907,
+ "manil": 38827,
+ "manila": 10969,
+ "manipu": 40261,
+ "manipul": 19237,
+ "manipulation": 30277,
+ "manipur": 47757,
+ "manish": 41759,
+ "manish": 44720,
+ "manit": 15693,
+ "manitoba": 20342,
+ "manjaro": 41489,
+ "mankind": 24155,
+ "manly": 25194,
+ "mann": 19396,
+ "mann": 4783,
+ "manne": 30160,
+ "manned": 26139,
+ "mannequin": 43388,
+ "manner": 20700,
+ "manners": 31693,
+ "manning": 15996,
+ "manny": 37054,
+ "manny": 20933,
+ "mano": 15753,
+ "mano": 24016,
+ "manoj": 41146,
+ "manor": 41830,
+ "manor": 13614,
+ "mans": 28422,
+ "mans": 7746,
+ "mansfield": 25543,
+ "manship": 15460,
+ "mansion": 13404,
+ "manslaughter": 48632,
+ "manson": 26715,
+ "mant": 25122,
+ "mant": 27037,
+ "manta": 41431,
+ "mantis": 39946,
+ "mantle": 22159,
+ "mantra": 25162,
+ "manu": 3404,
+ "manu": 25799,
+ "manual": 12268,
+ "manuel": 29171,
+ "manuel": 9567,
+ "manufac": 5105,
+ "manufacture": 27741,
+ "manufactured": 24010,
+ "manufacturer": 15668,
+ "manufacturers": 18763,
+ "manufacturing": 8386,
+ "manure": 47907,
+ "manus": 28181,
+ "manuscript": 24365,
+ "manuscripts": 40765,
+ "manutd": 20994,
+ "many": 28484,
+ "many": 1346,
+ "manziel": 40637,
+ "mao": 47447,
+ "mao": 25605,
+ "maori": 43400,
+ "map": 25180,
+ "map": 3923,
+ "maple": 21980,
+ "maple": 10570,
+ "mapleleafs": 41257,
+ "mapoli": 28768,
+ "mapp": 36894,
+ "mapped": 41596,
+ "mapping": 15231,
+ "maps": 8765,
+ "mapu": 42082,
+ "mar": 675,
+ "mar": 3091,
+ "mara": 15655,
+ "marais": 47913,
+ "maran": 44732,
+ "marath": 16274,
+ "marathi": 34102,
+ "marathon": 40764,
+ "marathon": 5910,
+ "marau": 38475,
+ "marbella": 36182,
+ "marble": 45429,
+ "marble": 13071,
+ "marbles": 42931,
+ "marc": 14054,
+ "marc": 9075,
+ "marca": 38242,
+ "marcel": 17726,
+ "marcel": 24652,
+ "marcelo": 35939,
+ "march": 10638,
+ "march": 2227,
+ "marche": 36173,
+ "marched": 37976,
+ "marches": 38249,
+ "marchfor": 31721,
+ "marching": 15082,
+ "marchmadness": 28555,
+ "marci": 36698,
+ "marcia": 41075,
+ "marck": 47733,
+ "marco": 24719,
+ "marco": 10924,
+ "marcor": 39945,
+ "marcorubio": 41143,
+ "marcos": 21696,
+ "marcu": 20760,
+ "marcus": 48955,
+ "marcus": 9895,
+ "mardi": 39728,
+ "mardi": 29229,
+ "mardigras": 43343,
+ "mare": 26512,
+ "mare": 8870,
+ "mares": 19724,
+ "marg": 44014,
+ "margar": 16838,
+ "margare": 10232,
+ "margaret": 12185,
+ "margarita": 25958,
+ "margaritas": 42679,
+ "margate": 37428,
+ "margin": 19464,
+ "margin": 21357,
+ "marginal": 38320,
+ "margins": 33763,
+ "margot": 37144,
+ "mari": 2603,
+ "mari": 19322,
+ "maria": 41109,
+ "maria": 6595,
+ "mariachi": 44299,
+ "mariah": 31214,
+ "mariah": 24789,
+ "mariahcarey": 36538,
+ "marian": 41129,
+ "marian": 24677,
+ "mariana": 44224,
+ "marianne": 32214,
+ "mariano": 43988,
+ "marie": 20657,
+ "marie": 7864,
+ "marietta": 46634,
+ "marig": 41002,
+ "marijuana": 9864,
+ "maril": 14611,
+ "marilyn": 38959,
+ "marilyn": 18489,
+ "marin": 8910,
+ "marin": 23992,
+ "marina": 12060,
+ "marinated": 33406,
+ "marine": 20674,
+ "marine": 5746,
+ "mariner": 39972,
+ "mariners": 19086,
+ "marines": 15018,
+ "marino": 30878,
+ "mario": 39176,
+ "mario": 7600,
+ "marion": 37765,
+ "marion": 18397,
+ "maris": 21512,
+ "maris": 33093,
+ "marisa": 42938,
+ "mariska": 44703,
+ "marissa": 31219,
+ "marist": 48223,
+ "mariti": 13124,
+ "maritime": 14331,
+ "marj": 38639,
+ "mark": 3805,
+ "mark": 2110,
+ "marke": 2399,
+ "marked": 12360,
+ "marker": 18170,
+ "markers": 23664,
+ "market": 11614,
+ "market": 2196,
+ "marketer": 33482,
+ "marketers": 23682,
+ "marketing": 19535,
+ "marketing": 2905,
+ "marketplace": 18241,
+ "markets": 7292,
+ "markham": 39817,
+ "marking": 14705,
+ "markings": 41046,
+ "markle": 32672,
+ "marko": 38338,
+ "marks": 5466,
+ "markus": 33725,
+ "marl": 24922,
+ "marlborough": 43515,
+ "marlene": 45117,
+ "marley": 16504,
+ "marlin": 34275,
+ "marlins": 23309,
+ "marlon": 32995,
+ "marmalade": 39068,
+ "marnock": 48305,
+ "maro": 27029,
+ "maroon": 20501,
+ "marqu": 20704,
+ "marque": 13012,
+ "marquee": 27725,
+ "marquette": 37624,
+ "marquez": 27317,
+ "marquis": 33530,
+ "marr": 32871,
+ "marrake": 37125,
+ "marrakech": 39006,
+ "marri": 3839,
+ "marriage": 38047,
+ "marriage": 7040,
+ "marriages": 38190,
+ "married": 6791,
+ "marries": 46283,
+ "marriott": 19211,
+ "marrow": 31030,
+ "marry": 13288,
+ "marrying": 40507,
+ "mars": 41469,
+ "mars": 7496,
+ "marsden": 43344,
+ "marse": 26577,
+ "marseille": 30365,
+ "marsh": 9237,
+ "marsh": 13505,
+ "marsha": 21491,
+ "marshal": 26608,
+ "marshall": 30939,
+ "marshall": 9811,
+ "marshals": 44175,
+ "marshes": 43450,
+ "marshmal": 21069,
+ "marshmallow": 28530,
+ "marshmallows": 39471,
+ "mart": 2348,
+ "mart": 7772,
+ "marta": 32858,
+ "martens": 43211,
+ "marth": 34493,
+ "martha": 16427,
+ "marti": 20577,
+ "martial": 17088,
+ "martialarts": 35895,
+ "martian": 30214,
+ "martin": 6929,
+ "martin": 3690,
+ "martina": 34393,
+ "martinez": 13913,
+ "marting": 47570,
+ "martini": 22199,
+ "martino": 41675,
+ "martins": 30569,
+ "marty": 9926,
+ "marty": 17169,
+ "martyn": 44075,
+ "martyr": 36155,
+ "martyr": 26067,
+ "martyrdom": 43110,
+ "martyred": 39114,
+ "martyrs": 24707,
+ "maru": 37413,
+ "maru": 31838,
+ "marvel": 13835,
+ "marvel": 5996,
+ "marvelcomics": 46897,
+ "marvell": 26576,
+ "marvellous": 28402,
+ "marvelous": 25487,
+ "marvin": 19675,
+ "marx": 30559,
+ "marx": 26001,
+ "marxist": 45205,
+ "mary": 5146,
+ "mary": 2676,
+ "maryam": 33636,
+ "maryam": 36393,
+ "maryland": 11379,
+ "marys": 40905,
+ "marys": 40228,
+ "mas": 5226,
+ "mas": 1412,
+ "masa": 24995,
+ "masa": 41868,
+ "masala": 31483,
+ "masc": 23564,
+ "mascar": 46984,
+ "mascara": 31635,
+ "mascot": 13983,
+ "mascots": 43266,
+ "mascul": 25589,
+ "masculine": 48269,
+ "masculinity": 40465,
+ "mase": 49128,
+ "maser": 25798,
+ "maserati": 30442,
+ "mash": 12317,
+ "mash": 15680,
+ "mashable": 41026,
+ "mashed": 27395,
+ "mashup": 27079,
+ "masi": 35965,
+ "masjid": 31420,
+ "mask": 19262,
+ "mask": 8306,
+ "masked": 25757,
+ "masking": 47046,
+ "masks": 19055,
+ "maslow": 44359,
+ "mason": 17424,
+ "mason": 9699,
+ "masonic": 36491,
+ "masonry": 30764,
+ "masons": 37195,
+ "masqu": 26593,
+ "masquer": 29604,
+ "masquerade": 36944,
+ "mass": 4636,
+ "mass": 4854,
+ "massach": 14484,
+ "massachuse": 14577,
+ "massachusetts": 14756,
+ "massacre": 14696,
+ "massage": 13055,
+ "masse": 41735,
+ "masses": 22978,
+ "massey": 29868,
+ "massi": 17239,
+ "massimo": 45821,
+ "massive": 4818,
+ "massively": 34297,
+ "mast": 45916,
+ "mast": 27920,
+ "master": 4534,
+ "master": 3498,
+ "mastercard": 40542,
+ "masterchef": 34809,
+ "masterclass": 17529,
+ "mastered": 32616,
+ "masterful": 46823,
+ "mastering": 28326,
+ "mastermind": 34029,
+ "masterpiece": 12066,
+ "masterpieces": 37596,
+ "masters": 6913,
+ "mastery": 34800,
+ "mastiff": 42311,
+ "maswar": 47887,
+ "mat": 905,
+ "mat": 9063,
+ "mata": 17270,
+ "match": 7733,
+ "match": 2439,
+ "matcha": 32433,
+ "matchday": 15947,
+ "matched": 17792,
+ "matches": 8609,
+ "matching": 11840,
+ "matchup": 19355,
+ "matchups": 49162,
+ "mate": 6137,
+ "mate": 2936,
+ "mated": 33813,
+ "mateo": 34991,
+ "mater": 23724,
+ "materi": 7084,
+ "material": 7118,
+ "materials": 8161,
+ "maternal": 26131,
+ "maternity": 23894,
+ "mates": 5817,
+ "math": 13277,
+ "math": 6025,
+ "mathe": 8725,
+ "mathemat": 11901,
+ "mathematical": 25609,
+ "mathematician": 41036,
+ "mathematics": 20113,
+ "mathew": 36333,
+ "mathews": 37120,
+ "mathi": 23014,
+ "mathieu": 40417,
+ "maths": 14763,
+ "mati": 12716,
+ "mati": 32268,
+ "matic": 36859,
+ "matic": 7900,
+ "matically": 38282,
+ "matics": 23634,
+ "matil": 26751,
+ "matilda": 36308,
+ "matin": 44849,
+ "matinee": 38525,
+ "mating": 34346,
+ "mation": 11701,
+ "matisse": 43446,
+ "mato": 13127,
+ "matologist": 48842,
+ "matology": 27940,
+ "matory": 25519,
+ "matri": 27041,
+ "matrix": 18078,
+ "mats": 22259,
+ "matsu": 30242,
+ "matt": 7972,
+ "matt": 3972,
+ "mattb": 42791,
+ "matte": 31237,
+ "matte": 19771,
+ "mattel": 35365,
+ "matteo": 33120,
+ "matter": 30471,
+ "matter": 3828,
+ "matters": 5708,
+ "matth": 41846,
+ "matthe": 5116,
+ "matthew": 17588,
+ "matthew": 7008,
+ "matthews": 16739,
+ "matthi": 29853,
+ "matthias": 45104,
+ "matti": 39840,
+ "mattress": 23438,
+ "matty": 31233,
+ "matty": 29176,
+ "matu": 40616,
+ "matur": 22897,
+ "mature": 14417,
+ "maturity": 28047,
+ "mau": 8134,
+ "mau": 23033,
+ "maui": 20463,
+ "maul": 30725,
+ "maur": 10574,
+ "maure": 25191,
+ "maureen": 31723,
+ "maurice": 20200,
+ "mauricio": 39066,
+ "mauriti": 28406,
+ "mauritius": 29305,
+ "mauro": 41691,
+ "mav": 25697,
+ "maver": 16700,
+ "maverick": 27425,
+ "mavericks": 30092,
+ "mavs": 30665,
+ "maw": 39351,
+ "maw": 42271,
+ "mawards": 37682,
+ "max": 4898,
+ "max": 3902,
+ "maxi": 8554,
+ "maxi": 23266,
+ "maxim": 19892,
+ "maxim": 38574,
+ "maximize": 28673,
+ "maximum": 13162,
+ "maximus": 44312,
+ "maxine": 38468,
+ "maxwell": 19611,
+ "maxx": 37466,
+ "may": 1686,
+ "may": 1270,
+ "maya": 45783,
+ "maya": 12987,
+ "mayan": 37952,
+ "maybe": 3746,
+ "mayday": 29957,
+ "mayer": 21196,
+ "mayfair": 35171,
+ "mayfield": 33933,
+ "mayhem": 21502,
+ "maymay": 26600,
+ "maymay": 33853,
+ "maymayentrata": 30480,
+ "maynard": 32487,
+ "mayne": 35771,
+ "mayo": 22449,
+ "mayo": 11280,
+ "mayor": 15429,
+ "mayor": 4676,
+ "mayoral": 28983,
+ "mayorof": 43533,
+ "mayors": 28501,
+ "mays": 35445,
+ "maythe": 42281,
+ "mayward": 45751,
+ "mayward": 23519,
+ "mayweather": 22774,
+ "maz": 9177,
+ "maz": 36215,
+ "mazda": 18506,
+ "maze": 21988,
+ "mazz": 29439,
+ "mañ": 37059,
+ "mañana": 39354,
+ "mb": 758,
+ "mb": 3996,
+ "mba": 8329,
+ "mban": 46685,
+ "mbar": 44452,
+ "mbb": 10736,
+ "mbc": 20137,
+ "mbe": 38395,
+ "mbe": 27004,
+ "mber": 5467,
+ "mber": 1034,
+ "mberg": 26372,
+ "mbers": 5443,
+ "mbi": 45347,
+ "mble": 20310,
+ "mble": 4756,
+ "mbles": 28693,
+ "mbling": 28604,
+ "mbo": 25733,
+ "mbo": 11319,
+ "mbps": 44896,
+ "mbs": 10370,
+ "mbta": 38979,
+ "mbu": 42228,
+ "mbuhari": 36752,
+ "mc": 1278,
+ "mc": 4126,
+ "mca": 40570,
+ "mca": 14635,
+ "mcal": 28663,
+ "mcar": 43776,
+ "mcbride": 35080,
+ "mcc": 21192,
+ "mccabe": 37628,
+ "mccaf": 47385,
+ "mccain": 20397,
+ "mccall": 34844,
+ "mccann": 27140,
+ "mccar": 9570,
+ "mccarthy": 16974,
+ "mccartney": 19958,
+ "mccl": 24709,
+ "mccla": 43672,
+ "mccle": 40139,
+ "mcclure": 44945,
+ "mcco": 46152,
+ "mccon": 32638,
+ "mccor": 23057,
+ "mccormack": 45164,
+ "mccormick": 39088,
+ "mccoy": 20218,
+ "mccr": 41996,
+ "mccre": 25393,
+ "mccul": 38833,
+ "mccull": 41782,
+ "mcd": 28930,
+ "mcder": 27355,
+ "mcdermott": 34504,
+ "mcdon": 12171,
+ "mcdonald": 10741,
+ "mcdonalds": 17674,
+ "mcdonnell": 34360,
+ "mcdowell": 34119,
+ "mce": 26864,
+ "mcel": 28752,
+ "mcen": 47423,
+ "mcfad": 36976,
+ "mcfadden": 42105,
+ "mcfar": 29020,
+ "mcfarlane": 47174,
+ "mcfc": 16416,
+ "mcfly": 38211,
+ "mcg": 42507,
+ "mcg": 27995,
+ "mcgee": 29223,
+ "mcgill": 46524,
+ "mcgill": 35511,
+ "mcgin": 29596,
+ "mcgowan": 40462,
+ "mcgr": 25169,
+ "mcgra": 29367,
+ "mcgrath": 28759,
+ "mcgraw": 40950,
+ "mcgregor": 19642,
+ "mcgu": 34294,
+ "mcguinness": 45299,
+ "mcguire": 32635,
+ "mci": 46212,
+ "mci": 45491,
+ "mcil": 30481,
+ "mcin": 18770,
+ "mcintosh": 45353,
+ "mcintyre": 33369,
+ "mck": 6781,
+ "mckay": 33611,
+ "mcke": 27424,
+ "mckee": 43529,
+ "mcken": 42619,
+ "mckenna": 24924,
+ "mckenzie": 25502,
+ "mckin": 15437,
+ "mckinley": 39891,
+ "mckinney": 33554,
+ "mckinnon": 48736,
+ "mckinsey": 48143,
+ "mcl": 49021,
+ "mcla": 12565,
+ "mclaren": 37381,
+ "mclaren": 16789,
+ "mclau": 32285,
+ "mclaughlin": 35346,
+ "mcle": 25299,
+ "mclean": 28666,
+ "mcleod": 40259,
+ "mcm": 12251,
+ "mcmahon": 24026,
+ "mcmaster": 42703,
+ "mcmillan": 45603,
+ "mcn": 42919,
+ "mcnam": 32682,
+ "mcnamara": 37506,
+ "mcne": 42545,
+ "mco": 33723,
+ "mcqueen": 22544,
+ "mcr": 29884,
+ "mcr": 16966,
+ "mcs": 27020,
+ "mcu": 30403,
+ "md": 8637,
+ "md": 4732,
+ "mdc": 38773,
+ "mdc": 41761,
+ "mds": 48746,
+ "mdt": 40822,
+ "me": 613,
+ "me": 614,
+ "mea": 46045,
+ "mea": 17711,
+ "mead": 12134,
+ "mead": 21567,
+ "meade": 37218,
+ "meado": 16402,
+ "meadow": 25213,
+ "meadow": 17195,
+ "meadows": 17178,
+ "meal": 29662,
+ "meal": 5478,
+ "meals": 11229,
+ "mean": 4189,
+ "mean": 3450,
+ "meand": 48015,
+ "meaning": 14586,
+ "meaning": 8342,
+ "meaningful": 17480,
+ "meaningless": 48932,
+ "meanings": 45814,
+ "means": 3494,
+ "meant": 8674,
+ "meantime": 27499,
+ "meanwhile": 9650,
+ "meas": 5867,
+ "measles": 38230,
+ "measurable": 48010,
+ "measure": 15261,
+ "measure": 10579,
+ "measured": 23154,
+ "measurement": 20973,
+ "measurements": 29894,
+ "measures": 11936,
+ "measuring": 18064,
+ "meat": 10805,
+ "meat": 6480,
+ "meatball": 43642,
+ "meatballs": 29233,
+ "meath": 37920,
+ "meatless": 48085,
+ "meats": 29558,
+ "mec": 27432,
+ "mecca": 36095,
+ "mech": 38305,
+ "mechan": 6715,
+ "mechanic": 24582,
+ "mechanical": 14467,
+ "mechanics": 20536,
+ "mechanism": 22576,
+ "mechanisms": 28610,
+ "meck": 41908,
+ "med": 1948,
+ "med": 2177,
+ "meda": 33614,
+ "medal": 29714,
+ "medal": 6974,
+ "medalist": 21040,
+ "medalists": 43397,
+ "medalli": 31349,
+ "medallion": 43469,
+ "medallist": 41472,
+ "medals": 14710,
+ "mede": 48225,
+ "meded": 27627,
+ "medi": 1436,
+ "media": 22064,
+ "media": 1895,
+ "mediac": 37490,
+ "median": 30491,
+ "mediation": 42829,
+ "medic": 3602,
+ "medic": 35441,
+ "medicaid": 25421,
+ "medical": 18432,
+ "medical": 4116,
+ "medicare": 23710,
+ "medication": 23771,
+ "medications": 37181,
+ "medicinal": 28772,
+ "medicine": 5616,
+ "medicines": 26541,
+ "medics": 46688,
+ "medieval": 38956,
+ "medieval": 10789,
+ "medina": 27281,
+ "mediocre": 41170,
+ "medit": 19130,
+ "meditate": 38039,
+ "meditation": 10827,
+ "mediter": 14194,
+ "mediterran": 14358,
+ "mediterranean": 15327,
+ "medium": 8675,
+ "medley": 24793,
+ "meds": 25075,
+ "medtech": 42044,
+ "medusa": 44216,
+ "medway": 42286,
+ "mee": 1725,
+ "mee": 14075,
+ "meek": 28935,
+ "meen": 37940,
+ "meen": 46515,
+ "meer": 26714,
+ "meer": 27555,
+ "meet": 5714,
+ "meet": 1633,
+ "meeting": 48566,
+ "meeting": 2071,
+ "meetings": 9980,
+ "meets": 5972,
+ "meetthe": 27575,
+ "meetup": 15430,
+ "meg": 11500,
+ "meg": 16186,
+ "mega": 15979,
+ "mega": 9068,
+ "megab": 38103,
+ "megadeth": 46741,
+ "megal": 37650,
+ "megam": 26073,
+ "megan": 19127,
+ "megan": 11503,
+ "megap": 33624,
+ "megat": 35581,
+ "megh": 31192,
+ "meghan": 39939,
+ "meghan": 18261,
+ "meh": 10512,
+ "meh": 22211,
+ "mehta": 25031,
+ "mei": 22564,
+ "mei": 25198,
+ "meier": 29812,
+ "mein": 28857,
+ "mein": 21466,
+ "meister": 28407,
+ "mek": 44645,
+ "mel": 1902,
+ "mel": 6834,
+ "mela": 35032,
+ "melan": 22261,
+ "melanch": 44818,
+ "melancholy": 47821,
+ "melani": 34031,
+ "melania": 32796,
+ "melanie": 22153,
+ "melanoma": 40862,
+ "melb": 47007,
+ "melb": 28980,
+ "melbourne": 28387,
+ "melbourne": 6995,
+ "melee": 45108,
+ "meli": 28885,
+ "melinda": 46303,
+ "melis": 18913,
+ "melissa": 41866,
+ "melissa": 13030,
+ "mell": 22531,
+ "mell": 41583,
+ "mello": 47594,
+ "mellon": 45162,
+ "mellow": 32034,
+ "melo": 10354,
+ "melo": 22374,
+ "melodic": 41877,
+ "melodies": 38412,
+ "melody": 19119,
+ "melon": 12146,
+ "melrose": 36296,
+ "melt": 22209,
+ "melt": 15957,
+ "meltdown": 30613,
+ "melted": 23037,
+ "melting": 19247,
+ "melton": 46062,
+ "melts": 31446,
+ "melville": 46030,
+ "melvin": 31544,
+ "mely": 6373,
+ "mem": 4937,
+ "mem": 34944,
+ "memb": 2114,
+ "member": 29566,
+ "member": 1640,
+ "members": 2567,
+ "membership": 11562,
+ "membrane": 34088,
+ "meme": 35157,
+ "meme": 9169,
+ "memes": 12828,
+ "memo": 15967,
+ "memo": 19334,
+ "memoir": 20532,
+ "memoirs": 45311,
+ "memor": 1858,
+ "memorab": 26271,
+ "memorabilia": 27488,
+ "memorable": 13172,
+ "memorial": 16285,
+ "memorial": 4642,
+ "memorialday": 21598,
+ "memoriam": 48191,
+ "memories": 4304,
+ "memory": 44766,
+ "memory": 5137,
+ "memph": 10285,
+ "memphis": 38432,
+ "memphis": 11298,
+ "men": 1552,
+ "men": 1656,
+ "mena": 23052,
+ "menace": 29949,
+ "mend": 8151,
+ "mend": 46927,
+ "mendel": 49268,
+ "mendes": 18060,
+ "mendez": 48275,
+ "mendo": 19327,
+ "mendoza": 23680,
+ "meng": 37102,
+ "meng": 37450,
+ "mening": 46428,
+ "menon": 38255,
+ "menopau": 34974,
+ "menopause": 46026,
+ "mens": 16924,
+ "mens": 10495,
+ "mensfashion": 27578,
+ "menstru": 28345,
+ "menstrual": 40915,
+ "menswear": 18803,
+ "ment": 1585,
+ "ment": 777,
+ "mental": 8611,
+ "mental": 3448,
+ "mentalhealth": 20593,
+ "mentalhealth": 13022,
+ "mentality": 26647,
+ "mentally": 14307,
+ "mentary": 4468,
+ "mentation": 9512,
+ "mentday": 40397,
+ "mente": 40302,
+ "mente": 36396,
+ "mented": 9249,
+ "menting": 14471,
+ "mention": 43881,
+ "mention": 6762,
+ "mentioned": 11948,
+ "mentioning": 34290,
+ "mentions": 12334,
+ "mento": 30582,
+ "mentor": 45342,
+ "mentor": 11642,
+ "mentoring": 19610,
+ "mentors": 20945,
+ "mentorship": 33878,
+ "ments": 1827,
+ "menu": 6225,
+ "menus": 33534,
+ "meo": 30792,
+ "meow": 39965,
+ "meow": 17246,
+ "mep": 27095,
+ "mer": 1316,
+ "mer": 2452,
+ "mera": 20028,
+ "merc": 34357,
+ "merc": 44399,
+ "mercado": 45479,
+ "merce": 8409,
+ "mercede": 34959,
+ "mercedes": 26403,
+ "mercedes": 10685,
+ "mercedesam": 40107,
+ "mercedesbenz": 32347,
+ "mercen": 40301,
+ "mercer": 21632,
+ "merch": 11504,
+ "merchandi": 14954,
+ "merchandise": 16808,
+ "merchandising": 49196,
+ "merchant": 19563,
+ "merchants": 34427,
+ "merci": 23364,
+ "merci": 29378,
+ "mercur": 11471,
+ "mercury": 45203,
+ "mercury": 12653,
+ "mercy": 33249,
+ "mercy": 10815,
+ "mere": 29657,
+ "mere": 10342,
+ "mered": 24657,
+ "mered": 32297,
+ "meredith": 25103,
+ "merely": 28718,
+ "merge": 30406,
+ "merged": 46492,
+ "merger": 24744,
+ "merging": 49256,
+ "meri": 17993,
+ "meri": 36109,
+ "meria": 48433,
+ "meric": 27097,
+ "merica": 30561,
+ "meridi": 37901,
+ "meridian": 31195,
+ "mering": 41060,
+ "meringue": 41661,
+ "merino": 42648,
+ "merit": 20830,
+ "merkel": 24715,
+ "merle": 48586,
+ "merlin": 26517,
+ "merlot": 40424,
+ "mermaid": 16064,
+ "mermaids": 43617,
+ "mero": 19097,
+ "merr": 48288,
+ "merri": 21462,
+ "merrill": 47713,
+ "merritt": 36462,
+ "merry": 14167,
+ "merry": 5779,
+ "merrychristmas": 19672,
+ "mers": 4199,
+ "mersal": 36711,
+ "mersey": 25248,
+ "mersey": 46239,
+ "merseyside": 35382,
+ "mert": 48496,
+ "merton": 35315,
+ "mery": 40873,
+ "meryl": 35787,
+ "mes": 28432,
+ "mes": 3029,
+ "mesa": 18956,
+ "mese": 42018,
+ "mesh": 15030,
+ "mesm": 18695,
+ "mesmer": 38435,
+ "mesmeri": 25985,
+ "mesmerizing": 35637,
+ "meso": 25537,
+ "mesqu": 46819,
+ "mess": 2490,
+ "mess": 8188,
+ "message": 3918,
+ "messages": 9390,
+ "messaging": 23234,
+ "messe": 40391,
+ "messed": 23580,
+ "messenger": 17389,
+ "messi": 19394,
+ "messi": 11252,
+ "messiah": 28737,
+ "messing": 23144,
+ "messy": 15987,
+ "mest": 23780,
+ "mester": 47349,
+ "mesut": 49177,
+ "met": 5249,
+ "met": 2340,
+ "meta": 14803,
+ "meta": 22701,
+ "metab": 16150,
+ "metabol": 48389,
+ "metaboli": 25573,
+ "metabolic": 34311,
+ "metabolism": 27824,
+ "metal": 8935,
+ "metal": 4044,
+ "metall": 19084,
+ "metallic": 17257,
+ "metallica": 24079,
+ "metals": 21375,
+ "metam": 28862,
+ "metamor": 39030,
+ "metamorpho": 47601,
+ "metaph": 24189,
+ "metaphor": 34233,
+ "metast": 41973,
+ "mete": 11226,
+ "meteor": 26429,
+ "meteor": 26823,
+ "meteoro": 25948,
+ "meteorologist": 42849,
+ "meter": 10104,
+ "meters": 13247,
+ "metgala": 30089,
+ "meth": 21867,
+ "meth": 26177,
+ "methane": 37565,
+ "metho": 5770,
+ "method": 10284,
+ "methodist": 25165,
+ "methodo": 28488,
+ "methodology": 37316,
+ "methods": 12200,
+ "methyl": 48999,
+ "metmuseum": 28207,
+ "meto": 25679,
+ "metoo": 24722,
+ "metr": 15086,
+ "metre": 27889,
+ "metres": 19798,
+ "metric": 19950,
+ "metrical": 40704,
+ "metrics": 24396,
+ "metro": 7257,
+ "metro": 6784,
+ "metroid": 39957,
+ "metropolis": 40476,
+ "metropolitan": 19013,
+ "metry": 20039,
+ "mets": 9633,
+ "mett": 28081,
+ "metz": 40506,
+ "meu": 34520,
+ "mew": 40368,
+ "mex": 3213,
+ "mex": 18387,
+ "mexic": 31728,
+ "mexican": 37442,
+ "mexican": 8186,
+ "mexicans": 47729,
+ "mexico": 31834,
+ "mexico": 4604,
+ "mey": 28584,
+ "mey": 27777,
+ "meyer": 13963,
+ "meyers": 32326,
+ "mez": 30615,
+ "mez": 46833,
+ "mezz": 38771,
+ "mf": 18199,
+ "mf": 11067,
+ "mfa": 24107,
+ "mfc": 39474,
+ "mfg": 21912,
+ "mfw": 27309,
+ "mg": 10003,
+ "mg": 8014,
+ "mga": 23954,
+ "mgm": 27572,
+ "mgmt": 22288,
+ "mgr": 31500,
+ "mgs": 48073,
+ "mgt": 48663,
+ "mh": 9962,
+ "mh": 10834,
+ "mha": 41944,
+ "mhealth": 41225,
+ "mhs": 28815,
+ "mhz": 31550,
+ "mi": 714,
+ "mi": 2251,
+ "mia": 5852,
+ "miam": 31053,
+ "miami": 15106,
+ "miami": 4891,
+ "mian": 24792,
+ "miaw": 36046,
+ "mib": 48178,
+ "mic": 1213,
+ "mic": 3816,
+ "mica": 41551,
+ "micah": 33870,
+ "mice": 19030,
+ "mich": 25628,
+ "mich": 23029,
+ "micha": 2083,
+ "michael": 6051,
+ "michael": 2511,
+ "michaela": 41897,
+ "michaeljackson": 33532,
+ "michaels": 23868,
+ "michal": 47144,
+ "miche": 37966,
+ "micheal": 43709,
+ "michel": 5158,
+ "michel": 17153,
+ "michelangelo": 41245,
+ "michele": 20642,
+ "michelin": 26330,
+ "michelle": 19028,
+ "michelle": 8625,
+ "michi": 5658,
+ "michigan": 32344,
+ "michigan": 6296,
+ "mick": 15171,
+ "mick": 12592,
+ "mickey": 41813,
+ "mickey": 13053,
+ "micky": 43011,
+ "micro": 3160,
+ "micro": 11374,
+ "microbes": 44671,
+ "microbi": 19496,
+ "microbial": 30335,
+ "microbiology": 35348,
+ "microbiome": 35148,
+ "micron": 48742,
+ "microphone": 24643,
+ "micropoetry": 35997,
+ "microscope": 29114,
+ "microscopy": 38431,
+ "microsof": 42424,
+ "microsoft": 38650,
+ "microsoft": 7254,
+ "microwave": 24240,
+ "mics": 16554,
+ "mid": 2192,
+ "mid": 4734,
+ "midcentury": 48988,
+ "midd": 2983,
+ "midday": 23390,
+ "middle": 9849,
+ "middle": 3694,
+ "middleeast": 32783,
+ "middles": 29769,
+ "middlesbrough": 32436,
+ "middlesex": 39154,
+ "middleton": 23627,
+ "middleweight": 35829,
+ "midfield": 28116,
+ "midfielder": 13423,
+ "midget": 30734,
+ "midi": 39496,
+ "midi": 27326,
+ "midland": 24822,
+ "midlands": 18062,
+ "midnight": 35746,
+ "midnight": 6302,
+ "mids": 40821,
+ "midst": 24752,
+ "midsummer": 35234,
+ "midterm": 34365,
+ "midterms": 32015,
+ "midtown": 26069,
+ "midway": 26536,
+ "midweek": 29120,
+ "midwest": 16627,
+ "midwi": 44802,
+ "midwife": 37681,
+ "midwives": 42355,
+ "mie": 20865,
+ "mie": 10555,
+ "miento": 46482,
+ "mier": 36490,
+ "mies": 8840,
+ "miff": 49398,
+ "mig": 28743,
+ "might": 2727,
+ "mighty": 26632,
+ "mighty": 7815,
+ "mign": 41678,
+ "migos": 44640,
+ "migr": 3736,
+ "migra": 28186,
+ "migraine": 35360,
+ "migrant": 18902,
+ "migrants": 15814,
+ "migrate": 41804,
+ "migrating": 43604,
+ "migration": 11891,
+ "migu": 12279,
+ "miguel": 33672,
+ "miguel": 14436,
+ "miho": 46870,
+ "mii": 39896,
+ "mik": 15096,
+ "mik": 46203,
+ "mika": 28609,
+ "mika": 25185,
+ "mike": 5884,
+ "mike": 3178,
+ "mikel": 48865,
+ "mikequind": 33508,
+ "mikequindazzi": 33551,
+ "mikey": 34934,
+ "mikey": 23368,
+ "mikha": 30999,
+ "mikhail": 38327,
+ "miki": 48863,
+ "miko": 35413,
+ "miku": 37703,
+ "mil": 1469,
+ "mil": 12826,
+ "mila": 26183,
+ "milan": 30380,
+ "milan": 8552,
+ "milano": 18585,
+ "milb": 42248,
+ "mild": 16085,
+ "mildly": 49059,
+ "mile": 7833,
+ "mile": 6243,
+ "mileage": 30579,
+ "miler": 44680,
+ "miles": 3446,
+ "milestone": 13485,
+ "milestones": 34025,
+ "miley": 25336,
+ "miley": 14321,
+ "mileycyrus": 28528,
+ "milf": 45386,
+ "milford": 35840,
+ "mili": 16698,
+ "miliband": 41440,
+ "milit": 3715,
+ "militant": 33629,
+ "militants": 23974,
+ "military": 24498,
+ "military": 4323,
+ "militi": 46625,
+ "militia": 32114,
+ "milk": 13409,
+ "milk": 5205,
+ "milkshake": 29066,
+ "milky": 37320,
+ "milky": 21120,
+ "milkyway": 43246,
+ "mill": 4221,
+ "mill": 6637,
+ "milla": 49381,
+ "millan": 34930,
+ "millan": 22188,
+ "millar": 41851,
+ "mille": 34066,
+ "millen": 48501,
+ "millenni": 10406,
+ "millennial": 28357,
+ "millennials": 18804,
+ "millennium": 21116,
+ "miller": 21699,
+ "miller": 5733,
+ "milli": 5340,
+ "millie": 29283,
+ "milling": 39133,
+ "million": 13154,
+ "million": 2506,
+ "millionaire": 25179,
+ "millionaires": 47159,
+ "millions": 8492,
+ "mills": 10331,
+ "millwall": 35902,
+ "milly": 45794,
+ "milne": 44590,
+ "milner": 45230,
+ "milo": 24548,
+ "milton": 39004,
+ "milton": 17360,
+ "milwau": 13452,
+ "milwaukee": 14259,
+ "mim": 39379,
+ "mimi": 27086,
+ "mimic": 47116,
+ "mimic": 46519,
+ "mimo": 45551,
+ "min": 771,
+ "min": 3331,
+ "mina": 15281,
+ "minaj": 25136,
+ "minal": 40222,
+ "minat": 33275,
+ "mince": 32396,
+ "mind": 5890,
+ "mind": 2575,
+ "mindanao": 44228,
+ "minded": 21330,
+ "mindful": 28457,
+ "mindfulness": 15707,
+ "minding": 45337,
+ "minds": 9244,
+ "mindset": 14217,
+ "mindy": 46875,
+ "mindy": 38551,
+ "mine": 20149,
+ "mine": 3347,
+ "minecraft": 15678,
+ "mined": 48034,
+ "minent": 12533,
+ "miner": 14109,
+ "miner": 26572,
+ "mineral": 17692,
+ "minerals": 21169,
+ "miners": 22119,
+ "mines": 16211,
+ "ming": 10868,
+ "ming": 2107,
+ "mingham": 7590,
+ "mingle": 38437,
+ "mingly": 36909,
+ "mington": 49283,
+ "mington": 23119,
+ "minh": 48734,
+ "minho": 21318,
+ "mini": 1810,
+ "mini": 3954,
+ "miniature": 44298,
+ "miniature": 16377,
+ "miniatures": 38816,
+ "minic": 31522,
+ "minim": 10005,
+ "minimal": 18458,
+ "minimalism": 42594,
+ "minimalist": 26641,
+ "minimize": 38697,
+ "minimum": 12244,
+ "minindia": 28458,
+ "mining": 8473,
+ "minion": 28622,
+ "minions": 27035,
+ "minis": 33409,
+ "minis": 35976,
+ "minister": 25688,
+ "minister": 3569,
+ "ministerial": 33008,
+ "ministers": 16406,
+ "ministries": 27895,
+ "ministry": 8742,
+ "mink": 42017,
+ "minn": 45991,
+ "minn": 47318,
+ "minne": 7083,
+ "minneapolis": 16977,
+ "minneso": 9380,
+ "minnesota": 9968,
+ "minnie": 24493,
+ "mino": 22791,
+ "minogue": 44202,
+ "minor": 8522,
+ "minorities": 28119,
+ "minority": 16210,
+ "minors": 36789,
+ "mins": 6196,
+ "minsk": 46151,
+ "minster": 11189,
+ "mint": 48084,
+ "mint": 7506,
+ "minted": 49377,
+ "minton": 20050,
+ "minu": 29064,
+ "minus": 15358,
+ "minute": 28931,
+ "minute": 4497,
+ "minutes": 3056,
+ "mio": 26366,
+ "mir": 2750,
+ "mir": 6585,
+ "mira": 21665,
+ "mira": 22762,
+ "mirac": 13685,
+ "miracle": 49208,
+ "miracle": 11543,
+ "miracles": 23478,
+ "miraculous": 38671,
+ "mirage": 28679,
+ "mirai": 49060,
+ "mirand": 32367,
+ "miranda": 17590,
+ "mire": 38140,
+ "mire": 30140,
+ "miri": 22273,
+ "miriam": 30950,
+ "miro": 34851,
+ "miro": 48317,
+ "mirren": 47600,
+ "mirro": 48500,
+ "mirror": 29823,
+ "mirror": 7220,
+ "mirrors": 21823,
+ "mirza": 36440,
+ "mis": 866,
+ "mis": 11239,
+ "mischief": 33896,
+ "misconceptions": 48681,
+ "misconduct": 30601,
+ "mise": 46567,
+ "mise": 17267,
+ "miser": 33394,
+ "miserable": 26196,
+ "misery": 28360,
+ "mises": 24390,
+ "misfits": 42708,
+ "mish": 15494,
+ "mish": 20981,
+ "misha": 35434,
+ "mishra": 33042,
+ "misleading": 30862,
+ "mism": 15948,
+ "miso": 27657,
+ "miso": 33441,
+ "misogy": 31315,
+ "misogyny": 48415,
+ "miss": 6984,
+ "miss": 1526,
+ "missal": 38337,
+ "missed": 3955,
+ "misses": 15844,
+ "missi": 3008,
+ "missile": 14411,
+ "missiles": 27868,
+ "missin": 36209,
+ "missing": 23509,
+ "missing": 3423,
+ "mission": 12738,
+ "mission": 2406,
+ "missionaries": 40580,
+ "missionary": 27915,
+ "missions": 6990,
+ "mississ": 26483,
+ "mississauga": 28393,
+ "mississi": 11687,
+ "mississippi": 12232,
+ "missou": 30710,
+ "missoula": 48549,
+ "missouri": 11835,
+ "missuni": 26347,
+ "missuniverse": 28766,
+ "missy": 48105,
+ "missy": 31515,
+ "missyou": 45799,
+ "mist": 12610,
+ "mist": 11946,
+ "mistak": 20478,
+ "mistake": 11303,
+ "mistaken": 29182,
+ "mistakenly": 48494,
+ "mistakes": 12824,
+ "mister": 26949,
+ "mister": 18895,
+ "mistle": 46800,
+ "mistletoe": 48569,
+ "mistre": 42039,
+ "mistress": 24349,
+ "mists": 28636,
+ "misty": 18799,
+ "misunderstood": 41574,
+ "misuse": 40970,
+ "mit": 3303,
+ "mit": 4551,
+ "mita": 47514,
+ "mitage": 27964,
+ "mitch": 6969,
+ "mitch": 14150,
+ "mitchell": 39339,
+ "mitchell": 9007,
+ "mite": 26929,
+ "mith": 21752,
+ "mith": 17948,
+ "miti": 17857,
+ "mitigate": 42273,
+ "mitigation": 35514,
+ "mito": 38254,
+ "mitochondri": 42132,
+ "mitra": 47703,
+ "mits": 24086,
+ "mitsu": 17905,
+ "mitsubi": 21604,
+ "mitsubishi": 23030,
+ "mitt": 17321,
+ "mitt": 21341,
+ "mitted": 10307,
+ "mitting": 27938,
+ "mitz": 41827,
+ "mium": 35891,
+ "miwx": 43941,
+ "mix": 3210,
+ "mix": 3285,
+ "mixed": 29376,
+ "mixed": 6780,
+ "mixer": 17200,
+ "mixers": 39175,
+ "mixes": 19061,
+ "mixing": 15588,
+ "mixtape": 11044,
+ "mixture": 28286,
+ "miy": 25695,
+ "miya": 36257,
+ "miz": 20881,
+ "miz": 30795,
+ "mize": 19076,
+ "mized": 43418,
+ "mizing": 38715,
+ "mizz": 19985,
+ "mizzou": 26165,
+ "mj": 13117,
+ "mj": 14733,
+ "mk": 11581,
+ "mk": 8937,
+ "mke": 36642,
+ "mkt": 24814,
+ "ml": 3627,
+ "ml": 5780,
+ "mla": 16723,
+ "mlas": 48464,
+ "mlb": 21039,
+ "mlb": 7482,
+ "mley": 40329,
+ "mlg": 45801,
+ "mlin": 24556,
+ "mlk": 17941,
+ "mlkday": 39905,
+ "mlm": 37611,
+ "mln": 18971,
+ "mlp": 23620,
+ "mlpfi": 45475,
+ "mlpfim": 45640,
+ "mls": 13077,
+ "mm": 1028,
+ "mm": 2848,
+ "mma": 34140,
+ "mma": 6096,
+ "mmc": 44253,
+ "mme": 13105,
+ "mmed": 19570,
+ "mmer": 35717,
+ "mmer": 7508,
+ "mmers": 28128,
+ "mmes": 42862,
+ "mmi": 34147,
+ "mming": 21038,
+ "mming": 16507,
+ "mmings": 31357,
+ "mmit": 41050,
+ "mmj": 43015,
+ "mmm": 37908,
+ "mmm": 7641,
+ "mmmm": 36312,
+ "mmmm": 13180,
+ "mmmmm": 21808,
+ "mmmmmm": 43740,
+ "mmo": 30418,
+ "mmon": 41131,
+ "mmor": 36657,
+ "mmorpg": 39476,
+ "mms": 37803,
+ "mmva": 42666,
+ "mmy": 28837,
+ "mmy": 8722,
+ "mn": 5086,
+ "mn": 4057,
+ "mna": 34877,
+ "mnd": 44776,
+ "mnet": 34129,
+ "mnf": 41105,
+ "mnl": 32980,
+ "mnleg": 42653,
+ "mns": 39040,
+ "mnt": 21477,
+ "mntwins": 45448,
+ "mnwild": 39044,
+ "mnwx": 39592,
+ "mo": 617,
+ "mo": 2080,
+ "moa": 33174,
+ "moana": 43241,
+ "mob": 2818,
+ "mob": 12754,
+ "mobi": 9451,
+ "mobil": 26343,
+ "mobil": 29815,
+ "mobile": 12935,
+ "mobile": 3451,
+ "mobiles": 44302,
+ "mobili": 20770,
+ "mobility": 12546,
+ "mobilization": 48916,
+ "moby": 47219,
+ "moc": 41439,
+ "moc": 36992,
+ "mocha": 28425,
+ "mochi": 47973,
+ "mock": 15641,
+ "mock": 12759,
+ "mocked": 47400,
+ "mocking": 28692,
+ "mocking": 37870,
+ "mocks": 35142,
+ "mod": 6362,
+ "mod": 10893,
+ "moda": 25814,
+ "modal": 33157,
+ "mode": 20402,
+ "mode": 6493,
+ "model": 4591,
+ "model": 2863,
+ "modeled": 39527,
+ "modeling": 13706,
+ "modelling": 19946,
+ "models": 6176,
+ "moder": 2894,
+ "moderate": 16435,
+ "moderated": 27928,
+ "moderating": 34242,
+ "moderator": 32659,
+ "modern": 11706,
+ "modern": 4077,
+ "modernart": 34417,
+ "moderni": 24328,
+ "modernism": 39601,
+ "modernist": 36773,
+ "modernization": 47294,
+ "modes": 30454,
+ "modest": 25436,
+ "modi": 9047,
+ "modi": 7774,
+ "modification": 37630,
+ "modified": 17964,
+ "modo": 36820,
+ "mods": 23843,
+ "modu": 9036,
+ "modular": 22437,
+ "module": 16757,
+ "modules": 30575,
+ "moe": 38655,
+ "moe": 17938,
+ "mof": 30798,
+ "moff": 27160,
+ "mog": 42362,
+ "moga": 41732,
+ "mogadishu": 45133,
+ "mogul": 41320,
+ "moh": 18979,
+ "moh": 35388,
+ "moha": 46892,
+ "moham": 7923,
+ "mohamed": 18472,
+ "mohammad": 19926,
+ "mohammed": 16168,
+ "mohan": 26521,
+ "mohan": 23586,
+ "mohawk": 34942,
+ "mohd": 49094,
+ "mohsin": 48861,
+ "moi": 20691,
+ "moi": 21825,
+ "moil": 30349,
+ "moines": 32091,
+ "moist": 19831,
+ "moist": 33263,
+ "moisture": 20412,
+ "moisturi": 25942,
+ "moj": 34505,
+ "moja": 49055,
+ "mojito": 46830,
+ "mojo": 25204,
+ "mok": 49146,
+ "mol": 4246,
+ "mol": 31582,
+ "mold": 21846,
+ "molding": 46274,
+ "moldova": 47317,
+ "mole": 9927,
+ "mole": 23529,
+ "molecular": 19370,
+ "molecule": 39233,
+ "molecules": 35643,
+ "molina": 34201,
+ "mollie": 48203,
+ "molly": 24368,
+ "molly": 12573,
+ "molo": 41510,
+ "mology": 32255,
+ "molten": 46071,
+ "moly": 47083,
+ "mom": 1614,
+ "mom": 2543,
+ "moma": 33605,
+ "mombasa": 40340,
+ "moment": 12197,
+ "moment": 2495,
+ "momento": 30078,
+ "moments": 5251,
+ "momentum": 15722,
+ "momlife": 43825,
+ "momma": 14508,
+ "mommy": 12456,
+ "momo": 48490,
+ "momo": 25980,
+ "moms": 28446,
+ "moms": 10042,
+ "momsdemand": 33744,
+ "mon": 749,
+ "mon": 2173,
+ "mona": 19143,
+ "monaco": 14938,
+ "monaghan": 39797,
+ "monarch": 27235,
+ "monarch": 22619,
+ "monarchs": 36750,
+ "monarchy": 47503,
+ "monaster": 19422,
+ "monastery": 21850,
+ "monc": 34847,
+ "moncton": 44962,
+ "mond": 14522,
+ "mond": 4475,
+ "monday": 6205,
+ "monday": 2098,
+ "mondaymorning": 40089,
+ "mondaymotiv": 45488,
+ "mondaymotivation": 8198,
+ "mondaymotivaton": 47034,
+ "mondays": 13815,
+ "monde": 29339,
+ "mondo": 36207,
+ "monds": 20317,
+ "mone": 25990,
+ "monet": 24499,
+ "monetary": 26394,
+ "moneti": 38056,
+ "money": 12743,
+ "money": 2327,
+ "mong": 43566,
+ "monger": 38928,
+ "mongers": 27670,
+ "mongo": 20680,
+ "mongolia": 27144,
+ "mongolian": 46335,
+ "moni": 46851,
+ "monia": 31161,
+ "monic": 30893,
+ "monica": 13540,
+ "monit": 9014,
+ "monitor": 10198,
+ "monitored": 45828,
+ "monitoring": 11030,
+ "monitors": 30478,
+ "monk": 30557,
+ "monk": 16424,
+ "monkey": 29597,
+ "monkey": 9465,
+ "monkeys": 15781,
+ "monks": 29090,
+ "monmouth": 36929,
+ "mono": 8220,
+ "mono": 22537,
+ "monochrome": 25576,
+ "monogram": 39665,
+ "monologue": 47776,
+ "monopoly": 25241,
+ "monoxide": 49314,
+ "monro": 45750,
+ "monroe": 13625,
+ "mons": 19885,
+ "monsanto": 37592,
+ "monsi": 46677,
+ "monsieur": 48879,
+ "monsoon": 18872,
+ "monsta": 30718,
+ "monstax": 45631,
+ "monste": 47045,
+ "monster": 14454,
+ "monster": 6060,
+ "monsters": 11546,
+ "mont": 5186,
+ "mont": 5382,
+ "montag": 37202,
+ "montage": 32325,
+ "montal": 42126,
+ "montan": 28405,
+ "montana": 11436,
+ "monte": 8711,
+ "monte": 14667,
+ "montene": 28538,
+ "montenegro": 30378,
+ "monter": 36673,
+ "monterey": 23388,
+ "monterrey": 45254,
+ "montess": 43205,
+ "montessori": 45443,
+ "montgom": 13852,
+ "montgomery": 14951,
+ "month": 7680,
+ "month": 1924,
+ "monthly": 8764,
+ "months": 3109,
+ "monthsary": 42420,
+ "monton": 41961,
+ "montp": 39523,
+ "montre": 8434,
+ "montreal": 9262,
+ "montrose": 42347,
+ "monty": 43997,
+ "monty": 24038,
+ "monu": 9748,
+ "monument": 12019,
+ "monumental": 31297,
+ "monuments": 26916,
+ "mony": 4117,
+ "monza": 40380,
+ "moo": 4953,
+ "moo": 24626,
+ "mood": 42358,
+ "mood": 5394,
+ "moods": 43727,
+ "moody": 17170,
+ "moom": 36887,
+ "moon": 6334,
+ "moon": 3293,
+ "mooney": 37942,
+ "moonlight": 20001,
+ "moons": 29887,
+ "moonshine": 46706,
+ "moor": 14817,
+ "moor": 11877,
+ "moore": 28613,
+ "moore": 6708,
+ "moors": 32577,
+ "moose": 37562,
+ "moose": 17338,
+ "moot": 46895,
+ "mop": 33900,
+ "mopar": 41166,
+ "mor": 657,
+ "mor": 18614,
+ "mora": 29262,
+ "moral": 11246,
+ "morale": 39404,
+ "morales": 27117,
+ "morality": 34133,
+ "morally": 42519,
+ "morals": 46223,
+ "moran": 21557,
+ "moray": 44569,
+ "more": 5434,
+ "more": 750,
+ "morecam": 37305,
+ "morecambe": 43414,
+ "mored": 20195,
+ "moreland": 44135,
+ "moreno": 24826,
+ "morethan": 30889,
+ "morg": 34284,
+ "morgan": 15432,
+ "morgan": 6075,
+ "morgen": 35106,
+ "mori": 25710,
+ "mori": 29514,
+ "moris": 43131,
+ "moritz": 45594,
+ "morley": 40439,
+ "mormon": 27715,
+ "morn": 22393,
+ "mornin": 28327,
+ "morning": 10769,
+ "morning": 1119,
+ "mornings": 12106,
+ "moro": 31613,
+ "moroc": 11996,
+ "moroccan": 27546,
+ "morocco": 15228,
+ "moron": 31875,
+ "morons": 46477,
+ "morow": 40779,
+ "morph": 23915,
+ "morph": 41700,
+ "morphe": 38978,
+ "morpho": 38622,
+ "morrha": 43044,
+ "morri": 9876,
+ "morris": 22560,
+ "morris": 9090,
+ "morrison": 40961,
+ "morrison": 14094,
+ "morrisons": 40965,
+ "morrissey": 30040,
+ "morro": 48363,
+ "morrow": 21611,
+ "mors": 13064,
+ "morse": 25282,
+ "mort": 24257,
+ "mort": 30583,
+ "mortal": 31883,
+ "mortal": 14680,
+ "mortality": 20347,
+ "mortar": 27258,
+ "mortg": 12069,
+ "mortgage": 13988,
+ "mortgages": 45391,
+ "mortimer": 47836,
+ "morton": 20698,
+ "morty": 37391,
+ "mory": 22633,
+ "mos": 28658,
+ "mos": 9593,
+ "mosa": 14164,
+ "mosa": 23809,
+ "mosaic": 17506,
+ "mosch": 47003,
+ "mosco": 9840,
+ "moscow": 10371,
+ "moseley": 47080,
+ "moses": 18451,
+ "mosley": 46228,
+ "mosqu": 15215,
+ "mosque": 12694,
+ "mosques": 41214,
+ "mosquit": 39699,
+ "mosquito": 25083,
+ "mosquitoes": 41870,
+ "moss": 25107,
+ "moss": 12815,
+ "most": 7034,
+ "most": 1096,
+ "mostly": 8829,
+ "mosul": 29165,
+ "mot": 16352,
+ "mot": 15452,
+ "mota": 42499,
+ "motd": 46232,
+ "motel": 26191,
+ "moth": 33208,
+ "moth": 11736,
+ "mother": 7455,
+ "mother": 3050,
+ "motherhood": 32274,
+ "motherland": 46774,
+ "mothers": 10546,
+ "mothersday": 15583,
+ "motherwell": 48104,
+ "moths": 29086,
+ "moti": 38210,
+ "motif": 35373,
+ "motion": 32139,
+ "motion": 7860,
+ "motiv": 3183,
+ "motivate": 26771,
+ "motivated": 16521,
+ "motivates": 44684,
+ "motivating": 37720,
+ "motivation": 26117,
+ "motivation": 4193,
+ "motivational": 32832,
+ "motivational": 20472,
+ "motivationmonday": 28703,
+ "motive": 36669,
+ "motley": 42553,
+ "motm": 41192,
+ "moto": 10646,
+ "moto": 11431,
+ "motocross": 34562,
+ "motogp": 16615,
+ "motor": 3975,
+ "motor": 7659,
+ "motorbike": 33341,
+ "motorcycle": 10297,
+ "motorcycles": 24869,
+ "motoring": 44491,
+ "motorists": 32766,
+ "motorola": 33738,
+ "motors": 14989,
+ "motorsport": 18371,
+ "motorsports": 24264,
+ "motorway": 31808,
+ "motown": 32685,
+ "mott": 44570,
+ "mott": 21708,
+ "motto": 23338,
+ "mou": 2809,
+ "mou": 25289,
+ "moud": 37698,
+ "moul": 25725,
+ "mould": 36743,
+ "moulin": 47656,
+ "moun": 2023,
+ "mound": 21414,
+ "mount": 20553,
+ "mount": 5532,
+ "mountain": 14547,
+ "mountain": 3965,
+ "mountaine": 24841,
+ "mountaineer": 49255,
+ "mountains": 5873,
+ "mounted": 17897,
+ "mounting": 29910,
+ "mounts": 36767,
+ "mour": 9053,
+ "mour": 42446,
+ "moured": 29555,
+ "mourinho": 18536,
+ "mourn": 33592,
+ "mourning": 24169,
+ "mourns": 42811,
+ "mous": 24837,
+ "mous": 17425,
+ "mouse": 33032,
+ "mouse": 9301,
+ "mousse": 31869,
+ "moustache": 32795,
+ "mouth": 15152,
+ "mouth": 4932,
+ "mouths": 38518,
+ "mov": 23950,
+ "move": 16624,
+ "move": 2783,
+ "moved": 6997,
+ "movember": 23474,
+ "movement": 5208,
+ "movements": 19665,
+ "mover": 37673,
+ "movers": 33957,
+ "moves": 6880,
+ "movi": 1707,
+ "movic": 43838,
+ "movie": 11247,
+ "movie": 2016,
+ "movies": 4772,
+ "moving": 32160,
+ "moving": 3584,
+ "mow": 31006,
+ "mow": 36329,
+ "mower": 30895,
+ "mowing": 46424,
+ "mowx": 44263,
+ "moy": 27276,
+ "moy": 34205,
+ "moyes": 37119,
+ "moz": 14761,
+ "moz": 43738,
+ "mozam": 26648,
+ "mozambique": 28831,
+ "mozart": 22132,
+ "mozz": 26317,
+ "mozzarella": 27845,
+ "mp": 1037,
+ "mp": 1246,
+ "mpa": 30749,
+ "mpc": 38560,
+ "mpd": 33814,
+ "mped": 28134,
+ "mper": 22803,
+ "mpg": 39830,
+ "mpg": 37454,
+ "mpgvip": 42149,
+ "mph": 5306,
+ "mpi": 43263,
+ "mping": 27999,
+ "mple": 21139,
+ "mplo": 47071,
+ "mpls": 34298,
+ "mpo": 33674,
+ "mpp": 39570,
+ "mps": 5504,
+ "mption": 9717,
+ "mpton": 27448,
+ "mpu": 47156,
+ "mpus": 25864,
+ "mpy": 17192,
+ "mq": 19103,
+ "mqm": 24687,
+ "mr": 3139,
+ "mr": 1982,
+ "mra": 44568,
+ "mrc": 25897,
+ "mri": 24773,
+ "mrs": 25003,
+ "mrs": 4255,
+ "mrt": 30256,
+ "mru": 22370,
+ "mrw": 15303,
+ "ms": 3525,
+ "ms": 988,
+ "msa": 36306,
+ "msc": 31826,
+ "msc": 20529,
+ "msd": 25804,
+ "msd": 36407,
+ "msdhoni": 32850,
+ "msf": 36239,
+ "msg": 44430,
+ "msg": 10928,
+ "msh": 41751,
+ "msi": 43597,
+ "msi": 45278,
+ "msk": 38501,
+ "msl": 42736,
+ "msm": 22210,
+ "msn": 18824,
+ "msn": 41042,
+ "msnbc": 20245,
+ "mson": 27773,
+ "mson": 12298,
+ "msp": 41445,
+ "msp": 22318,
+ "mss": 42136,
+ "mss": 48610,
+ "mst": 26335,
+ "msu": 26763,
+ "msu": 17298,
+ "mswx": 42957,
+ "msy": 43919,
+ "mt": 4252,
+ "mt": 3284,
+ "mta": 28691,
+ "mtb": 48306,
+ "mtb": 18747,
+ "mtc": 42482,
+ "mtg": 49142,
+ "mtg": 13648,
+ "mth": 48151,
+ "mtl": 22135,
+ "mtn": 26041,
+ "mtn": 18953,
+ "mtr": 46650,
+ "mts": 38751,
+ "mtv": 8099,
+ "mtv": 12555,
+ "mtvbr": 47258,
+ "mtvhottest": 16751,
+ "mtvstars": 19948,
+ "mu": 670,
+ "mu": 6411,
+ "mua": 21395,
+ "muay": 44910,
+ "muaythai": 47763,
+ "mubarak": 17957,
+ "muc": 49115,
+ "much": 14300,
+ "much": 1238,
+ "mucha": 42191,
+ "muchas": 26278,
+ "mucho": 19864,
+ "muck": 44731,
+ "muck": 45330,
+ "mud": 17491,
+ "mud": 11673,
+ "mudder": 49104,
+ "muddy": 21524,
+ "mue": 44383,
+ "mue": 40717,
+ "mueller": 46863,
+ "mueller": 14719,
+ "muen": 48646,
+ "muer": 33840,
+ "muf": 33852,
+ "mufc": 9013,
+ "muffin": 22696,
+ "muffins": 25922,
+ "mufti": 44930,
+ "mug": 16339,
+ "mug": 9722,
+ "mugabe": 36441,
+ "mughal": 37508,
+ "mugs": 22852,
+ "mugshot": 40028,
+ "muh": 36335,
+ "muh": 46475,
+ "muham": 10043,
+ "muhammad": 12259,
+ "muir": 44650,
+ "muir": 24745,
+ "muj": 44635,
+ "muk": 17327,
+ "muk": 32600,
+ "mukher": 34575,
+ "mukherjee": 37862,
+ "mul": 1899,
+ "mul": 43193,
+ "mula": 40937,
+ "mulator": 17463,
+ "mulberry": 39221,
+ "mule": 28695,
+ "mull": 17313,
+ "mull": 35310,
+ "mulled": 44641,
+ "mullen": 30797,
+ "muller": 33956,
+ "mullet": 35010,
+ "mulligan": 44336,
+ "mullins": 41265,
+ "mult": 34219,
+ "multi": 3947,
+ "multi": 6400,
+ "multic": 21683,
+ "multicul": 28004,
+ "multicultural": 34667,
+ "multil": 27975,
+ "multimedia": 27977,
+ "multin": 38996,
+ "multinational": 46540,
+ "multip": 40314,
+ "multiplayer": 27460,
+ "multiple": 6470,
+ "multipurpose": 47665,
+ "multit": 27814,
+ "multitasking": 48684,
+ "mulus": 26180,
+ "mum": 15565,
+ "mum": 4030,
+ "mumb": 5850,
+ "mumbai": 24279,
+ "mumbai": 6971,
+ "mumford": 46184,
+ "mummy": 16301,
+ "mums": 17868,
+ "mun": 2617,
+ "mun": 21059,
+ "muna": 48424,
+ "munch": 23587,
+ "munch": 33299,
+ "munchies": 44324,
+ "munchkin": 41305,
+ "mund": 14244,
+ "mundo": 20990,
+ "muni": 27327,
+ "muni": 39795,
+ "munich": 13526,
+ "munici": 12159,
+ "municipal": 43667,
+ "municipal": 16600,
+ "municipality": 29987,
+ "munition": 32668,
+ "munro": 36501,
+ "munster": 27201,
+ "mup": 21966,
+ "muppet": 40598,
+ "muppets": 40187,
+ "mups": 42195,
+ "mur": 2144,
+ "mur": 18293,
+ "mura": 45176,
+ "mural": 12315,
+ "murals": 31499,
+ "murder": 28136,
+ "murder": 5787,
+ "murdered": 13158,
+ "murderer": 26956,
+ "murderers": 48472,
+ "murdering": 36055,
+ "murders": 22409,
+ "murdoch": 29037,
+ "murphy": 48976,
+ "murphy": 8914,
+ "murray": 31978,
+ "murray": 7513,
+ "murs": 38783,
+ "mus": 2198,
+ "mus": 8103,
+ "musa": 30540,
+ "musc": 5696,
+ "muscat": 33322,
+ "muscle": 27323,
+ "muscle": 9269,
+ "muscles": 16786,
+ "muscular": 30606,
+ "muse": 2369,
+ "muse": 15686,
+ "museo": 36457,
+ "muses": 48243,
+ "museu": 27087,
+ "museum": 15602,
+ "museum": 2786,
+ "museums": 15542,
+ "museumweek": 37996,
+ "mush": 7635,
+ "mushroom": 13011,
+ "mushrooms": 14730,
+ "musi": 15628,
+ "music": 4110,
+ "music": 1179,
+ "musica": 26668,
+ "musical": 36002,
+ "musical": 5173,
+ "musically": 48893,
+ "musicals": 36974,
+ "musichistory": 37890,
+ "musician": 11179,
+ "musicians": 12498,
+ "musicislife": 43311,
+ "musicmonday": 35887,
+ "musicvideo": 26764,
+ "musik": 32986,
+ "musings": 44961,
+ "musique": 42250,
+ "musk": 32143,
+ "musk": 19063,
+ "muskete": 32775,
+ "musketeers": 37993,
+ "musko": 34987,
+ "muskoka": 40832,
+ "musli": 4958,
+ "muslim": 43795,
+ "muslim": 7060,
+ "muslims": 10513,
+ "muss": 41493,
+ "mussels": 33393,
+ "must": 6783,
+ "must": 2048,
+ "mustache": 23451,
+ "mustaf": 23596,
+ "mustafa": 29000,
+ "mustang": 42361,
+ "mustang": 13309,
+ "mustangs": 22500,
+ "mustard": 15794,
+ "muster": 47361,
+ "mustread": 28978,
+ "mut": 12598,
+ "mut": 22839,
+ "mutant": 28384,
+ "mutation": 38626,
+ "mutations": 39651,
+ "mute": 31252,
+ "muted": 48028,
+ "muth": 34280,
+ "mutil": 39950,
+ "mutt": 45924,
+ "mutu": 17574,
+ "mutual": 15055,
+ "mutuals": 31158,
+ "muy": 44625,
+ "mv": 10580,
+ "mv": 8269,
+ "mvc": 40549,
+ "mvp": 8905,
+ "mw": 16725,
+ "mw": 11206,
+ "mwc": 24289,
+ "mwf": 48565,
+ "mx": 21947,
+ "mx": 9575,
+ "my": 1152,
+ "my": 607,
+ "mya": 31401,
+ "myal": 42735,
+ "myan": 13761,
+ "myanmar": 14764,
+ "myart": 38826,
+ "myco": 48362,
+ "mydayin": 41896,
+ "mydayinla": 42801,
+ "mydubai": 43475,
+ "mye": 27551,
+ "myel": 40084,
+ "myers": 15993,
+ "myjaps": 47939,
+ "myle": 43700,
+ "myles": 25511,
+ "mylife": 30537,
+ "mylittle": 37757,
+ "mylittlepony": 45107,
+ "myo": 16206,
+ "myr": 20272,
+ "myra": 35694,
+ "myri": 34972,
+ "myrt": 47785,
+ "myrtle": 27768,
+ "mys": 11724,
+ "myself": 3245,
+ "mysore": 44924,
+ "myspace": 41382,
+ "myster": 4669,
+ "mysteries": 20605,
+ "mysterious": 12650,
+ "mystery": 39828,
+ "mystery": 6711,
+ "mysti": 28711,
+ "mystic": 36264,
+ "mystic": 23722,
+ "mystical": 34122,
+ "myth": 20322,
+ "myth": 13878,
+ "mythical": 34377,
+ "mytho": 43857,
+ "mythology": 22496,
+ "myths": 18675,
+ "mz": 29509,
+ "mz": 33400,
+ "mzan": 36322,
+ "mzansi": 43301,
+ "má": 36842,
+ "mé": 21890,
+ "méxico": 46159,
+ "mü": 28142,
+ "mün": 41235,
+ "n": 77,
+ "n": 333,
+ "na": 1097,
+ "na": 1272,
+ "naa": 37738,
+ "naacp": 32176,
+ "nab": 6951,
+ "nab": 19440,
+ "nabe": 35111,
+ "naby": 24800,
+ "nac": 14557,
+ "nac": 18950,
+ "nach": 12168,
+ "nach": 43622,
+ "nacho": 35647,
+ "nachos": 32847,
+ "nacht": 37261,
+ "nacional": 38782,
+ "nad": 6204,
+ "nad": 43928,
+ "nada": 31683,
+ "nadal": 20814,
+ "nade": 24908,
+ "nadi": 30512,
+ "nadia": 27487,
+ "nadine": 23356,
+ "nadu": 20936,
+ "nae": 19374,
+ "naf": 16161,
+ "naf": 45956,
+ "nafta": 43123,
+ "nag": 6694,
+ "nag": 23902,
+ "naga": 45953,
+ "naga": 38997,
+ "nagar": 17490,
+ "nage": 41219,
+ "nago": 38349,
+ "nagoya": 43303,
+ "nagpur": 43328,
+ "nah": 26421,
+ "nah": 11129,
+ "nahi": 35244,
+ "nai": 6230,
+ "nai": 10692,
+ "naia": 31340,
+ "naidu": 42429,
+ "naija": 16326,
+ "naik": 34424,
+ "nail": 19459,
+ "nail": 9059,
+ "nailart": 43532,
+ "nailed": 19035,
+ "nails": 8469,
+ "nair": 27107,
+ "naira": 39450,
+ "naire": 48892,
+ "nairobi": 17756,
+ "nais": 46396,
+ "naissance": 44761,
+ "naive": 43362,
+ "naj": 30985,
+ "naji": 32589,
+ "nak": 9248,
+ "nak": 25550,
+ "naked": 46371,
+ "naked": 11478,
+ "naku": 39864,
+ "nal": 14132,
+ "nal": 3119,
+ "nale": 27198,
+ "nall": 32869,
+ "nally": 26158,
+ "nam": 1410,
+ "nam": 12344,
+ "nama": 39586,
+ "naman": 27635,
+ "namaste": 35549,
+ "name": 18160,
+ "name": 1981,
+ "named": 3194,
+ "nameis": 40831,
+ "nament": 3916,
+ "naments": 16540,
+ "names": 6130,
+ "namesake": 41298,
+ "nami": 20393,
+ "namibia": 23731,
+ "naming": 19367,
+ "namjoon": 31986,
+ "namm": 35524,
+ "namo": 46013,
+ "namo": 24854,
+ "nan": 4375,
+ "nan": 7750,
+ "nana": 18761,
+ "nanaimo": 40518,
+ "nancy": 21511,
+ "nancy": 11425,
+ "nand": 20435,
+ "nandez": 12764,
+ "nando": 46044,
+ "nang": 48148,
+ "nani": 27980,
+ "nanny": 31104,
+ "nano": 15835,
+ "nano": 22006,
+ "nanop": 34177,
+ "nanotechnology": 42235,
+ "nanow": 46734,
+ "nant": 22526,
+ "nantes": 47533,
+ "nantucket": 41573,
+ "nao": 39319,
+ "naom": 34955,
+ "naomi": 20173,
+ "nap": 6568,
+ "nap": 11012,
+ "napa": 20545,
+ "napier": 40875,
+ "napkin": 38930,
+ "naples": 23560,
+ "napo": 18715,
+ "napol": 20122,
+ "napoleon": 24969,
+ "napoli": 22445,
+ "napp": 11359,
+ "napping": 37657,
+ "naps": 31317,
+ "naq": 46453,
+ "nar": 2977,
+ "nar": 20145,
+ "nara": 33823,
+ "narcis": 25229,
+ "narcissi": 35442,
+ "narco": 38461,
+ "nard": 18216,
+ "nare": 34853,
+ "naren": 8468,
+ "narendr": 9807,
+ "narendra": 25848,
+ "narendramodi": 9853,
+ "narnia": 48693,
+ "narr": 11845,
+ "narrated": 43609,
+ "narrative": 15933,
+ "narratives": 35117,
+ "narrator": 46529,
+ "narrow": 24006,
+ "narrow": 16652,
+ "narrowly": 29747,
+ "naruto": 22732,
+ "nas": 3090,
+ "nas": 15250,
+ "nasa": 6841,
+ "nasal": 42853,
+ "nascar": 25723,
+ "nascar": 7868,
+ "nasdaq": 26629,
+ "nash": 6771,
+ "nash": 13620,
+ "nasheed": 49176,
+ "nashgrier": 33372,
+ "nashville": 45356,
+ "nashville": 8585,
+ "nasi": 47987,
+ "nasir": 47509,
+ "nassau": 34048,
+ "nasser": 43559,
+ "nasty": 32930,
+ "nasty": 8709,
+ "nat": 1276,
+ "nat": 11310,
+ "nata": 39392,
+ "natal": 28516,
+ "natali": 20296,
+ "natalia": 32978,
+ "natalie": 36634,
+ "natalie": 13595,
+ "natash": 48701,
+ "natasha": 23093,
+ "nate": 26643,
+ "nate": 7587,
+ "natgeo": 33009,
+ "natgeo": 25046,
+ "nath": 22203,
+ "nath": 19843,
+ "nathan": 13028,
+ "nathan": 9711,
+ "nathanfillion": 47422,
+ "nathaniel": 32667,
+ "nati": 1060,
+ "nati": 13384,
+ "natic": 44944,
+ "natin": 44358,
+ "nation": 2317,
+ "nation": 2670,
+ "national": 3126,
+ "national": 1362,
+ "nationalbestfriend": 42222,
+ "nationaldogday": 32227,
+ "nationalism": 29867,
+ "nationalist": 25058,
+ "nationality": 44451,
+ "nationally": 15130,
+ "nationalpark": 33060,
+ "nationalparks": 41204,
+ "nationals": 10784,
+ "nationaltrust": 34051,
+ "nations": 7654,
+ "nationwide": 13795,
+ "native": 20639,
+ "native": 4562,
+ "natives": 36060,
+ "nativity": 33988,
+ "natl": 39225,
+ "natl": 34465,
+ "nato": 13139,
+ "nats": 21106,
+ "natu": 2775,
+ "natur": 6800,
+ "natural": 13198,
+ "natural": 3288,
+ "naturally": 12995,
+ "naturals": 44686,
+ "nature": 9382,
+ "nature": 2625,
+ "naturelovers": 41514,
+ "naturephotography": 22533,
+ "natures": 15616,
+ "natureuk": 46193,
+ "nau": 5955,
+ "nau": 32878,
+ "naught": 41001,
+ "naughty": 47255,
+ "naughty": 15101,
+ "nautical": 31660,
+ "nav": 3413,
+ "nav": 25308,
+ "navajo": 35523,
+ "naval": 44725,
+ "naval": 13273,
+ "navar": 24848,
+ "navarro": 37104,
+ "nave": 42704,
+ "naveen": 43837,
+ "naver": 32534,
+ "navi": 16159,
+ "navi": 44848,
+ "navig": 12507,
+ "navigate": 24400,
+ "navigating": 33134,
+ "navigation": 20148,
+ "navigator": 38910,
+ "navis": 36377,
+ "navratri": 45428,
+ "navy": 28414,
+ "navy": 5598,
+ "naw": 16259,
+ "naw": 30500,
+ "nawaz": 49161,
+ "nawaz": 19523,
+ "nax": 38299,
+ "nay": 11704,
+ "nay": 16182,
+ "naya": 38917,
+ "nayanth": 38157,
+ "nayanthara": 45184,
+ "naz": 6363,
+ "naz": 35534,
+ "nazi": 12972,
+ "nazis": 21778,
+ "nb": 6459,
+ "nb": 6813,
+ "nba": 22524,
+ "nba": 5139,
+ "nbad": 43458,
+ "nbaf": 30127,
+ "nbafinals": 33803,
+ "nbap": 41956,
+ "nbaplayoffs": 43860,
+ "nbat": 46291,
+ "nbc": 9352,
+ "nbc": 8799,
+ "nbd": 24526,
+ "nbl": 42652,
+ "nc": 5021,
+ "nc": 4911,
+ "nca": 6921,
+ "ncaa": 9418,
+ "ncbd": 47221,
+ "ncc": 33195,
+ "ncc": 36686,
+ "ncds": 47573,
+ "ncfc": 31274,
+ "ncis": 33617,
+ "ncpol": 40562,
+ "ncr": 38474,
+ "ncs": 42689,
+ "nct": 27723,
+ "nct": 20319,
+ "ncwx": 36166,
+ "nd": 5625,
+ "nd": 1764,
+ "nda": 32862,
+ "ndc": 47564,
+ "ndi": 48229,
+ "ndp": 19257,
+ "nds": 31347,
+ "ndtv": 26261,
+ "ne": 557,
+ "ne": 1422,
+ "nea": 24068,
+ "neal": 33652,
+ "neal": 16730,
+ "near": 11296,
+ "near": 2252,
+ "nearby": 13314,
+ "nearest": 18985,
+ "nearing": 26571,
+ "nearly": 4816,
+ "nears": 37710,
+ "neat": 43201,
+ "neat": 15465,
+ "neath": 18315,
+ "neau": 31559,
+ "neb": 40209,
+ "nebra": 13371,
+ "nebraska": 14565,
+ "nebu": 49295,
+ "nebula": 22532,
+ "nec": 25109,
+ "nec": 22992,
+ "necess": 6961,
+ "necessarily": 25853,
+ "necessary": 8955,
+ "necessities": 43483,
+ "necessity": 33163,
+ "neck": 6066,
+ "neck": 6906,
+ "necklace": 7385,
+ "necklaces": 32276,
+ "necks": 29701,
+ "nectar": 33683,
+ "ned": 16030,
+ "ned": 1369,
+ "nederland": 49058,
+ "nee": 20494,
+ "nee": 10601,
+ "need": 3229,
+ "need": 1262,
+ "needed": 4049,
+ "needing": 22894,
+ "needle": 44490,
+ "needle": 19886,
+ "needles": 27250,
+ "needless": 39984,
+ "needs": 2536,
+ "needy": 30150,
+ "neel": 33092,
+ "neel": 46043,
+ "neer": 34245,
+ "nees": 47248,
+ "neet": 46362,
+ "neg": 5513,
+ "negan": 42623,
+ "negative": 8869,
+ "negatively": 40254,
+ "negativity": 34658,
+ "neglec": 18827,
+ "neglect": 33680,
+ "neglected": 31893,
+ "negli": 32594,
+ "negligence": 45658,
+ "negoti": 10216,
+ "negotiate": 32969,
+ "negotiating": 35510,
+ "negotiation": 36504,
+ "negotiations": 20433,
+ "negr": 42190,
+ "negro": 26554,
+ "neh": 40416,
+ "neh": 41697,
+ "neha": 44463,
+ "nehru": 30316,
+ "nei": 9366,
+ "neigh": 4061,
+ "neighb": 6534,
+ "neighbor": 7759,
+ "neighbor": 14485,
+ "neighborhood": 9471,
+ "neighborhoods": 26713,
+ "neighboring": 44754,
+ "neighbors": 13037,
+ "neighbour": 15858,
+ "neighbour": 23719,
+ "neighbourhood": 20312,
+ "neighbours": 17594,
+ "neil": 13591,
+ "neil": 8030,
+ "neilhimself": 45682,
+ "neill": 19324,
+ "neither": 14398,
+ "nek": 47727,
+ "neko": 47066,
+ "nel": 5476,
+ "nel": 2693,
+ "nell": 27081,
+ "nell": 8117,
+ "nelly": 21166,
+ "nels": 19296,
+ "nelson": 24774,
+ "nelson": 8586,
+ "nem": 45153,
+ "neman": 48553,
+ "neme": 30993,
+ "nemesis": 37811,
+ "nemo": 30441,
+ "nen": 17817,
+ "nen": 15451,
+ "nene": 44167,
+ "neo": 14562,
+ "neo": 11017,
+ "neon": 21043,
+ "neon": 13919,
+ "neonatal": 46464,
+ "neop": 49069,
+ "nep": 20739,
+ "nep": 41960,
+ "nepal": 25597,
+ "nepal": 10066,
+ "nepali": 47579,
+ "neph": 27926,
+ "nephe": 41810,
+ "nephew": 11689,
+ "nephews": 43747,
+ "nephro": 43054,
+ "neptune": 30566,
+ "ner": 2064,
+ "ner": 998,
+ "nerd": 24452,
+ "nerd": 12273,
+ "nerds": 22609,
+ "nerdy": 33124,
+ "nered": 17583,
+ "nerf": 42914,
+ "nering": 20226,
+ "nero": 29048,
+ "ners": 2129,
+ "nerve": 18571,
+ "nerves": 27813,
+ "nervous": 13928,
+ "nery": 48597,
+ "nes": 5457,
+ "nes": 4980,
+ "nesburg": 27159,
+ "nese": 32220,
+ "ness": 7187,
+ "ness": 1294,
+ "nesses": 20107,
+ "nessy": 32939,
+ "nest": 20302,
+ "nest": 8719,
+ "nesting": 28860,
+ "nestle": 43967,
+ "nestled": 38107,
+ "nests": 41133,
+ "net": 1851,
+ "net": 2315,
+ "netany": 23137,
+ "netanyahu": 23583,
+ "netball": 19761,
+ "netes": 44335,
+ "netfli": 6304,
+ "netflix": 35325,
+ "netflix": 6600,
+ "nether": 9946,
+ "netherlands": 11060,
+ "neti": 43980,
+ "netneutrality": 47794,
+ "nets": 8582,
+ "nett": 23403,
+ "nett": 6975,
+ "nette": 13271,
+ "network": 23285,
+ "network": 3304,
+ "networking": 9818,
+ "networks": 10004,
+ "neu": 3855,
+ "neu": 43342,
+ "neue": 45764,
+ "neur": 19001,
+ "neur": 31976,
+ "neural": 26388,
+ "neuro": 7401,
+ "neuro": 36000,
+ "neurological": 41718,
+ "neurology": 43197,
+ "neurons": 40442,
+ "neuroscience": 23381,
+ "neutr": 17207,
+ "neutral": 17011,
+ "neutrality": 26511,
+ "neutron": 44056,
+ "nev": 10236,
+ "nev": 43645,
+ "neva": 43304,
+ "nevada": 13499,
+ "neve": 44099,
+ "neve": 44023,
+ "never": 6746,
+ "never": 1426,
+ "neveragain": 45053,
+ "neverforget": 19242,
+ "nevergiveup": 42497,
+ "neverland": 41483,
+ "nevertheless": 48355,
+ "nevertrump": 47494,
+ "neville": 19269,
+ "nevis": 43670,
+ "new": 1218,
+ "new": 686,
+ "newark": 20240,
+ "newbie": 45427,
+ "newborn": 18320,
+ "newbury": 34169,
+ "newcastle": 41955,
+ "newcastle": 9302,
+ "newcomer": 30648,
+ "newcomers": 44037,
+ "newe": 40068,
+ "newell": 41436,
+ "newer": 33099,
+ "newest": 4990,
+ "newfound": 25250,
+ "newfoundland": 28079,
+ "newh": 18546,
+ "newin": 31911,
+ "newjersey": 32621,
+ "newly": 42186,
+ "newly": 7056,
+ "newman": 15815,
+ "newmarket": 38617,
+ "newmexico": 35238,
+ "newmusic": 32510,
+ "newmusic": 17201,
+ "newor": 25969,
+ "neworleans": 31205,
+ "newport": 42580,
+ "newport": 14846,
+ "newprofile": 14633,
+ "newprofilepic": 14754,
+ "newrelease": 34793,
+ "news": 6216,
+ "news": 1120,
+ "newsat": 43979,
+ "newsc": 28656,
+ "newscast": 45031,
+ "newsle": 10727,
+ "newsletter": 11069,
+ "newsnow": 48650,
+ "newsp": 7109,
+ "newspaper": 8786,
+ "newspapers": 22423,
+ "newsroom": 23200,
+ "newt": 37224,
+ "newton": 33122,
+ "newton": 12606,
+ "newtown": 31747,
+ "newyear": 22161,
+ "newyear": 12999,
+ "newyearseve": 37587,
+ "newyork": 18140,
+ "newyork": 10454,
+ "newyorkcity": 30460,
+ "newyorker": 39732,
+ "newzealand": 21117,
+ "nex": 6897,
+ "nex": 39720,
+ "next": 12434,
+ "next": 1131,
+ "nextgen": 41933,
+ "nexus": 19053,
+ "ney": 3857,
+ "ney": 1438,
+ "neymar": 21878,
+ "neys": 12616,
+ "nez": 27388,
+ "nf": 15195,
+ "nf": 25643,
+ "nfamily": 20098,
+ "nfc": 23695,
+ "nffc": 27893,
+ "nfl": 11219,
+ "nfl": 4691,
+ "nfldraft": 25002,
+ "ng": 10352,
+ "ng": 5215,
+ "nga": 35477,
+ "ngc": 29046,
+ "ngo": 38740,
+ "ngo": 24821,
+ "ngos": 34627,
+ "nguyen": 29947,
+ "nh": 3760,
+ "nh": 10803,
+ "nhc": 44817,
+ "nhl": 12290,
+ "nhl": 8167,
+ "nhlbruins": 39081,
+ "nhljets": 49357,
+ "nhm": 39483,
+ "nhpolitics": 36125,
+ "nhq": 42368,
+ "nhra": 30052,
+ "nhs": 23282,
+ "nhs": 7695,
+ "ni": 697,
+ "ni": 3256,
+ "nia": 3098,
+ "niag": 18071,
+ "niagar": 39298,
+ "niagara": 18965,
+ "niall": 41354,
+ "niall": 8327,
+ "niallo": 22855,
+ "niallofficial": 23084,
+ "niam": 39347,
+ "nian": 46003,
+ "nib": 31049,
+ "nic": 2109,
+ "nic": 6651,
+ "nica": 29040,
+ "nicar": 25119,
+ "nicaragua": 28423,
+ "nice": 28386,
+ "nice": 1805,
+ "nicely": 12303,
+ "nicer": 29488,
+ "nicest": 22967,
+ "niche": 25279,
+ "nichol": 7668,
+ "nicholas": 39814,
+ "nicholas": 13148,
+ "nicholls": 38846,
+ "nichols": 22730,
+ "nicholson": 28745,
+ "nick": 4209,
+ "nick": 4253,
+ "nickel": 22034,
+ "nickelo": 28668,
+ "nickelodeon": 33279,
+ "nicki": 17738,
+ "nickimin": 27390,
+ "nickiminaj": 27593,
+ "nickjonas": 43862,
+ "nickname": 24731,
+ "nicknamed": 45190,
+ "nicks": 15049,
+ "nicky": 28893,
+ "nicky": 22091,
+ "nico": 20850,
+ "nico": 17779,
+ "nicol": 9919,
+ "nicol": 48274,
+ "nicola": 21791,
+ "nicolas": 43813,
+ "nicolas": 18918,
+ "nicole": 21246,
+ "nicole": 10000,
+ "nicot": 45099,
+ "nicotine": 46697,
+ "nie": 9524,
+ "nie": 3501,
+ "niece": 12795,
+ "nieces": 44877,
+ "niel": 19109,
+ "niel": 26837,
+ "niels": 37154,
+ "nielsen": 28372,
+ "nier": 13014,
+ "nies": 10586,
+ "niest": 15007,
+ "nieu": 29781,
+ "nific": 4748,
+ "nifty": 25604,
+ "nig": 27933,
+ "nig": 28099,
+ "nigan": 48516,
+ "nigel": 33919,
+ "nigel": 15153,
+ "niger": 4524,
+ "niger": 29920,
+ "nigeri": 40913,
+ "nigeria": 6106,
+ "nigerian": 12167,
+ "nigerians": 25358,
+ "nigh": 13525,
+ "nigh": 48157,
+ "night": 3870,
+ "night": 930,
+ "nightclub": 20418,
+ "nighter": 41349,
+ "nighting": 36211,
+ "nightingale": 40696,
+ "nightlife": 28823,
+ "nightly": 28868,
+ "nightmare": 12867,
+ "nightmares": 24032,
+ "nightout": 44257,
+ "nights": 4296,
+ "nighttime": 38147,
+ "nightw": 39956,
+ "nih": 25783,
+ "nik": 5126,
+ "nik": 13705,
+ "nike": 16300,
+ "nike": 5783,
+ "nikeplus": 43154,
+ "niki": 36136,
+ "nikita": 37118,
+ "nikk": 38596,
+ "nikki": 23156,
+ "nikki": 16689,
+ "niko": 43771,
+ "nikol": 27430,
+ "nikola": 42146,
+ "nikon": 25488,
+ "nikon": 13849,
+ "nikov": 43960,
+ "nil": 16852,
+ "nil": 35030,
+ "nile": 24252,
+ "nim": 30402,
+ "nim": 42093,
+ "nima": 42586,
+ "nin": 5794,
+ "nin": 14145,
+ "nina": 13891,
+ "nine": 16213,
+ "nine": 7330,
+ "ninety": 48214,
+ "ning": 6050,
+ "ning": 762,
+ "ningham": 23395,
+ "ningly": 43537,
+ "nings": 4588,
+ "nington": 26214,
+ "ninj": 23225,
+ "ninja": 11969,
+ "ninjas": 42796,
+ "nino": 25633,
+ "ninten": 6184,
+ "nintendo": 13969,
+ "nintendo": 7886,
+ "nintendoswitch": 16404,
+ "ninth": 22770,
+ "nip": 33889,
+ "nip": 22333,
+ "nipp": 24634,
+ "nipple": 45987,
+ "nipples": 44774,
+ "nippon": 47960,
+ "nips": 49241,
+ "nir": 15503,
+ "nir": 40057,
+ "nireland": 45763,
+ "niro": 47373,
+ "nirvana": 28300,
+ "nis": 5609,
+ "nis": 3786,
+ "nish": 19834,
+ "nish": 13256,
+ "nished": 24141,
+ "nishi": 32386,
+ "nishings": 49247,
+ "nison": 45700,
+ "niss": 39043,
+ "nissan": 37635,
+ "nissan": 11082,
+ "nist": 17782,
+ "nister": 36640,
+ "nit": 4087,
+ "nit": 19011,
+ "nite": 8427,
+ "niti": 43964,
+ "niti": 45355,
+ "nitin": 37529,
+ "nitro": 30726,
+ "nitrogen": 30706,
+ "niture": 7840,
+ "nity": 12707,
+ "niu": 48187,
+ "niv": 47300,
+ "niversary": 29643,
+ "nix": 48552,
+ "nix": 32278,
+ "nixon": 20671,
+ "nj": 8343,
+ "nj": 6672,
+ "njcaa": 48992,
+ "njpw": 38992,
+ "nk": 22708,
+ "nk": 17456,
+ "nko": 36353,
+ "nl": 12057,
+ "nl": 7655,
+ "nli": 37502,
+ "nlp": 35680,
+ "nlwx": 49260,
+ "nm": 15956,
+ "nm": 11370,
+ "nmd": 43331,
+ "nme": 40454,
+ "nmwx": 47967,
+ "nn": 8947,
+ "nn": 12925,
+ "nnn": 26277,
+ "nnnn": 41420,
+ "no": 578,
+ "no": 871,
+ "noaa": 27557,
+ "noah": 28806,
+ "noah": 11519,
+ "nobel": 33742,
+ "nobel": 15605,
+ "nobelprize": 46074,
+ "noble": 29430,
+ "noble": 12051,
+ "nobody": 7009,
+ "noc": 16988,
+ "noc": 44420,
+ "nocchi": 46359,
+ "noch": 38672,
+ "noche": 29689,
+ "noches": 44166,
+ "nock": 16993,
+ "noctur": 26291,
+ "nocturnal": 41738,
+ "nod": 18648,
+ "nodapl": 39079,
+ "node": 31434,
+ "node": 24871,
+ "nodejs": 39262,
+ "nodes": 40534,
+ "noel": 38406,
+ "noel": 17496,
+ "nof": 29505,
+ "noff": 46979,
+ "nofilter": 16418,
+ "nog": 31157,
+ "noh": 40775,
+ "noi": 43115,
+ "noi": 39889,
+ "noida": 33404,
+ "noir": 39291,
+ "noir": 12953,
+ "nois": 22057,
+ "noise": 41018,
+ "noise": 9307,
+ "noises": 31575,
+ "noisse": 45686,
+ "noisy": 33495,
+ "nokia": 17731,
+ "nol": 8055,
+ "nola": 13289,
+ "nolan": 17323,
+ "nold": 40322,
+ "nole": 34654,
+ "noles": 40569,
+ "nollywood": 43145,
+ "nology": 42221,
+ "nom": 2981,
+ "nom": 12799,
+ "nomad": 27849,
+ "noman": 45592,
+ "nomin": 5643,
+ "nominate": 17122,
+ "nominated": 8710,
+ "nominating": 45747,
+ "nomination": 14136,
+ "nominations": 17124,
+ "nominee": 14122,
+ "nominees": 17873,
+ "nomnom": 26962,
+ "nomore": 35126,
+ "noms": 35706,
+ "non": 4282,
+ "non": 3353,
+ "none": 29644,
+ "none": 8906,
+ "nonetheless": 39675,
+ "nonfiction": 31654,
+ "nonprofit": 19315,
+ "nonprofits": 37935,
+ "nonsense": 19136,
+ "nonstop": 30300,
+ "nont": 25207,
+ "noo": 6759,
+ "noo": 46672,
+ "noodle": 19521,
+ "noodles": 15782,
+ "nook": 30088,
+ "noon": 37693,
+ "noon": 2347,
+ "noor": 46978,
+ "noor": 31323,
+ "nope": 15625,
+ "nor": 1062,
+ "nor": 6190,
+ "nora": 25890,
+ "norcal": 41970,
+ "nord": 19261,
+ "nord": 36067,
+ "nordic": 36439,
+ "nordic": 20734,
+ "nordstrom": 38562,
+ "norfolk": 30232,
+ "norfolk": 12202,
+ "norm": 10990,
+ "norm": 22457,
+ "norma": 35757,
+ "normal": 28748,
+ "normal": 5967,
+ "normali": 45157,
+ "normally": 15870,
+ "norman": 22027,
+ "norman": 11338,
+ "normandy": 23840,
+ "normani": 44596,
+ "norms": 33011,
+ "norris": 21814,
+ "norse": 36559,
+ "norte": 35638,
+ "north": 3468,
+ "north": 2188,
+ "northampton": 49246,
+ "northampton": 26175,
+ "northan": 37081,
+ "northbound": 24228,
+ "northcarolina": 43386,
+ "northe": 24675,
+ "northeast": 42673,
+ "northeast": 13009,
+ "northeastern": 28297,
+ "northeasthour": 42869,
+ "norther": 26908,
+ "northern": 17210,
+ "northern": 5049,
+ "northernlights": 48940,
+ "northkorea": 38495,
+ "northside": 45957,
+ "northumber": 22295,
+ "northumberland": 22922,
+ "northwales": 49371,
+ "northwest": 12894,
+ "northwestern": 23685,
+ "norton": 18032,
+ "norway": 8780,
+ "norwe": 14414,
+ "norwegian": 15971,
+ "norwich": 37629,
+ "norwich": 15812,
+ "norwood": 37889,
+ "nos": 13420,
+ "nose": 24192,
+ "nose": 8231,
+ "noses": 48163,
+ "nostal": 12076,
+ "nostalgia": 16622,
+ "nostalgic": 24468,
+ "not": 2534,
+ "not": 783,
+ "notable": 22023,
+ "notch": 19476,
+ "notdead": 42059,
+ "note": 10910,
+ "note": 3246,
+ "notebook": 16365,
+ "notebooks": 37623,
+ "noted": 22501,
+ "notes": 5795,
+ "nothin": 24291,
+ "nothing": 28412,
+ "nothing": 2586,
+ "noti": 10686,
+ "notic": 6915,
+ "notice": 6683,
+ "noticeable": 40857,
+ "noticed": 9324,
+ "notices": 33459,
+ "noticias": 47759,
+ "noticing": 37571,
+ "notification": 22512,
+ "notifications": 23169,
+ "notified": 39454,
+ "noting": 38649,
+ "notion": 37856,
+ "notjust": 33212,
+ "notjustlakes": 45803,
+ "notmy": 39301,
+ "noto": 29878,
+ "noton": 48258,
+ "notor": 21711,
+ "notori": 44065,
+ "notorious": 22489,
+ "notre": 24397,
+ "notre": 15306,
+ "notredame": 34077,
+ "notsorry": 34361,
+ "nott": 9333,
+ "nott": 34989,
+ "notte": 47308,
+ "nottingham": 12852,
+ "notts": 25598,
+ "nou": 8751,
+ "nou": 30953,
+ "noun": 33663,
+ "nouri": 23796,
+ "nourish": 46025,
+ "nourished": 48354,
+ "nous": 29485,
+ "nouveau": 29948,
+ "nouvel": 34215,
+ "nov": 2264,
+ "nov": 4293,
+ "nova": 11236,
+ "novak": 26465,
+ "novasco": 33785,
+ "novascotia": 34744,
+ "novation": 39753,
+ "nove": 30507,
+ "novel": 15044,
+ "novel": 6080,
+ "novelist": 27314,
+ "novella": 42770,
+ "novels": 16040,
+ "novelty": 37750,
+ "november": 3680,
+ "nover": 37465,
+ "novi": 47957,
+ "novice": 33743,
+ "novo": 27504,
+ "novo": 36581,
+ "now": 2040,
+ "now": 692,
+ "nowadays": 26155,
+ "nowhere": 14108,
+ "nowplaying": 3708,
+ "nowwatching": 30852,
+ "nox": 27406,
+ "noxi": 39304,
+ "noxious": 42833,
+ "noy": 32787,
+ "np": 18205,
+ "np": 6314,
+ "npa": 42378,
+ "npc": 33966,
+ "npr": 39941,
+ "npr": 24078,
+ "nps": 22025,
+ "npt": 47231,
+ "nr": 6574,
+ "nr": 9713,
+ "nra": 17286,
+ "nrc": 45786,
+ "nrf": 47982,
+ "nrg": 48662,
+ "nrl": 27142,
+ "nrl": 18127,
+ "ns": 12405,
+ "ns": 1373,
+ "nsa": 23004,
+ "nsc": 32792,
+ "nsd": 36659,
+ "nsf": 34180,
+ "nsfw": 19847,
+ "nsi": 47824,
+ "nsw": 21301,
+ "nsw": 11693,
+ "nswpol": 44434,
+ "nt": 10902,
+ "nt": 3207,
+ "ntr": 30845,
+ "nts": 43775,
+ "ntt": 22859,
+ "ntv": 24807,
+ "ntv": 45304,
+ "nu": 1156,
+ "nu": 9444,
+ "nucle": 25693,
+ "nuclear": 34136,
+ "nuclear": 7279,
+ "nude": 16630,
+ "nudes": 32122,
+ "nue": 22834,
+ "nuestra": 45649,
+ "nuestro": 38590,
+ "nuev": 47861,
+ "nueva": 48810,
+ "nuevo": 30265,
+ "nufc": 15720,
+ "nuff": 37324,
+ "nug": 13471,
+ "nugent": 47457,
+ "nugget": 25448,
+ "nuggets": 18970,
+ "nuh": 45950,
+ "nuit": 38815,
+ "nuk": 39228,
+ "nuke": 39399,
+ "nul": 29358,
+ "null": 47376,
+ "num": 17896,
+ "num": 30534,
+ "numb": 34639,
+ "numb": 39427,
+ "number": 44078,
+ "number": 2842,
+ "numbered": 25975,
+ "numbers": 6121,
+ "numer": 11442,
+ "numerous": 17082,
+ "numis": 39100,
+ "nun": 12511,
+ "nun": 28540,
+ "nunavut": 48626,
+ "nunes": 40697,
+ "nuns": 44061,
+ "nup": 46757,
+ "nur": 3920,
+ "nur": 33493,
+ "nure": 42480,
+ "nurse": 37547,
+ "nurse": 10058,
+ "nursery": 15540,
+ "nurses": 12938,
+ "nursing": 11126,
+ "nurture": 38865,
+ "nurturing": 45229,
+ "nus": 25157,
+ "nus": 18239,
+ "nut": 10358,
+ "nut": 6491,
+ "nutcracker": 36733,
+ "nutella": 27312,
+ "nutr": 6198,
+ "nutri": 15470,
+ "nutrient": 32900,
+ "nutrients": 24668,
+ "nutriti": 17978,
+ "nutrition": 41546,
+ "nutrition": 7989,
+ "nutritional": 26457,
+ "nutritious": 30387,
+ "nuts": 8644,
+ "nutshell": 26659,
+ "nutty": 39846,
+ "nv": 17217,
+ "nv": 16985,
+ "nvi": 22847,
+ "nvidia": 27325,
+ "nw": 7826,
+ "nw": 7030,
+ "nwa": 34237,
+ "nwo": 40976,
+ "nws": 23333,
+ "nws": 30998,
+ "nwsl": 48394,
+ "nwt": 25029,
+ "nx": 18810,
+ "nx": 16997,
+ "nxt": 35037,
+ "nxt": 17804,
+ "ny": 1383,
+ "ny": 1350,
+ "nya": 24165,
+ "nyc": 13304,
+ "nyc": 2832,
+ "nycc": 27187,
+ "nycfc": 47497,
+ "nye": 40723,
+ "nye": 13416,
+ "nyfw": 21089,
+ "nyk": 46841,
+ "nylon": 25915,
+ "nyo": 41534,
+ "nyo": 44586,
+ "nypd": 42293,
+ "nypd": 18279,
+ "nyr": 32538,
+ "nyrd": 47936,
+ "nys": 36375,
+ "nys": 23423,
+ "nyse": 32650,
+ "nyt": 46311,
+ "nyt": 12816,
+ "nytimes": 13772,
+ "nyu": 43143,
+ "nyu": 31355,
+ "nz": 10142,
+ "nz": 7082,
+ "o": 78,
+ "o": 334,
+ "oa": 11994,
+ "oahu": 37790,
+ "oak": 6010,
+ "oak": 7221,
+ "oakland": 42663,
+ "oakland": 12077,
+ "oakley": 27810,
+ "oaks": 16734,
+ "oakville": 38500,
+ "oasis": 18185,
+ "oat": 20095,
+ "oat": 34132,
+ "oates": 47094,
+ "oath": 20108,
+ "oatmeal": 26374,
+ "oats": 24150,
+ "oax": 43090,
+ "oaxaca": 47818,
+ "ob": 1411,
+ "ob": 14908,
+ "oba": 42902,
+ "oba": 15147,
+ "obam": 13174,
+ "obama": 4276,
+ "obamacare": 18005,
+ "obe": 11897,
+ "obe": 29117,
+ "obedience": 48921,
+ "ober": 15284,
+ "obese": 41757,
+ "obesity": 19499,
+ "obey": 26926,
+ "obi": 21454,
+ "obi": 18414,
+ "obile": 20513,
+ "obitu": 39218,
+ "obituary": 43580,
+ "objec": 7970,
+ "object": 14115,
+ "objective": 23663,
+ "objectives": 30238,
+ "objects": 13770,
+ "obl": 31452,
+ "oblast": 42672,
+ "obli": 11416,
+ "obligation": 34473,
+ "obligations": 38232,
+ "obligatory": 35020,
+ "oblivion": 45323,
+ "obo": 46001,
+ "obo": 26618,
+ "obrien": 31946,
+ "obs": 39162,
+ "obsc": 20392,
+ "obscure": 33337,
+ "obse": 8433,
+ "observ": 9050,
+ "observation": 20250,
+ "observations": 27409,
+ "observatory": 21236,
+ "observe": 23217,
+ "observed": 21267,
+ "observer": 22077,
+ "observers": 47544,
+ "observing": 28359,
+ "obsessed": 9744,
+ "obsession": 15718,
+ "obsi": 47323,
+ "obsole": 35561,
+ "obsolete": 40628,
+ "obst": 29398,
+ "obstac": 24075,
+ "obstacle": 29751,
+ "obstacles": 24480,
+ "obste": 49103,
+ "obstru": 44876,
+ "obstruc": 38762,
+ "obstruction": 40240,
+ "obtain": 26555,
+ "obtained": 29322,
+ "obvious": 13959,
+ "obviously": 10068,
+ "oc": 1566,
+ "oc": 6603,
+ "oca": 31120,
+ "ocal": 38148,
+ "occ": 43940,
+ "occa": 8530,
+ "occasion": 12280,
+ "occasional": 33059,
+ "occasionally": 32479,
+ "occasions": 26154,
+ "occer": 20804,
+ "occi": 42994,
+ "occu": 7863,
+ "occult": 42529,
+ "occup": 11152,
+ "occupation": 18624,
+ "occupational": 30644,
+ "occupied": 17271,
+ "occupy": 22453,
+ "occupy": 24210,
+ "occur": 11264,
+ "occur": 21813,
+ "occurred": 19850,
+ "occurrence": 40615,
+ "occurring": 31335,
+ "occurs": 26563,
+ "ocd": 35904,
+ "oce": 3509,
+ "ocean": 12941,
+ "ocean": 4918,
+ "oceans": 16792,
+ "och": 29334,
+ "och": 32011,
+ "oche": 33045,
+ "oci": 9891,
+ "ocity": 46039,
+ "ock": 33579,
+ "ock": 21313,
+ "ocks": 22410,
+ "oclock": 36274,
+ "oco": 32553,
+ "ocon": 33090,
+ "ocr": 45813,
+ "ocre": 40320,
+ "ocs": 27297,
+ "oct": 4565,
+ "octa": 23444,
+ "octag": 37768,
+ "octagon": 49167,
+ "octane": 43040,
+ "octavia": 47416,
+ "octo": 31032,
+ "october": 3481,
+ "octopus": 22327,
+ "ocu": 22709,
+ "oculus": 30082,
+ "od": 4886,
+ "od": 9719,
+ "oda": 24777,
+ "oday": 41954,
+ "odd": 15525,
+ "odd": 11387,
+ "oddly": 34213,
+ "odds": 11555,
+ "ode": 19125,
+ "ode": 19639,
+ "odell": 41556,
+ "odessa": 43574,
+ "odi": 12223,
+ "odi": 18853,
+ "odin": 35175,
+ "odisha": 15737,
+ "odo": 49188,
+ "odo": 40993,
+ "odor": 39509,
+ "odu": 35095,
+ "odu": 39904,
+ "odyssey": 19991,
+ "oe": 24251,
+ "oe": 11667,
+ "oec": 24288,
+ "oecd": 30816,
+ "oem": 29650,
+ "oes": 3643,
+ "of": 684,
+ "of": 539,
+ "ofa": 29774,
+ "ofc": 19877,
+ "ofe": 30000,
+ "ofer": 47322,
+ "off": 892,
+ "off": 1007,
+ "offe": 8261,
+ "offee": 34059,
+ "offen": 7231,
+ "offence": 34594,
+ "offences": 33972,
+ "offended": 30765,
+ "offender": 48294,
+ "offenders": 35878,
+ "offense": 15253,
+ "offensive": 11037,
+ "offer": 20607,
+ "offer": 3271,
+ "offered": 9395,
+ "offering": 6896,
+ "offerings": 24535,
+ "offers": 4679,
+ "offic": 3276,
+ "office": 18033,
+ "office": 2171,
+ "officeof": 38750,
+ "officeofrg": 47100,
+ "officer": 4683,
+ "officers": 6335,
+ "offices": 10933,
+ "offici": 1401,
+ "official": 5768,
+ "official": 1868,
+ "officially": 4226,
+ "officials": 7658,
+ "officiel": 26548,
+ "offl": 16851,
+ "offline": 22724,
+ "offro": 32198,
+ "offroad": 37173,
+ "offs": 23987,
+ "offseason": 25485,
+ "offset": 28843,
+ "offshore": 15496,
+ "offside": 49347,
+ "offspring": 38635,
+ "offthe": 38189,
+ "ofi": 36692,
+ "ofi": 49090,
+ "oficial": 18061,
+ "oft": 16693,
+ "oftball": 39768,
+ "often": 4864,
+ "ofthe": 7592,
+ "oftheday": 6988,
+ "oftheweek": 20654,
+ "oftheyear": 33975,
+ "og": 11542,
+ "og": 8555,
+ "oga": 47312,
+ "ogden": 42011,
+ "ogil": 39013,
+ "ography": 22399,
+ "ogue": 24761,
+ "ogun": 48970,
+ "oh": 5648,
+ "oh": 1779,
+ "ohana": 48330,
+ "ohh": 23076,
+ "ohhh": 27697,
+ "ohhhh": 40201,
+ "ohi": 5207,
+ "ohio": 18951,
+ "ohio": 6155,
+ "ohiostate": 41324,
+ "ohl": 45547,
+ "ohl": 41095,
+ "ohmy": 29758,
+ "ohn": 48043,
+ "ohs": 39542,
+ "ohwx": 47993,
+ "oi": 27357,
+ "oi": 13934,
+ "oic": 45554,
+ "oid": 14758,
+ "oids": 21847,
+ "oil": 11973,
+ "oil": 2870,
+ "oiland": 32316,
+ "oilandgas": 34130,
+ "oilers": 21627,
+ "oilpainting": 34279,
+ "oils": 17886,
+ "oily": 47550,
+ "oir": 48079,
+ "oir": 37113,
+ "ois": 23262,
+ "oit": 18453,
+ "oitnb": 34865,
+ "oj": 30986,
+ "oj": 34553,
+ "ok": 1944,
+ "ok": 2481,
+ "oka": 42258,
+ "oka": 19092,
+ "okan": 41263,
+ "okanagan": 43233,
+ "okay": 4917,
+ "okc": 42418,
+ "okc": 18357,
+ "oke": 26636,
+ "oke": 23598,
+ "oki": 20390,
+ "okin": 30687,
+ "okinawa": 35877,
+ "okla": 9431,
+ "oklahoma": 10170,
+ "oko": 26892,
+ "oko": 26095,
+ "okstate": 36356,
+ "oktoberfest": 32026,
+ "oku": 45010,
+ "oku": 43829,
+ "okwx": 27336,
+ "ol": 562,
+ "ol": 2985,
+ "ola": 20499,
+ "ola": 3373,
+ "olaf": 39709,
+ "olan": 48489,
+ "olan": 24227,
+ "oland": 26452,
+ "olas": 40800,
+ "old": 4931,
+ "old": 896,
+ "olde": 37731,
+ "older": 7700,
+ "oldest": 9285,
+ "oldham": 29929,
+ "oldie": 35280,
+ "oldies": 36278,
+ "oldman": 48614,
+ "olds": 8580,
+ "oldschool": 44384,
+ "oldschool": 25133,
+ "oldsmobile": 45396,
+ "ole": 9089,
+ "ole": 1947,
+ "oled": 46768,
+ "oler": 24069,
+ "oles": 16962,
+ "olf": 16346,
+ "olga": 34779,
+ "oli": 3811,
+ "oli": 8810,
+ "olic": 31341,
+ "oligar": 46185,
+ "olim": 47769,
+ "olin": 37823,
+ "olin": 18283,
+ "olina": 34711,
+ "oline": 17441,
+ "oling": 38033,
+ "olini": 36040,
+ "olis": 49397,
+ "olithic": 35574,
+ "olive": 22486,
+ "olive": 9898,
+ "oliver": 22882,
+ "oliver": 9261,
+ "olives": 27149,
+ "olivi": 20773,
+ "olivia": 11697,
+ "olivier": 23891,
+ "oll": 32270,
+ "oll": 15510,
+ "olla": 31908,
+ "ollie": 24434,
+ "olls": 42697,
+ "olly": 23998,
+ "olo": 14628,
+ "olo": 7606,
+ "ological": 12345,
+ "ologist": 23442,
+ "ologists": 30912,
+ "ology": 4627,
+ "olor": 29245,
+ "olph": 25077,
+ "ols": 2236,
+ "olsen": 26307,
+ "olson": 28046,
+ "olt": 46252,
+ "olu": 16502,
+ "olu": 46302,
+ "olulu": 27645,
+ "oly": 20323,
+ "oly": 24823,
+ "olym": 3594,
+ "olympi": 13597,
+ "olympia": 23965,
+ "olympiad": 47694,
+ "olympian": 25420,
+ "olympians": 44583,
+ "olympic": 26099,
+ "olympic": 6388,
+ "olympics": 7629,
+ "olympus": 30960,
+ "om": 547,
+ "om": 3932,
+ "oma": 44603,
+ "oma": 5358,
+ "omaha": 16509,
+ "oman": 22088,
+ "oman": 10871,
+ "omar": 19488,
+ "omar": 13367,
+ "omars": 37099,
+ "omas": 36023,
+ "omat": 40788,
+ "omb": 34447,
+ "ombe": 35967,
+ "omd": 49346,
+ "ome": 3693,
+ "ome": 5832,
+ "omed": 16835,
+ "omega": 13465,
+ "omelette": 38789,
+ "omen": 9969,
+ "omen": 25469,
+ "oment": 43683,
+ "omeo": 39844,
+ "omer": 24087,
+ "omer": 17902,
+ "omes": 25736,
+ "ometer": 20060,
+ "ometric": 38702,
+ "omez": 12541,
+ "omf": 47496,
+ "omfg": 12523,
+ "omg": 35233,
+ "omg": 3186,
+ "omi": 24097,
+ "omi": 10341,
+ "omic": 40536,
+ "omic": 12793,
+ "omics": 15138,
+ "omile": 46915,
+ "omin": 16457,
+ "omination": 42571,
+ "oming": 10796,
+ "ominous": 40914,
+ "omni": 18793,
+ "omni": 39489,
+ "omnibus": 44760,
+ "omnic": 48383,
+ "omo": 14478,
+ "omo": 11066,
+ "omon": 48758,
+ "omor": 29431,
+ "oms": 3770,
+ "omusic": 38965,
+ "omy": 40805,
+ "omy": 6884,
+ "on": 521,
+ "on": 525,
+ "ona": 2687,
+ "onair": 29511,
+ "onal": 918,
+ "onboard": 21689,
+ "once": 16331,
+ "once": 2654,
+ "onceupon": 28122,
+ "onceuponatime": 33505,
+ "onco": 46700,
+ "oncology": 24593,
+ "ond": 27918,
+ "ond": 2636,
+ "onda": 32643,
+ "onday": 29864,
+ "onde": 44532,
+ "ondo": 29529,
+ "ondon": 42043,
+ "ondon": 11851,
+ "one": 1980,
+ "one": 637,
+ "onec": 27746,
+ "oned": 28012,
+ "oned": 4698,
+ "onedirection": 16245,
+ "onee": 44433,
+ "oneill": 44808,
+ "onelove": 47417,
+ "onent": 12147,
+ "onents": 11709,
+ "oneof": 48478,
+ "onep": 20440,
+ "onepiece": 43153,
+ "oneplus": 25981,
+ "oner": 30055,
+ "oner": 6071,
+ "oners": 12324,
+ "ones": 20757,
+ "ones": 1575,
+ "oneself": 46874,
+ "onesie": 33237,
+ "oness": 25379,
+ "onet": 36058,
+ "oneteam": 41094,
+ "onetsy": 33392,
+ "onew": 43848,
+ "onews": 18696,
+ "onex": 49116,
+ "oney": 44498,
+ "oney": 9408,
+ "onf": 41790,
+ "onfox": 29874,
+ "ong": 2787,
+ "ong": 846,
+ "onga": 30259,
+ "ongchang": 35071,
+ "ongi": 21754,
+ "ongo": 31226,
+ "ongoing": 10393,
+ "ongs": 12143,
+ "oni": 4385,
+ "oni": 8048,
+ "onia": 8001,
+ "onial": 27599,
+ "onian": 21090,
+ "onic": 15838,
+ "onic": 3711,
+ "onica": 14631,
+ "onics": 9779,
+ "onie": 35249,
+ "onies": 22601,
+ "onimo": 41271,
+ "oning": 5197,
+ "onion": 10985,
+ "onions": 15255,
+ "onist": 10099,
+ "onists": 19659,
+ "onix": 27370,
+ "onized": 43657,
+ "onlin": 31103,
+ "online": 12940,
+ "online": 2027,
+ "onlinemarketing": 41820,
+ "onlineshopping": 38587,
+ "only": 11646,
+ "only": 1033,
+ "onlyin": 32947,
+ "onna": 25438,
+ "onna": 35458,
+ "onnaise": 48934,
+ "onne": 23466,
+ "onnell": 45613,
+ "ono": 28165,
+ "ono": 14388,
+ "onom": 48014,
+ "onomy": 36873,
+ "onpoli": 20708,
+ "ons": 26076,
+ "ons": 708,
+ "onsale": 36324,
+ "onset": 30527,
+ "onsite": 37336,
+ "onstage": 21821,
+ "onstorm": 49333,
+ "ont": 34303,
+ "ont": 11157,
+ "ontari": 6739,
+ "ontario": 42766,
+ "ontario": 7436,
+ "onte": 34723,
+ "onthe": 12241,
+ "onther": 46563,
+ "ontheroad": 47516,
+ "onthisday": 6862,
+ "onto": 11745,
+ "onto": 3141,
+ "ontology": 37364,
+ "ontour": 32155,
+ "onu": 44142,
+ "onward": 34827,
+ "onwards": 20682,
+ "ony": 9490,
+ "ony": 2926,
+ "onym": 11483,
+ "onymous": 13038,
+ "onyx": 31353,
+ "oo": 574,
+ "oo": 2822,
+ "ood": 16429,
+ "ood": 738,
+ "oodle": 45289,
+ "oods": 44660,
+ "oof": 42270,
+ "ooh": 16806,
+ "ook": 22326,
+ "ook": 8394,
+ "ooks": 31082,
+ "ool": 37702,
+ "ool": 929,
+ "oom": 22786,
+ "oom": 15002,
+ "oomf": 40607,
+ "oon": 35651,
+ "oon": 7100,
+ "ooo": 9571,
+ "oooh": 28927,
+ "oooo": 4002,
+ "oooo": 13643,
+ "ooooo": 12532,
+ "oooooo": 43590,
+ "oooooo": 20372,
+ "ooooooo": 30859,
+ "oooooooo": 15473,
+ "oooooooo": 43408,
+ "oooooooooooooooo": 48645,
+ "oop": 7326,
+ "ooper": 39906,
+ "oops": 9116,
+ "oor": 35239,
+ "oos": 9896,
+ "oosa": 30834,
+ "oose": 38941,
+ "oot": 17667,
+ "ootball": 28914,
+ "ootd": 16547,
+ "ooth": 12682,
+ "oott": 34316,
+ "ooza": 22809,
+ "op": 676,
+ "op": 3691,
+ "opa": 28949,
+ "opal": 28982,
+ "opar": 18167,
+ "opath": 33079,
+ "opathic": 37521,
+ "opathy": 28466,
+ "opau": 27239,
+ "opd": 38288,
+ "ope": 31694,
+ "ope": 11440,
+ "opec": 33138,
+ "opel": 36952,
+ "open": 3647,
+ "open": 1488,
+ "openaccess": 26591,
+ "opend": 28069,
+ "opendata": 35709,
+ "openday": 46991,
+ "opened": 5303,
+ "opener": 8998,
+ "openhouse": 36091,
+ "opening": 33728,
+ "opening": 2516,
+ "openingday": 36359,
+ "openings": 27643,
+ "openly": 23005,
+ "opens": 4801,
+ "opensource": 29930,
+ "oper": 2796,
+ "oper": 37533,
+ "opera": 8056,
+ "operate": 19306,
+ "operated": 23031,
+ "operates": 38675,
+ "operating": 12218,
+ "operation": 27173,
+ "operation": 7639,
+ "operational": 18237,
+ "operations": 8106,
+ "operative": 28380,
+ "operator": 15972,
+ "operators": 19267,
+ "opers": 48728,
+ "opes": 37258,
+ "oph": 6796,
+ "opha": 38634,
+ "ophel": 45017,
+ "ophelia": 49118,
+ "ophi": 44547,
+ "ophile": 35915,
+ "opho": 12900,
+ "ophobia": 21111,
+ "ophobic": 29934,
+ "ophon": 25120,
+ "ophone": 26345,
+ "ophthal": 33135,
+ "ophy": 28539,
+ "opi": 40056,
+ "opi": 48994,
+ "opin": 7636,
+ "opini": 14825,
+ "opinion": 7843,
+ "opinions": 16192,
+ "opio": 17371,
+ "opioid": 22833,
+ "opioids": 47578,
+ "opla": 36270,
+ "ople": 25663,
+ "opol": 15173,
+ "opoly": 23729,
+ "opor": 39650,
+ "opoulos": 42020,
+ "opp": 2020,
+ "opp": 21024,
+ "oppa": 23637,
+ "oppo": 7399,
+ "oppo": 41770,
+ "opponent": 17002,
+ "opponents": 19664,
+ "oppor": 2914,
+ "opportun": 2939,
+ "opportunities": 5978,
+ "opportunity": 4004,
+ "oppos": 10091,
+ "oppose": 23617,
+ "opposed": 22509,
+ "opposes": 47471,
+ "opposing": 24376,
+ "opposite": 12872,
+ "opposition": 11062,
+ "oppre": 17341,
+ "oppressed": 41492,
+ "oppression": 30650,
+ "opra": 28291,
+ "oprah": 22562,
+ "opry": 35340,
+ "ops": 3054,
+ "opt": 45103,
+ "opt": 27188,
+ "opted": 42035,
+ "opti": 6580,
+ "optic": 25190,
+ "optic": 24755,
+ "optical": 16822,
+ "optics": 27165,
+ "optim": 22331,
+ "optimal": 25235,
+ "optimi": 9737,
+ "optimis": 39459,
+ "optimism": 25226,
+ "optimist": 44581,
+ "optimistic": 23104,
+ "optimization": 25125,
+ "optimize": 30456,
+ "optimized": 43939,
+ "optimizing": 49157,
+ "optimum": 35974,
+ "optimus": 43453,
+ "option": 8464,
+ "optional": 25411,
+ "options": 7063,
+ "optome": 35533,
+ "opul": 39858,
+ "opus": 33295,
+ "opy": 21835,
+ "or": 523,
+ "or": 541,
+ "ora": 4301,
+ "orac": 24673,
+ "oracle": 37308,
+ "oracle": 15966,
+ "orah": 40820,
+ "orail": 45120,
+ "oral": 32490,
+ "oral": 6007,
+ "orama": 33619,
+ "oran": 32209,
+ "oran": 28395,
+ "orang": 22116,
+ "orange": 13957,
+ "orange": 4287,
+ "oranges": 32417,
+ "orangu": 36112,
+ "orb": 28894,
+ "orb": 36958,
+ "orbit": 19713,
+ "orbital": 40312,
+ "orc": 44305,
+ "orca": 18631,
+ "orcas": 47676,
+ "orch": 11893,
+ "orchar": 40226,
+ "orchard": 19530,
+ "orche": 8004,
+ "orchestr": 42937,
+ "orchestra": 9573,
+ "orchestral": 40285,
+ "orchi": 23696,
+ "orchid": 18678,
+ "orchids": 28376,
+ "ord": 26903,
+ "ord": 11502,
+ "orda": 33462,
+ "ordained": 38302,
+ "order": 24613,
+ "order": 2191,
+ "ordered": 8335,
+ "ordering": 19588,
+ "orderly": 43457,
+ "orders": 6187,
+ "ordin": 4378,
+ "ordinance": 38583,
+ "ordinary": 8012,
+ "ore": 3580,
+ "ore": 1423,
+ "orean": 36696,
+ "ored": 5133,
+ "oregon": 21759,
+ "oregon": 8035,
+ "oren": 21645,
+ "oreo": 21873,
+ "oreos": 41688,
+ "ores": 17328,
+ "org": 3401,
+ "org": 5593,
+ "organ": 3338,
+ "organ": 13213,
+ "organi": 3636,
+ "organic": 24080,
+ "organic": 5980,
+ "organics": 44199,
+ "organis": 13204,
+ "organisation": 15868,
+ "organisations": 20651,
+ "organise": 36073,
+ "organised": 13191,
+ "organiser": 49141,
+ "organisers": 35778,
+ "organising": 22787,
+ "organisms": 37041,
+ "organiz": 11107,
+ "organization": 8064,
+ "organizational": 29510,
+ "organizations": 13453,
+ "organize": 19973,
+ "organized": 10681,
+ "organizer": 23905,
+ "organizers": 27191,
+ "organizing": 15779,
+ "organs": 29872,
+ "orgs": 29500,
+ "ori": 1540,
+ "ori": 8693,
+ "oria": 11474,
+ "orial": 8648,
+ "orian": 21193,
+ "oric": 43810,
+ "orice": 41341,
+ "orie": 18815,
+ "orient": 13149,
+ "orient": 30770,
+ "oriental": 23056,
+ "orientation": 16873,
+ "oriente": 40390,
+ "oriented": 24596,
+ "orienteering": 42985,
+ "ories": 5934,
+ "orig": 2273,
+ "orig": 38463,
+ "origami": 31832,
+ "origin": 2555,
+ "origin": 12372,
+ "original": 18496,
+ "original": 3117,
+ "originally": 12849,
+ "originals": 16953,
+ "originated": 41823,
+ "origins": 16291,
+ "orin": 39863,
+ "oring": 3006,
+ "orio": 24308,
+ "orioles": 21430,
+ "orion": 21765,
+ "oris": 37064,
+ "orities": 7903,
+ "ority": 5556,
+ "orium": 12015,
+ "ork": 22202,
+ "ork": 37235,
+ "orkney": 34254,
+ "orl": 39465,
+ "orlando": 32247,
+ "orlando": 7827,
+ "orleans": 11127,
+ "orm": 38464,
+ "orn": 25412,
+ "orn": 8130,
+ "ornam": 36122,
+ "ornament": 23409,
+ "ornamental": 46270,
+ "ornaments": 28968,
+ "ornate": 46865,
+ "orni": 27713,
+ "ornithology": 38275,
+ "orns": 19340,
+ "oro": 9848,
+ "oro": 14573,
+ "orous": 19286,
+ "orph": 17318,
+ "orphan": 22718,
+ "orphan": 28994,
+ "orphanage": 45196,
+ "orphaned": 46792,
+ "orphans": 36588,
+ "orphe": 39186,
+ "orr": 32977,
+ "ors": 1127,
+ "orship": 20846,
+ "ort": 1019,
+ "ortega": 39727,
+ "orth": 22584,
+ "orth": 24461,
+ "ortho": 11366,
+ "orthodon": 37730,
+ "orthodox": 19008,
+ "orthop": 42123,
+ "orthopedic": 49341,
+ "ortiz": 23544,
+ "orton": 37238,
+ "oru": 44629,
+ "oru": 31281,
+ "orum": 42724,
+ "orwell": 41218,
+ "ory": 16983,
+ "ory": 1985,
+ "os": 2211,
+ "os": 1299,
+ "osa": 16340,
+ "osa": 17237,
+ "osaka": 21347,
+ "osborne": 22402,
+ "osbourne": 43376,
+ "osc": 5092,
+ "oscar": 21157,
+ "oscar": 8191,
+ "oscars": 11098,
+ "osce": 37303,
+ "oscill": 38272,
+ "ose": 46942,
+ "ose": 22541,
+ "osh": 30717,
+ "osh": 35011,
+ "osha": 33907,
+ "oshi": 34770,
+ "osi": 25247,
+ "osi": 17636,
+ "osis": 13903,
+ "osity": 12730,
+ "oslo": 20547,
+ "osm": 31626,
+ "osman": 46539,
+ "oso": 42793,
+ "oso": 21285,
+ "osp": 24387,
+ "ospre": 49001,
+ "osprey": 37893,
+ "oss": 29362,
+ "oss": 34640,
+ "ost": 23701,
+ "ost": 18749,
+ "oste": 20632,
+ "osteo": 43163,
+ "oster": 31781,
+ "ostr": 33673,
+ "ostrich": 47640,
+ "osu": 29480,
+ "osu": 19818,
+ "oswald": 38471,
+ "ot": 1863,
+ "ot": 2062,
+ "ota": 17509,
+ "ota": 8741,
+ "otago": 45919,
+ "otaku": 40743,
+ "otas": 47616,
+ "otc": 37934,
+ "otd": 5683,
+ "ote": 28511,
+ "ote": 19744,
+ "otes": 27280,
+ "oth": 33262,
+ "oth": 33519,
+ "other": 9758,
+ "other": 1010,
+ "others": 3326,
+ "otherwise": 12376,
+ "oti": 19567,
+ "oti": 45564,
+ "otic": 9671,
+ "otis": 28246,
+ "otive": 10877,
+ "oto": 23946,
+ "oto": 23399,
+ "otp": 29822,
+ "otr": 38685,
+ "ots": 5769,
+ "ott": 10167,
+ "ott": 7936,
+ "otta": 7623,
+ "otta": 20941,
+ "ottawa": 49027,
+ "ottawa": 9019,
+ "otte": 35214,
+ "otter": 34710,
+ "otter": 22456,
+ "otters": 38883,
+ "otti": 36721,
+ "ottnews": 33995,
+ "otto": 17730,
+ "ottoman": 27503,
+ "otw": 35259,
+ "otwol": 46868,
+ "ou": 520,
+ "ou": 6544,
+ "ouat": 32954,
+ "ouch": 13493,
+ "oud": 1359,
+ "oue": 48838,
+ "ouf": 34618,
+ "ough": 4204,
+ "ough": 991,
+ "ought": 2253,
+ "oughton": 36860,
+ "oui": 39421,
+ "ouk": 21796,
+ "oul": 20253,
+ "oul": 8081,
+ "ould": 859,
+ "oulos": 32808,
+ "oun": 636,
+ "oun": 20960,
+ "ounce": 15027,
+ "ounces": 30299,
+ "ound": 2013,
+ "ound": 853,
+ "oundation": 40132,
+ "ounded": 9634,
+ "ounding": 11944,
+ "ounds": 2753,
+ "oung": 35875,
+ "oung": 25341,
+ "ounge": 29427,
+ "ount": 43801,
+ "ount": 4172,
+ "ounts": 10963,
+ "oup": 32815,
+ "our": 727,
+ "our": 581,
+ "oura": 29806,
+ "oura": 36352,
+ "ourable": 24126,
+ "ourage": 34525,
+ "oural": 45840,
+ "oured": 6956,
+ "ouri": 12696,
+ "ouring": 12000,
+ "ourism": 25496,
+ "ourke": 26480,
+ "ourlives": 37541,
+ "ouro": 41224,
+ "ours": 1491,
+ "ourse": 15415,
+ "ourselves": 10124,
+ "ourt": 22960,
+ "oury": 29484,
+ "ous": 1987,
+ "ous": 879,
+ "ouse": 32048,
+ "ouse": 7603,
+ "ouses": 33666,
+ "ously": 2501,
+ "ousness": 10689,
+ "ousy": 28302,
+ "out": 1130,
+ "out": 620,
+ "outa": 35187,
+ "outage": 27320,
+ "outages": 40353,
+ "outback": 28532,
+ "outbound": 41256,
+ "outbreak": 20103,
+ "outcome": 16552,
+ "outcomes": 14016,
+ "outdated": 38313,
+ "outdoor": 19184,
+ "outdoor": 6368,
+ "outdoors": 10469,
+ "oute": 44180,
+ "outed": 34435,
+ "outer": 30499,
+ "outer": 14188,
+ "outes": 39600,
+ "outfield": 41826,
+ "outfit": 6525,
+ "outfits": 16366,
+ "outfitters": 37725,
+ "outfy": 34920,
+ "outgoing": 27302,
+ "outh": 16933,
+ "outh": 8111,
+ "outine": 35452,
+ "outing": 11251,
+ "outlander": 45820,
+ "outlander": 17095,
+ "outlaw": 37498,
+ "outlaw": 27340,
+ "outlaws": 30935,
+ "outlet": 16855,
+ "outlets": 20822,
+ "outline": 26894,
+ "outlines": 29159,
+ "outlining": 45960,
+ "outlook": 12983,
+ "outof": 43958,
+ "outpatient": 46603,
+ "outpost": 44622,
+ "output": 17255,
+ "outra": 14262,
+ "outrage": 23577,
+ "outraged": 43402,
+ "outrageous": 29342,
+ "outre": 14373,
+ "outreach": 15297,
+ "outright": 38200,
+ "outs": 5790,
+ "outsi": 22515,
+ "outside": 47693,
+ "outside": 2782,
+ "outsider": 41196,
+ "outsiders": 41742,
+ "outskirts": 42088,
+ "outsourcing": 34543,
+ "outstanding": 6387,
+ "outta": 15807,
+ "outtuesday": 48692,
+ "outw": 34650,
+ "oux": 40960,
+ "oux": 14228,
+ "ov": 6420,
+ "ov": 8479,
+ "ova": 12762,
+ "oval": 15039,
+ "ovarian": 42913,
+ "ovation": 24333,
+ "ove": 8649,
+ "ove": 15456,
+ "oven": 44620,
+ "oven": 12579,
+ "over": 1658,
+ "over": 962,
+ "overall": 6914,
+ "overboard": 42982,
+ "overcame": 47235,
+ "overcast": 36942,
+ "overcome": 14365,
+ "overcoming": 29348,
+ "overdose": 27017,
+ "overdrive": 40088,
+ "overdue": 30240,
+ "overflow": 32885,
+ "overflowing": 45370,
+ "overhaul": 31531,
+ "overhead": 20321,
+ "overland": 38808,
+ "overlay": 44827,
+ "overload": 24327,
+ "overlook": 35767,
+ "overlooked": 27632,
+ "overlooking": 17319,
+ "overly": 28820,
+ "overnight": 9913,
+ "overpass": 44310,
+ "overrated": 38214,
+ "overs": 45774,
+ "overs": 17329,
+ "overseas": 15100,
+ "oversight": 32494,
+ "oversized": 31557,
+ "overtime": 19347,
+ "overturned": 31048,
+ "overview": 14789,
+ "overwatch": 18124,
+ "overweight": 43465,
+ "overwhel": 12204,
+ "overwhelmed": 23459,
+ "overwhelming": 20306,
+ "overwhelmingly": 43549,
+ "ovi": 32508,
+ "ovic": 22417,
+ "ovich": 27623,
+ "ovie": 47677,
+ "ovo": 41920,
+ "ovo": 18065,
+ "ovski": 26167,
+ "ow": 2032,
+ "ow": 2250,
+ "owa": 32770,
+ "owe": 19073,
+ "owed": 37641,
+ "owen": 24838,
+ "owen": 12056,
+ "owens": 20664,
+ "owes": 35069,
+ "owing": 48582,
+ "owl": 34332,
+ "owl": 9899,
+ "owls": 18247,
+ "own": 3845,
+ "own": 1758,
+ "owned": 8536,
+ "owner": 5019,
+ "owners": 7712,
+ "ownership": 16583,
+ "owning": 24661,
+ "owns": 17533,
+ "owo": 46142,
+ "ows": 27423,
+ "owski": 22573,
+ "ox": 3282,
+ "ox": 12071,
+ "oxfam": 45466,
+ "oxford": 28588,
+ "oxford": 8824,
+ "oxfordshire": 37855,
+ "oxi": 33731,
+ "oxi": 48147,
+ "oxid": 17701,
+ "oxide": 28235,
+ "oxo": 37088,
+ "oxy": 12432,
+ "oxygen": 16214,
+ "oy": 6638,
+ "oy": 12437,
+ "oya": 38894,
+ "oye": 48677,
+ "oyster": 40545,
+ "oyster": 17253,
+ "oysters": 22672,
+ "oz": 10584,
+ "oz": 6044,
+ "ozar": 31848,
+ "ozil": 41365,
+ "ozone": 37052,
+ "ozzy": 39549,
+ "p": 79,
+ "p": 335,
+ "pa": 765,
+ "pa": 2217,
+ "paa": 32812,
+ "pab": 9354,
+ "pablo": 42172,
+ "pablo": 14473,
+ "pac": 2332,
+ "pac": 7608,
+ "pace": 40600,
+ "pace": 9450,
+ "paced": 32611,
+ "pacers": 23976,
+ "paces": 43001,
+ "paci": 5699,
+ "pacific": 19723,
+ "pacific": 6654,
+ "pacing": 45202,
+ "pack": 2711,
+ "pack": 3420,
+ "package": 7053,
+ "packaged": 29656,
+ "packages": 14305,
+ "packaging": 11658,
+ "packard": 46421,
+ "packed": 5883,
+ "packer": 28209,
+ "packers": 14294,
+ "packet": 25022,
+ "packets": 40448,
+ "packing": 9829,
+ "packs": 11086,
+ "paco": 41364,
+ "pacqui": 28456,
+ "pacquiao": 30485,
+ "pact": 27182,
+ "pad": 3798,
+ "pad": 7601,
+ "padded": 42253,
+ "paddington": 33162,
+ "paddle": 38276,
+ "paddle": 20811,
+ "paddling": 40645,
+ "paddock": 29590,
+ "paddy": 33103,
+ "paddy": 19855,
+ "padi": 47037,
+ "padilla": 22380,
+ "padma": 44595,
+ "padma": 46457,
+ "padre": 38343,
+ "padres": 22829,
+ "pads": 17353,
+ "paedi": 41488,
+ "paella": 46924,
+ "paf": 47185,
+ "pafc": 49259,
+ "pag": 4151,
+ "pag": 30525,
+ "pagan": 27854,
+ "page": 14996,
+ "page": 2504,
+ "pageant": 22139,
+ "pages": 8082,
+ "pagoda": 44309,
+ "pah": 41054,
+ "pah": 26884,
+ "pai": 20624,
+ "pai": 21198,
+ "paid": 5057,
+ "paige": 33659,
+ "paige": 16022,
+ "paign": 31796,
+ "pain": 2141,
+ "pain": 4495,
+ "paine": 38069,
+ "painful": 16361,
+ "pains": 25639,
+ "paint": 7948,
+ "paint": 5185,
+ "paintball": 39730,
+ "painted": 6433,
+ "painter": 10888,
+ "painters": 35703,
+ "painting": 49164,
+ "painting": 3086,
+ "paintings": 9956,
+ "paints": 21672,
+ "pair": 19848,
+ "pair": 4038,
+ "paired": 12433,
+ "pairing": 16313,
+ "pairings": 41152,
+ "pairs": 9950,
+ "pais": 16878,
+ "paisley": 22954,
+ "pajam": 24110,
+ "pajama": 40244,
+ "pajamas": 37231,
+ "pak": 13186,
+ "pak": 9094,
+ "paki": 3438,
+ "pakistan": 10713,
+ "pakistan": 3994,
+ "pakistani": 14050,
+ "pakistanis": 45707,
+ "pakv": 38196,
+ "pal": 1850,
+ "pal": 3611,
+ "pala": 17895,
+ "palace": 6381,
+ "palaces": 45625,
+ "palad": 28371,
+ "palae": 43379,
+ "palais": 35673,
+ "palate": 34666,
+ "palawan": 48202,
+ "palazzo": 36006,
+ "pale": 4768,
+ "pale": 12518,
+ "paleo": 36741,
+ "paleo": 22198,
+ "paler": 38028,
+ "palermo": 40635,
+ "palestin": 9449,
+ "palestine": 11682,
+ "palestinian": 11764,
+ "palestinians": 21874,
+ "palette": 13901,
+ "pali": 48063,
+ "palin": 40153,
+ "palis": 44256,
+ "pality": 27296,
+ "pall": 35817,
+ "palla": 21208,
+ "palladium": 37888,
+ "pallet": 39057,
+ "palli": 28954,
+ "palliative": 46014,
+ "pally": 46073,
+ "palm": 19651,
+ "palm": 8612,
+ "palma": 29888,
+ "palmer": 40112,
+ "palmer": 13633,
+ "palms": 27059,
+ "palo": 31562,
+ "palom": 47698,
+ "palooza": 25861,
+ "pals": 11043,
+ "palsy": 46651,
+ "pam": 8228,
+ "pam": 18513,
+ "pamela": 26991,
+ "pamp": 37653,
+ "pamper": 44345,
+ "pamph": 41332,
+ "pan": 1072,
+ "pan": 7437,
+ "panam": 24606,
+ "panama": 15522,
+ "panas": 26207,
+ "panasonic": 29750,
+ "pancake": 18723,
+ "pancakes": 15308,
+ "panch": 27251,
+ "pancra": 42472,
+ "pancre": 27708,
+ "pancreatic": 49337,
+ "pancy": 41625,
+ "pand": 5631,
+ "panda": 12952,
+ "pandas": 35119,
+ "pande": 38419,
+ "pandey": 34895,
+ "pandit": 41191,
+ "pandor": 30250,
+ "pandora": 17727,
+ "pandoramusic": 42344,
+ "pane": 27470,
+ "panel": 3724,
+ "paneli": 19410,
+ "panelist": 39719,
+ "panelists": 24619,
+ "panels": 12735,
+ "panera": 48471,
+ "pang": 16756,
+ "pang": 23672,
+ "panhandle": 40919,
+ "pani": 36092,
+ "panic": 46671,
+ "panic": 14124,
+ "panini": 30410,
+ "pann": 42302,
+ "panna": 49065,
+ "pano": 36165,
+ "panor": 12962,
+ "panorama": 19763,
+ "panoramic": 22563,
+ "pans": 35204,
+ "pant": 22550,
+ "panther": 22825,
+ "panther": 13262,
+ "panthers": 10494,
+ "panties": 32515,
+ "panto": 28776,
+ "pantry": 25608,
+ "pants": 5003,
+ "panty": 44217,
+ "pany": 45567,
+ "panzer": 41159,
+ "pao": 33790,
+ "paola": 44689,
+ "paolo": 48488,
+ "paolo": 21133,
+ "pap": 1884,
+ "pap": 30756,
+ "papa": 12211,
+ "papar": 32782,
+ "paparazzi": 37842,
+ "papaya": 44098,
+ "paper": 8680,
+ "paper": 2802,
+ "paperback": 17928,
+ "papers": 8204,
+ "paperwork": 35785,
+ "papi": 35177,
+ "papp": 26361,
+ "paprika": 44793,
+ "papua": 32629,
+ "par": 699,
+ "par": 9163,
+ "para": 18355,
+ "para": 8976,
+ "parach": 23147,
+ "parachute": 30122,
+ "parad": 37143,
+ "parade": 5809,
+ "parades": 46479,
+ "paradi": 6658,
+ "paradig": 27786,
+ "paradigm": 33485,
+ "paradise": 45869,
+ "paradise": 7247,
+ "paradox": 33109,
+ "parag": 11866,
+ "paragon": 48099,
+ "paragra": 24903,
+ "paragraph": 28499,
+ "paragu": 38021,
+ "paraguay": 43579,
+ "paral": 15143,
+ "paralle": 13184,
+ "parallel": 18201,
+ "paralleled": 42520,
+ "parallels": 46101,
+ "paraly": 30255,
+ "paralym": 18727,
+ "paralympic": 30806,
+ "paralympics": 37162,
+ "paralysis": 45702,
+ "param": 12250,
+ "parame": 27106,
+ "paramedic": 34630,
+ "paramedics": 35991,
+ "parameters": 44890,
+ "paramore": 34401,
+ "paramount": 26642,
+ "parano": 30283,
+ "paranoid": 43029,
+ "paranor": 16940,
+ "paranormal": 19047,
+ "parap": 41091,
+ "paras": 15198,
+ "parasite": 42460,
+ "parasites": 46175,
+ "parc": 30914,
+ "parcel": 30367,
+ "parcels": 45589,
+ "pard": 18773,
+ "pardon": 47606,
+ "pardon": 26565,
+ "pare": 18202,
+ "pared": 5498,
+ "paren": 3106,
+ "parent": 47848,
+ "parent": 10183,
+ "parental": 28339,
+ "parenthood": 23887,
+ "parenting": 14529,
+ "parents": 3731,
+ "pares": 12420,
+ "parfait": 46140,
+ "pari": 17961,
+ "pari": 27979,
+ "paris": 13982,
+ "paris": 3445,
+ "parisagreement": 47405,
+ "parish": 47328,
+ "parish": 13020,
+ "parisi": 45081,
+ "parisian": 38512,
+ "parity": 42734,
+ "park": 4985,
+ "park": 1452,
+ "parked": 16487,
+ "parker": 31119,
+ "parker": 8365,
+ "parkin": 34868,
+ "parking": 5984,
+ "parkinson": 28129,
+ "parkland": 31287,
+ "parkrun": 25747,
+ "parks": 6873,
+ "parkway": 19882,
+ "parl": 30373,
+ "parl": 29897,
+ "parliam": 5941,
+ "parliament": 41599,
+ "parliament": 7151,
+ "parliamentary": 17912,
+ "parlor": 38253,
+ "parlour": 37829,
+ "parma": 36077,
+ "parme": 26295,
+ "parmesan": 27274,
+ "paro": 17429,
+ "parody": 24318,
+ "parole": 32158,
+ "parr": 44113,
+ "parrish": 43043,
+ "parrot": 23565,
+ "parry": 40604,
+ "parsley": 30077,
+ "parsons": 22505,
+ "part": 1872,
+ "part": 1551,
+ "parte": 48508,
+ "parth": 34790,
+ "parti": 10509,
+ "partial": 18957,
+ "partially": 21269,
+ "partic": 2871,
+ "partici": 9540,
+ "particip": 4400,
+ "participant": 27674,
+ "participants": 10237,
+ "participate": 9433,
+ "participated": 14252,
+ "participates": 46414,
+ "participating": 11535,
+ "participation": 13529,
+ "particle": 27716,
+ "particles": 27012,
+ "particul": 11408,
+ "particular": 14098,
+ "particularly": 12170,
+ "parties": 9032,
+ "parting": 32844,
+ "partisan": 20772,
+ "partist": 44713,
+ "partition": 42219,
+ "partly": 21459,
+ "partner": 5210,
+ "partner": 4568,
+ "partnered": 21402,
+ "partnering": 21182,
+ "partners": 5568,
+ "partnership": 6123,
+ "partnerships": 17418,
+ "parton": 43245,
+ "partridge": 34872,
+ "parts": 5149,
+ "party": 12877,
+ "party": 1580,
+ "partying": 25702,
+ "pas": 1341,
+ "pas": 9525,
+ "pasadena": 25892,
+ "pascal": 28626,
+ "pasco": 49220,
+ "pascu": 42692,
+ "pash": 23936,
+ "pasha": 46986,
+ "paso": 18542,
+ "pasqu": 44941,
+ "pass": 5016,
+ "pass": 3511,
+ "passage": 16477,
+ "passages": 48937,
+ "passed": 4957,
+ "passenger": 12311,
+ "passengers": 12781,
+ "passer": 48544,
+ "passes": 7633,
+ "passi": 32471,
+ "passing": 6589,
+ "passion": 8822,
+ "passion": 5332,
+ "passionate": 10947,
+ "passionately": 44028,
+ "passions": 38441,
+ "passive": 23171,
+ "passover": 38426,
+ "passport": 14739,
+ "passports": 46368,
+ "password": 20258,
+ "passwords": 43095,
+ "past": 7315,
+ "past": 2729,
+ "pasta": 10441,
+ "paste": 34765,
+ "paste": 17038,
+ "pastel": 19457,
+ "pastels": 45699,
+ "pastor": 19792,
+ "pastor": 9664,
+ "pastoral": 37191,
+ "pastors": 30959,
+ "pastr": 45478,
+ "pastries": 39409,
+ "pastry": 18582,
+ "pasture": 34764,
+ "pastures": 47793,
+ "pat": 1300,
+ "pat": 7036,
+ "patag": 29862,
+ "patagonia": 32786,
+ "patch": 29284,
+ "patch": 8721,
+ "patches": 22104,
+ "patchwork": 44675,
+ "patchy": 47488,
+ "pate": 42122,
+ "pate": 42098,
+ "patel": 14168,
+ "patent": 14692,
+ "patented": 37277,
+ "patents": 33911,
+ "paterson": 36560,
+ "path": 7408,
+ "path": 5035,
+ "pathetic": 18222,
+ "pathfinder": 35415,
+ "pathi": 34976,
+ "pathi": 27347,
+ "pathic": 49025,
+ "patho": 18534,
+ "pathology": 23290,
+ "paths": 16333,
+ "pathway": 23488,
+ "pathways": 24690,
+ "pathy": 13330,
+ "pati": 2799,
+ "pati": 26708,
+ "patience": 13575,
+ "patient": 30139,
+ "patient": 6262,
+ "patiently": 22980,
+ "patients": 5543,
+ "patil": 49187,
+ "patio": 14304,
+ "pational": 30627,
+ "patna": 45025,
+ "patory": 41859,
+ "patreon": 17165,
+ "patri": 4771,
+ "patriarch": 49054,
+ "patriarchy": 48806,
+ "patric": 12569,
+ "patrice": 40731,
+ "patricia": 18143,
+ "patrick": 12078,
+ "patrick": 5286,
+ "patricks": 46783,
+ "patriot": 28896,
+ "patriot": 15692,
+ "patrioti": 35520,
+ "patriotic": 20217,
+ "patriotism": 35807,
+ "patriots": 8707,
+ "patro": 31650,
+ "patrol": 10073,
+ "patrolling": 39344,
+ "patrols": 35978,
+ "patron": 26658,
+ "patron": 17683,
+ "patrons": 28308,
+ "pats": 24874,
+ "patsy": 46093,
+ "patt": 12637,
+ "patter": 4982,
+ "pattern": 7447,
+ "patterned": 47212,
+ "patterns": 11637,
+ "patterson": 21384,
+ "patti": 44927,
+ "patti": 26123,
+ "pattinson": 32474,
+ "patton": 29026,
+ "patty": 48741,
+ "patty": 18321,
+ "pau": 1834,
+ "pau": 35970,
+ "paul": 6035,
+ "paul": 2597,
+ "paula": 37363,
+ "paula": 16777,
+ "pauline": 30438,
+ "paulo": 48002,
+ "paulo": 21628,
+ "pauls": 41413,
+ "pauls": 40010,
+ "paulson": 48201,
+ "pause": 19439,
+ "paused": 46782,
+ "pav": 6661,
+ "pave": 37107,
+ "paved": 27898,
+ "pavel": 43152,
+ "pavement": 27669,
+ "pavilion": 13374,
+ "paving": 28651,
+ "paw": 14009,
+ "paw": 16016,
+ "pawan": 29754,
+ "pawankalyan": 33702,
+ "pawn": 43195,
+ "paws": 16714,
+ "pax": 20007,
+ "pax": 19033,
+ "paxton": 38347,
+ "pay": 2642,
+ "pay": 3345,
+ "payback": 36413,
+ "paycheck": 45078,
+ "payday": 26957,
+ "payee": 46985,
+ "payer": 41503,
+ "paying": 8341,
+ "payment": 10596,
+ "payments": 11832,
+ "payne": 12775,
+ "paypal": 21442,
+ "payroll": 31610,
+ "pays": 10845,
+ "paysoff": 48174,
+ "paytm": 45352,
+ "payton": 27348,
+ "paz": 22267,
+ "pb": 20112,
+ "pb": 10981,
+ "pba": 28205,
+ "pbb": 48567,
+ "pbb": 40589,
+ "pbc": 49191,
+ "pbl": 35166,
+ "pbr": 32998,
+ "pbs": 17908,
+ "pc": 6782,
+ "pc": 3808,
+ "pca": 35705,
+ "pcb": 26235,
+ "pcc": 36059,
+ "pci": 38957,
+ "pcm": 47436,
+ "pcr": 35704,
+ "pcs": 11917,
+ "pcso": 31963,
+ "pct": 22168,
+ "pd": 4387,
+ "pd": 4675,
+ "pdates": 16842,
+ "pdc": 40498,
+ "pdf": 15181,
+ "pdp": 24601,
+ "pdt": 21743,
+ "pdx": 25470,
+ "pdx": 16153,
+ "pe": 661,
+ "pe": 956,
+ "pea": 13915,
+ "peabo": 34083,
+ "peabody": 41244,
+ "peac": 34615,
+ "peace": 6249,
+ "peace": 3021,
+ "peaceful": 9461,
+ "peacefully": 30530,
+ "peacekeeping": 43630,
+ "peach": 10522,
+ "peach": 11538,
+ "peaches": 27216,
+ "peak": 18572,
+ "peak": 6026,
+ "peakdistrict": 41289,
+ "peake": 24810,
+ "peaked": 36391,
+ "peaks": 14067,
+ "pean": 11563,
+ "peanu": 25843,
+ "peanut": 12491,
+ "peanuts": 26503,
+ "pear": 4910,
+ "pear": 18820,
+ "pearce": 25996,
+ "pearl": 21806,
+ "pearl": 8560,
+ "pearljam": 46739,
+ "pearls": 19581,
+ "pears": 39565,
+ "pearson": 20461,
+ "peas": 15937,
+ "peasant": 40621,
+ "peasants": 48788,
+ "peat": 26914,
+ "pebble": 28056,
+ "pebbles": 40155,
+ "pec": 32447,
+ "pec": 17611,
+ "pecan": 32177,
+ "peck": 25186,
+ "peck": 29234,
+ "pecker": 30169,
+ "peckham": 45863,
+ "pecu": 34200,
+ "peculiar": 42808,
+ "ped": 13197,
+ "ped": 2966,
+ "pedago": 34590,
+ "pedagogy": 48072,
+ "pedal": 32943,
+ "pedal": 19621,
+ "pedals": 38535,
+ "pede": 12862,
+ "pede": 19560,
+ "pedestri": 30027,
+ "pedestrian": 18256,
+ "pedestrians": 33895,
+ "pedi": 12967,
+ "pedia": 11733,
+ "pediatric": 48431,
+ "pediatric": 22071,
+ "pedic": 35319,
+ "pedic": 44528,
+ "pedro": 29963,
+ "pedro": 15114,
+ "peds": 45377,
+ "pee": 12988,
+ "pee": 11196,
+ "peed": 47369,
+ "peek": 46323,
+ "peek": 7569,
+ "peeking": 48771,
+ "peel": 34386,
+ "peel": 17158,
+ "peeled": 33533,
+ "peeling": 48649,
+ "peep": 25425,
+ "peep": 16857,
+ "peeps": 11681,
+ "peer": 32416,
+ "peer": 14432,
+ "peers": 21626,
+ "pees": 31830,
+ "peg": 32182,
+ "peg": 11207,
+ "pegas": 30018,
+ "pegasus": 37822,
+ "peggy": 24271,
+ "pei": 48166,
+ "pei": 12917,
+ "pel": 4286,
+ "pel": 7006,
+ "pele": 44105,
+ "pelican": 34131,
+ "pelicans": 29363,
+ "pell": 46981,
+ "pelle": 31267,
+ "pelled": 32506,
+ "pellegr": 38529,
+ "pellets": 48240,
+ "pelo": 40192,
+ "pelo": 40238,
+ "pelosi": 22169,
+ "pelvic": 45646,
+ "pemb": 19880,
+ "pembro": 24084,
+ "pembroke": 36702,
+ "pembroke": 40044,
+ "pembrokeshire": 40695,
+ "pen": 1501,
+ "pen": 5356,
+ "pena": 35788,
+ "penalties": 25417,
+ "penalty": 11491,
+ "penang": 29545,
+ "penc": 20065,
+ "pence": 18002,
+ "pencil": 41303,
+ "pencil": 11200,
+ "pencils": 21909,
+ "pend": 3052,
+ "pendant": 12415,
+ "pendants": 44117,
+ "pending": 12770,
+ "pendleton": 44272,
+ "pendu": 45336,
+ "penelope": 36703,
+ "penetr": 26058,
+ "peng": 42955,
+ "peng": 39200,
+ "pengu": 8854,
+ "penguin": 28249,
+ "penguin": 14952,
+ "penguins": 16557,
+ "peninsu": 13464,
+ "peninsula": 14070,
+ "penn": 7760,
+ "penn": 11128,
+ "pennant": 43971,
+ "penned": 45077,
+ "penney": 47856,
+ "pennies": 43094,
+ "pennsylvania": 13673,
+ "penny": 20400,
+ "penny": 11388,
+ "pens": 13307,
+ "pens": 13310,
+ "pensac": 30925,
+ "pensacola": 33573,
+ "pension": 32840,
+ "pension": 17764,
+ "pensions": 29773,
+ "penske": 47154,
+ "pent": 10699,
+ "pent": 22725,
+ "pentagon": 23133,
+ "pente": 33165,
+ "penthouse": 32673,
+ "penultimate": 36553,
+ "peop": 1030,
+ "people": 10573,
+ "people": 1047,
+ "peoples": 28241,
+ "peoples": 14627,
+ "peopleschoice": 32418,
+ "peoplesvote": 45830,
+ "peoria": 36985,
+ "pep": 12761,
+ "pep": 14898,
+ "pepe": 24778,
+ "pepp": 34425,
+ "pepper": 14861,
+ "pepper": 8253,
+ "peppermint": 30321,
+ "pepperoni": 47307,
+ "peppers": 14650,
+ "pepsi": 21307,
+ "per": 703,
+ "per": 1284,
+ "pera": 26294,
+ "perce": 24135,
+ "perceived": 38436,
+ "percent": 16328,
+ "percent": 9017,
+ "percentage": 19477,
+ "percep": 28017,
+ "perception": 20591,
+ "perceptions": 38138,
+ "perch": 34281,
+ "perched": 40071,
+ "percu": 41722,
+ "percussion": 23980,
+ "percy": 23940,
+ "pere": 8665,
+ "pere": 36300,
+ "pered": 24509,
+ "peregr": 37479,
+ "peregrine": 44546,
+ "pereira": 43927,
+ "peren": 24564,
+ "perenni": 26996,
+ "perennial": 34038,
+ "perez": 15107,
+ "perf": 22816,
+ "perfe": 1624,
+ "perfec": 6599,
+ "perfect": 17261,
+ "perfect": 1878,
+ "perfection": 9646,
+ "perfectly": 8037,
+ "perfecto": 42898,
+ "perfor": 2311,
+ "perform": 3866,
+ "perform": 5940,
+ "performan": 8973,
+ "performance": 2714,
+ "performances": 9553,
+ "performed": 9997,
+ "performer": 17061,
+ "performers": 18476,
+ "performing": 5170,
+ "performs": 13839,
+ "perfu": 14214,
+ "perfume": 17525,
+ "perhaps": 9297,
+ "peri": 12618,
+ "peri": 44068,
+ "perience": 19302,
+ "peril": 40119,
+ "peril": 48301,
+ "perimeter": 38499,
+ "pering": 29746,
+ "perio": 5101,
+ "period": 6131,
+ "periodic": 36476,
+ "periods": 24401,
+ "periph": 35308,
+ "peripheral": 43901,
+ "peris": 19461,
+ "periscope": 21668,
+ "perk": 33424,
+ "perkins": 20057,
+ "perks": 17660,
+ "perl": 44018,
+ "perm": 47847,
+ "perman": 9018,
+ "permanent": 11144,
+ "permanently": 25584,
+ "perme": 42456,
+ "permission": 15822,
+ "permit": 21950,
+ "permits": 33267,
+ "permitted": 44380,
+ "pero": 23551,
+ "perpe": 15749,
+ "perpetr": 33376,
+ "perpetu": 30132,
+ "perpetual": 32018,
+ "perrie": 32691,
+ "perry": 28478,
+ "perry": 7899,
+ "pers": 3688,
+ "pers": 10710,
+ "perse": 27498,
+ "persecu": 22878,
+ "persecution": 32009,
+ "perseverance": 29820,
+ "persi": 11509,
+ "persian": 19859,
+ "persist": 19412,
+ "persist": 40938,
+ "persistence": 34588,
+ "persistent": 29028,
+ "person": 3510,
+ "person": 2533,
+ "persona": 18401,
+ "personal": 10114,
+ "personal": 4121,
+ "personalised": 24186,
+ "personalities": 27888,
+ "personality": 10386,
+ "personalized": 17845,
+ "personally": 13885,
+ "personnel": 14546,
+ "persons": 14592,
+ "perspec": 17997,
+ "perspective": 8996,
+ "perspectives": 18777,
+ "persu": 20972,
+ "pert": 36970,
+ "pert": 16306,
+ "perth": 19067,
+ "perth": 11011,
+ "peru": 20612,
+ "peru": 12964,
+ "peruvian": 30822,
+ "pes": 38368,
+ "pes": 2598,
+ "pesa": 47409,
+ "pesc": 44044,
+ "pesh": 33184,
+ "peshaw": 28524,
+ "peshawar": 29230,
+ "pesky": 42512,
+ "pesos": 47872,
+ "pessi": 43902,
+ "pest": 20130,
+ "pest": 9425,
+ "pesticide": 48481,
+ "pesticides": 37868,
+ "pesto": 26186,
+ "pests": 41919,
+ "pet": 2167,
+ "pet": 3703,
+ "peta": 28785,
+ "petal": 38430,
+ "petal": 40469,
+ "petals": 26064,
+ "petday": 45314,
+ "pete": 14479,
+ "pete": 8571,
+ "peter": 5093,
+ "peter": 3696,
+ "peterborough": 26012,
+ "peters": 16336,
+ "petersburg": 21052,
+ "petersen": 39794,
+ "peterson": 16877,
+ "peth": 48920,
+ "petit": 36437,
+ "petit": 21276,
+ "petite": 27213,
+ "petition": 10975,
+ "petitions": 43536,
+ "petr": 29808,
+ "petra": 31300,
+ "petre": 47179,
+ "petri": 31831,
+ "petro": 8716,
+ "petrol": 18149,
+ "petroleum": 22063,
+ "petron": 42875,
+ "pets": 7663,
+ "pett": 27051,
+ "petti": 48001,
+ "petting": 44334,
+ "petty": 17324,
+ "peu": 21411,
+ "peuge": 22893,
+ "peugeot": 24129,
+ "pew": 21608,
+ "pew": 30783,
+ "pewdie": 41882,
+ "pewdiepie": 42563,
+ "pex": 43765,
+ "pey": 14966,
+ "pey": 30933,
+ "peyton": 49254,
+ "peyton": 20307,
+ "pez": 45798,
+ "pez": 10482,
+ "pf": 16680,
+ "pf": 12572,
+ "pfa": 47839,
+ "pfc": 35007,
+ "pff": 44121,
+ "pfi": 29810,
+ "pfw": 31229,
+ "pg": 12476,
+ "pg": 5211,
+ "pga": 13351,
+ "pgat": 36514,
+ "pgatour": 40094,
+ "pgh": 44862,
+ "pgh": 30031,
+ "pgs": 49204,
+ "ph": 745,
+ "ph": 2042,
+ "pha": 4443,
+ "pha": 26255,
+ "phal": 19962,
+ "phan": 8731,
+ "phan": 40126,
+ "phant": 36998,
+ "phantom": 37688,
+ "phantom": 14490,
+ "phar": 5570,
+ "phara": 35792,
+ "pharaoh": 40437,
+ "pharm": 45761,
+ "pharma": 17831,
+ "pharmac": 8193,
+ "pharmaceu": 19490,
+ "pharmaceutical": 25217,
+ "pharmaceuticals": 44623,
+ "pharmacist": 41024,
+ "pharmacists": 44337,
+ "pharmacy": 15293,
+ "pharo": 42308,
+ "pharoah": 49287,
+ "pharrell": 31316,
+ "phase": 8304,
+ "phases": 35337,
+ "phat": 42492,
+ "phc": 41102,
+ "phd": 20875,
+ "phd": 8472,
+ "phdchat": 39564,
+ "phdlife": 39638,
+ "phe": 4787,
+ "phe": 19853,
+ "pheasant": 41983,
+ "phee": 41292,
+ "phel": 23711,
+ "phelps": 27128,
+ "phen": 7718,
+ "pheno": 47336,
+ "phenom": 31673,
+ "phenom": 39618,
+ "phenomen": 11304,
+ "phenomena": 41538,
+ "phenomenal": 15035,
+ "phenomenon": 24464,
+ "pher": 9194,
+ "pher": 19828,
+ "phers": 29531,
+ "pherson": 36421,
+ "phew": 10295,
+ "phi": 2239,
+ "phi": 12220,
+ "phia": 9228,
+ "phic": 3977,
+ "phie": 30237,
+ "phies": 17062,
+ "phil": 2821,
+ "phil": 6199,
+ "phila": 47443,
+ "philadel": 9428,
+ "philadelphia": 9749,
+ "philanthro": 16587,
+ "philanthropist": 44153,
+ "philanthropy": 25047,
+ "philately": 33695,
+ "phile": 36543,
+ "philharmon": 25228,
+ "philharmonic": 31699,
+ "phili": 4277,
+ "philia": 46654,
+ "philip": 20748,
+ "philip": 11074,
+ "philipp": 5623,
+ "philipp": 47591,
+ "philippe": 20942,
+ "philippine": 17629,
+ "philippines": 8149,
+ "philips": 25175,
+ "phill": 42346,
+ "phill": 48272,
+ "philli": 6456,
+ "phillies": 18748,
+ "phillip": 48832,
+ "phillip": 19323,
+ "phillips": 11041,
+ "philly": 19545,
+ "philly": 7785,
+ "philos": 8395,
+ "philosop": 20349,
+ "philosoph": 10187,
+ "philosopher": 25220,
+ "philosophical": 32628,
+ "philosophy": 12213,
+ "phils": 38573,
+ "phin": 33816,
+ "phine": 40985,
+ "phins": 40210,
+ "phish": 36897,
+ "phishing": 36546,
+ "phl": 25603,
+ "pho": 816,
+ "pho": 22707,
+ "phobia": 28749,
+ "phoe": 22673,
+ "phoebe": 27582,
+ "phoeni": 6778,
+ "phoenix": 20615,
+ "phoenix": 7793,
+ "phol": 48140,
+ "phon": 19602,
+ "phon": 31115,
+ "phone": 15486,
+ "phone": 1951,
+ "phones": 6351,
+ "phony": 31925,
+ "phora": 31363,
+ "phosp": 22638,
+ "photo": 1153,
+ "photo": 1125,
+ "photobomb": 37075,
+ "photobook": 41894,
+ "photog": 28115,
+ "photogenic": 36108,
+ "photogra": 36754,
+ "photograph": 1688,
+ "photograph": 8853,
+ "photographed": 11573,
+ "photographer": 5748,
+ "photographers": 17141,
+ "photographic": 22053,
+ "photographing": 30074,
+ "photographs": 15759,
+ "photography": 33183,
+ "photography": 2108,
+ "photom": 32223,
+ "photoo": 11106,
+ "photooftheday": 11933,
+ "photos": 2479,
+ "photoshoot": 11121,
+ "photoshop": 12419,
+ "photoshopped": 35738,
+ "phouse": 27848,
+ "php": 17370,
+ "phra": 12777,
+ "phrase": 18809,
+ "phrases": 35264,
+ "phs": 16495,
+ "phu": 21274,
+ "phuket": 34028,
+ "phx": 35466,
+ "phx": 29507,
+ "phy": 6484,
+ "phy": 4292,
+ "phyl": 35600,
+ "phyllis": 37844,
+ "phys": 3734,
+ "phys": 37894,
+ "physi": 13782,
+ "physic": 46641,
+ "physical": 44127,
+ "physical": 6671,
+ "physically": 18105,
+ "physician": 21055,
+ "physicians": 26702,
+ "physicist": 29052,
+ "physics": 9369,
+ "physio": 29574,
+ "physio": 29177,
+ "physiology": 32349,
+ "physique": 42884,
+ "phyto": 42197,
+ "pi": 741,
+ "pi": 5357,
+ "pia": 8918,
+ "pian": 24637,
+ "pianist": 21048,
+ "piano": 49278,
+ "piano": 7894,
+ "pianos": 47904,
+ "piazza": 28496,
+ "pic": 901,
+ "pic": 1282,
+ "pical": 5482,
+ "picard": 48507,
+ "picasso": 21481,
+ "piccad": 33876,
+ "piccadilly": 37287,
+ "piccollage": 43621,
+ "pick": 6379,
+ "pick": 3142,
+ "picked": 6018,
+ "picker": 43105,
+ "pickering": 47605,
+ "picket": 33559,
+ "picking": 9545,
+ "pickle": 24570,
+ "pickled": 21705,
+ "pickles": 25001,
+ "picks": 8551,
+ "pickup": 15382,
+ "pickups": 33383,
+ "picnic": 12007,
+ "pico": 23363,
+ "picoftheday": 18319,
+ "pics": 2559,
+ "pict": 18778,
+ "pictorial": 40640,
+ "picture": 11663,
+ "picture": 1674,
+ "pictured": 7647,
+ "pictures": 3646,
+ "picturesque": 24894,
+ "pid": 5225,
+ "piday": 48056,
+ "pie": 12065,
+ "pie": 5319,
+ "piece": 39632,
+ "piece": 2754,
+ "pieces": 6194,
+ "pied": 24686,
+ "pied": 12713,
+ "piedmont": 39691,
+ "pier": 5641,
+ "pier": 11348,
+ "pierc": 49216,
+ "pierce": 48462,
+ "pierce": 16782,
+ "pierced": 32799,
+ "piercing": 22557,
+ "piero": 43125,
+ "pierre": 34670,
+ "pierre": 11985,
+ "piers": 29030,
+ "pies": 6898,
+ "pieter": 44801,
+ "pietro": 42169,
+ "piff": 40719,
+ "pig": 12009,
+ "pig": 9619,
+ "pigeon": 18008,
+ "pigeons": 32910,
+ "piggy": 28245,
+ "pigment": 40284,
+ "pigs": 16228,
+ "pik": 48539,
+ "pika": 47372,
+ "pikach": 27268,
+ "pikachu": 28107,
+ "pike": 33457,
+ "pike": 14011,
+ "pil": 2893,
+ "pil": 20645,
+ "pilates": 29518,
+ "pile": 44403,
+ "pile": 13930,
+ "piled": 26873,
+ "piles": 31968,
+ "pilgri": 13966,
+ "pilgrim": 32662,
+ "pilgrimage": 24335,
+ "pilgrims": 31370,
+ "piling": 43050,
+ "pilip": 27234,
+ "pilipinas": 32392,
+ "pill": 14830,
+ "pill": 19226,
+ "pillar": 17322,
+ "pillars": 22054,
+ "pillow": 42237,
+ "pillow": 12182,
+ "pillows": 26499,
+ "pills": 23964,
+ "pilo": 37526,
+ "pilot": 31619,
+ "pilot": 6687,
+ "pilots": 15586,
+ "pilsner": 47153,
+ "pim": 15285,
+ "pim": 35472,
+ "pimp": 35789,
+ "pin": 2629,
+ "pin": 5164,
+ "pinball": 31679,
+ "pinch": 26114,
+ "pine": 9398,
+ "pine": 7374,
+ "pineapple": 14831,
+ "pines": 20338,
+ "ping": 23720,
+ "ping": 2089,
+ "pinion": 40557,
+ "pink": 11151,
+ "pink": 3360,
+ "pinkfloyd": 48520,
+ "pinky": 29803,
+ "pinn": 31448,
+ "pinnacle": 32754,
+ "pinned": 12165,
+ "pinning": 44515,
+ "pino": 36633,
+ "pinot": 41399,
+ "pinot": 21146,
+ "pinoy": 43578,
+ "pinoy": 35258,
+ "pins": 14619,
+ "pinst": 41173,
+ "pint": 42537,
+ "pint": 13584,
+ "pinterest": 15379,
+ "pinto": 35992,
+ "pints": 27935,
+ "pinup": 37349,
+ "pio": 22108,
+ "pion": 36728,
+ "pion": 29190,
+ "pione": 7975,
+ "pioneer": 34892,
+ "pioneer": 12459,
+ "pioneering": 25933,
+ "pioneers": 22383,
+ "pious": 42441,
+ "pip": 30854,
+ "pipe": 29333,
+ "pipe": 10459,
+ "pipel": 12387,
+ "pipeline": 14151,
+ "pipelines": 39683,
+ "piper": 47052,
+ "piper": 16293,
+ "pipes": 16991,
+ "piping": 40744,
+ "pippa": 47672,
+ "pir": 4351,
+ "pir": 38899,
+ "piracy": 39452,
+ "piran": 49034,
+ "pirate": 38680,
+ "pirate": 13592,
+ "pirates": 10442,
+ "pire": 16613,
+ "pires": 14988,
+ "pis": 9230,
+ "pis": 44441,
+ "pisa": 43632,
+ "pisces": 45982,
+ "piss": 20818,
+ "pissed": 17989,
+ "pist": 15556,
+ "pist": 32826,
+ "pistachi": 29760,
+ "pistachio": 36320,
+ "pistol": 20480,
+ "piston": 48236,
+ "pistons": 27242,
+ "pistor": 48162,
+ "pit": 2946,
+ "pit": 7476,
+ "pita": 27070,
+ "pitbull": 25295,
+ "pitch": 8992,
+ "pitch": 5872,
+ "pitched": 28447,
+ "pitcher": 13445,
+ "pitchers": 27835,
+ "pitches": 21005,
+ "pitching": 16455,
+ "piti": 47568,
+ "pits": 24144,
+ "pitt": 7607,
+ "pitt": 15599,
+ "pitts": 9531,
+ "pittsburgh": 10453,
+ "pity": 24380,
+ "pius": 39988,
+ "pivo": 18009,
+ "pivot": 31805,
+ "pivotal": 31432,
+ "pix": 6185,
+ "pix": 13088,
+ "pixar": 27493,
+ "pixel": 14384,
+ "pixel": 13241,
+ "pixelart": 18516,
+ "pixels": 34099,
+ "pixie": 35573,
+ "piyu": 30772,
+ "piyush": 36191,
+ "piyushgoyal": 45318,
+ "pizz": 3897,
+ "pizza": 4474,
+ "pizzas": 30647,
+ "pizzeria": 44174,
+ "pj": 12524,
+ "pj": 17179,
+ "pjnet": 22011,
+ "pjs": 36009,
+ "pk": 10149,
+ "pk": 10991,
+ "pkg": 49011,
+ "pkk": 47480,
+ "pknot": 41779,
+ "pkwy": 36827,
+ "pl": 712,
+ "pl": 5678,
+ "pla": 841,
+ "pla": 19945,
+ "plac": 2331,
+ "place": 14884,
+ "place": 1445,
+ "placed": 9729,
+ "placement": 16724,
+ "placements": 43885,
+ "placer": 49170,
+ "places": 4448,
+ "placing": 18531,
+ "plague": 25360,
+ "plaid": 23291,
+ "plain": 22776,
+ "plain": 10709,
+ "plains": 16345,
+ "plan": 1740,
+ "plan": 2970,
+ "pland": 24801,
+ "plane": 22728,
+ "plane": 5363,
+ "planes": 12581,
+ "planet": 16833,
+ "planet": 5172,
+ "planetary": 28361,
+ "planets": 22315,
+ "plank": 30991,
+ "plankton": 48249,
+ "plann": 6409,
+ "planned": 8169,
+ "planner": 18083,
+ "planners": 33664,
+ "planning": 4446,
+ "plano": 34063,
+ "plans": 4181,
+ "plant": 8521,
+ "plant": 3912,
+ "plantation": 20014,
+ "plantbased": 33720,
+ "planted": 14286,
+ "planter": 34453,
+ "planters": 43661,
+ "planting": 13922,
+ "plants": 5829,
+ "plaque": 16097,
+ "plaques": 45610,
+ "plar": 26754,
+ "plas": 45673,
+ "plasma": 24999,
+ "plaster": 31980,
+ "plastic": 15645,
+ "plastic": 6102,
+ "plasticpollution": 47129,
+ "plastics": 20999,
+ "plasticsurgery": 48555,
+ "plat": 3172,
+ "plata": 46456,
+ "plate": 28744,
+ "plate": 5135,
+ "plateau": 29301,
+ "plated": 21161,
+ "plates": 11485,
+ "platform": 5549,
+ "platforms": 13551,
+ "platin": 10267,
+ "plating": 44564,
+ "platinum": 10979,
+ "plato": 41101,
+ "platoon": 41254,
+ "platt": 44459,
+ "platt": 40097,
+ "platte": 46785,
+ "platter": 29071,
+ "platz": 40878,
+ "plau": 39139,
+ "play": 1222,
+ "play": 1453,
+ "playa": 23756,
+ "playable": 33885,
+ "playback": 39194,
+ "playbook": 34856,
+ "playboy": 24383,
+ "played": 3432,
+ "player": 24503,
+ "player": 2477,
+ "players": 3030,
+ "playful": 23871,
+ "playground": 15861,
+ "playhouse": 23254,
+ "playin": 24674,
+ "playing": 47368,
+ "playing": 1629,
+ "playlist": 9180,
+ "playlists": 47183,
+ "playo": 5804,
+ "playoff": 9655,
+ "playoffs": 9548,
+ "plays": 5134,
+ "playstation": 11332,
+ "playtime": 43037,
+ "playwright": 32070,
+ "plaza": 8943,
+ "plc": 16827,
+ "ple": 926,
+ "ple": 1619,
+ "plea": 21956,
+ "plead": 47539,
+ "pleads": 31425,
+ "plear": 21362,
+ "pleas": 8481,
+ "pleas": 48740,
+ "pleasant": 12271,
+ "please": 41074,
+ "please": 1474,
+ "pleased": 6107,
+ "pleasing": 32893,
+ "pleasure": 5854,
+ "pleasures": 29513,
+ "pledge": 11507,
+ "pledged": 36799,
+ "pledges": 26746,
+ "pledis": 41202,
+ "plein": 43429,
+ "plenary": 19891,
+ "plenty": 7524,
+ "pler": 17677,
+ "ples": 6248,
+ "pless": 39821,
+ "pless": 17059,
+ "plets": 43230,
+ "plex": 23765,
+ "plex": 15241,
+ "pley": 19543,
+ "pli": 30001,
+ "pli": 45797,
+ "plic": 5806,
+ "plicity": 19823,
+ "plight": 40317,
+ "plin": 44531,
+ "plin": 32335,
+ "pline": 25376,
+ "pling": 12899,
+ "plings": 31184,
+ "pll": 47629,
+ "pll": 25266,
+ "pln": 48755,
+ "plo": 1778,
+ "plo": 43523,
+ "plor": 34695,
+ "plot": 9918,
+ "plots": 25672,
+ "plotting": 30751,
+ "plough": 33811,
+ "plow": 38363,
+ "pls": 5572,
+ "plu": 2052,
+ "plug": 12628,
+ "plugged": 23261,
+ "plugin": 31278,
+ "plugins": 48797,
+ "plugs": 28083,
+ "plum": 26267,
+ "plum": 16202,
+ "plumb": 21769,
+ "plumber": 43478,
+ "plumbing": 24647,
+ "plume": 39495,
+ "plun": 15122,
+ "plunge": 26506,
+ "plur": 44664,
+ "plus": 3097,
+ "plush": 18926,
+ "pluto": 26380,
+ "ply": 17249,
+ "ply": 28705,
+ "plying": 36071,
+ "plym": 11907,
+ "plymouth": 13786,
+ "plz": 10538,
+ "pm": 13699,
+ "pm": 990,
+ "pmi": 41206,
+ "pmln": 23208,
+ "pmo": 18782,
+ "pmoindia": 20374,
+ "pms": 44223,
+ "pn": 14431,
+ "pn": 13774,
+ "pnc": 37148,
+ "pne": 30966,
+ "pneu": 28714,
+ "pneumonia": 42906,
+ "png": 20992,
+ "pnp": 25972,
+ "pnpp": 42175,
+ "pnw": 31521,
+ "po": 628,
+ "po": 3057,
+ "poa": 43912,
+ "poached": 27665,
+ "poaching": 35140,
+ "poc": 13232,
+ "poc": 27780,
+ "pocaly": 37987,
+ "pocalypse": 42307,
+ "poche": 38336,
+ "poche": 39022,
+ "pocket": 29147,
+ "pocket": 8504,
+ "pockets": 19566,
+ "pocon": 41850,
+ "pod": 3583,
+ "pod": 7446,
+ "podcast": 39654,
+ "podcast": 4294,
+ "podcasting": 40106,
+ "podcasts": 19392,
+ "pode": 33368,
+ "poder": 24960,
+ "podernfamily": 26620,
+ "podi": 32853,
+ "podium": 14093,
+ "pods": 18776,
+ "poe": 4746,
+ "poe": 19254,
+ "poem": 9436,
+ "poems": 15577,
+ "poet": 41019,
+ "poet": 9872,
+ "poetic": 26365,
+ "poetry": 20192,
+ "poetry": 6038,
+ "poetryday": 39255,
+ "poets": 19804,
+ "pof": 40850,
+ "poff": 28236,
+ "pogba": 25998,
+ "poign": 29682,
+ "poignant": 32138,
+ "poin": 9074,
+ "point": 13280,
+ "point": 2301,
+ "pointe": 24631,
+ "pointed": 20703,
+ "pointer": 29883,
+ "pointers": 36760,
+ "pointing": 19233,
+ "pointless": 33586,
+ "points": 3396,
+ "pois": 17008,
+ "poise": 45087,
+ "poised": 27354,
+ "poison": 30722,
+ "poison": 17074,
+ "poisoned": 43624,
+ "poisoning": 25750,
+ "poisonous": 37131,
+ "pok": 15387,
+ "poke": 6892,
+ "poke": 23186,
+ "pokemon": 16239,
+ "pokemon": 9528,
+ "pokemongo": 23985,
+ "poker": 30735,
+ "poker": 11865,
+ "pokes": 40221,
+ "poking": 49169,
+ "poké": 20656,
+ "pokémon": 22066,
+ "pol": 977,
+ "pol": 7649,
+ "pola": 43876,
+ "poland": 9834,
+ "polar": 21432,
+ "polar": 12214,
+ "polari": 27919,
+ "polaris": 37965,
+ "polarized": 48437,
+ "polaro": 25237,
+ "polaroid": 30427,
+ "poldark": 41322,
+ "pole": 26682,
+ "pole": 8170,
+ "poles": 22585,
+ "poli": 9675,
+ "poli": 5414,
+ "polic": 16126,
+ "police": 15535,
+ "police": 2120,
+ "policeman": 37713,
+ "policemen": 47946,
+ "polici": 10819,
+ "policies": 10993,
+ "policing": 20969,
+ "policy": 30173,
+ "policy": 4660,
+ "polio": 30533,
+ "polis": 16133,
+ "polish": 46941,
+ "polish": 9632,
+ "polished": 21478,
+ "polishing": 43629,
+ "polit": 2247,
+ "politan": 15337,
+ "polite": 31497,
+ "politi": 40597,
+ "politic": 33333,
+ "political": 37744,
+ "political": 4197,
+ "politically": 24323,
+ "politician": 15960,
+ "politicians": 12914,
+ "politico": 39403,
+ "politics": 4929,
+ "polk": 33317,
+ "polka": 29476,
+ "poll": 7032,
+ "pollen": 27651,
+ "pollin": 19152,
+ "pollinators": 36599,
+ "polling": 18024,
+ "pollo": 42755,
+ "pollock": 37614,
+ "polls": 11813,
+ "pollu": 8370,
+ "polluted": 43346,
+ "pollution": 10384,
+ "polly": 31204,
+ "polo": 35928,
+ "polo": 10229,
+ "poly": 6833,
+ "poly": 18367,
+ "polye": 31730,
+ "polyester": 38514,
+ "polym": 23626,
+ "polymer": 29993,
+ "polyne": 38892,
+ "polyvore": 24771,
+ "pom": 7548,
+ "pom": 24280,
+ "pome": 27963,
+ "pomegran": 29326,
+ "pomegranate": 32415,
+ "pomer": 35156,
+ "pomona": 41690,
+ "pompe": 18352,
+ "pompeii": 47775,
+ "pompeo": 34351,
+ "pompey": 35079,
+ "pon": 3809,
+ "pon": 22391,
+ "ponce": 43637,
+ "pond": 10750,
+ "ponder": 36863,
+ "pondering": 47395,
+ "ponds": 31033,
+ "pone": 32183,
+ "pong": 40546,
+ "pong": 17710,
+ "ponies": 34157,
+ "pons": 41255,
+ "pont": 47563,
+ "pont": 22997,
+ "ponte": 40892,
+ "ponti": 15527,
+ "pontiac": 25373,
+ "pontifex": 33566,
+ "ponty": 45152,
+ "pony": 24438,
+ "pony": 12678,
+ "ponytail": 43265,
+ "poo": 6601,
+ "poo": 14389,
+ "pooch": 37037,
+ "poodle": 34961,
+ "pooh": 27103,
+ "pooja": 35676,
+ "pool": 12484,
+ "pool": 2831,
+ "poole": 26290,
+ "pools": 18736,
+ "poolside": 35509,
+ "poon": 33799,
+ "poon": 36178,
+ "poop": 23310,
+ "poor": 14528,
+ "poor": 3665,
+ "poorest": 40771,
+ "poorly": 21101,
+ "pop": 6530,
+ "pop": 2852,
+ "popart": 47425,
+ "popcorn": 15034,
+ "pope": 16994,
+ "pope": 9283,
+ "popefrancis": 37254,
+ "poplar": 38726,
+ "popo": 38835,
+ "popo": 35572,
+ "popp": 13156,
+ "popped": 14934,
+ "poppies": 30385,
+ "poppin": 28536,
+ "popping": 18152,
+ "poppins": 41216,
+ "poppy": 32194,
+ "poppy": 15447,
+ "pops": 11705,
+ "popsic": 38481,
+ "popu": 3785,
+ "popul": 6593,
+ "popular": 15854,
+ "popular": 4368,
+ "popularity": 19235,
+ "populated": 38420,
+ "population": 8423,
+ "populations": 23797,
+ "populism": 48998,
+ "populist": 49376,
+ "popup": 33053,
+ "por": 817,
+ "por": 7697,
+ "pora": 23537,
+ "porcel": 19409,
+ "porcelain": 20451,
+ "porch": 17154,
+ "pore": 28267,
+ "pork": 40379,
+ "pork": 7897,
+ "poro": 48110,
+ "porridge": 34924,
+ "porsch": 48009,
+ "porsche": 44049,
+ "porsche": 8783,
+ "port": 1641,
+ "port": 1418,
+ "porta": 45037,
+ "portable": 11949,
+ "portage": 32087,
+ "portal": 14982,
+ "porte": 28654,
+ "ported": 16879,
+ "porter": 28319,
+ "porter": 10318,
+ "porters": 15670,
+ "portfoli": 45766,
+ "portfolio": 11938,
+ "porth": 37425,
+ "porti": 45760,
+ "porting": 26052,
+ "portion": 13739,
+ "portions": 22914,
+ "portland": 38366,
+ "portland": 8880,
+ "portman": 34755,
+ "porto": 24853,
+ "porto": 18947,
+ "portobello": 48025,
+ "portra": 4175,
+ "portrait": 39312,
+ "portrait": 5352,
+ "portraits": 14203,
+ "portray": 46282,
+ "portrayal": 39238,
+ "portrayed": 36093,
+ "ports": 7734,
+ "portsm": 17063,
+ "portsmouth": 19074,
+ "portu": 7159,
+ "portugal": 9503,
+ "portugue": 17498,
+ "portuguese": 18019,
+ "pos": 1780,
+ "pos": 11839,
+ "pose": 25478,
+ "pose": 4230,
+ "posed": 5206,
+ "posei": 47270,
+ "poser": 46899,
+ "poses": 9773,
+ "posey": 34852,
+ "posh": 26748,
+ "posing": 10518,
+ "posit": 28793,
+ "positi": 7895,
+ "position": 4657,
+ "positioned": 34482,
+ "positioning": 30657,
+ "positions": 12188,
+ "positive": 21811,
+ "positive": 4844,
+ "positively": 24688,
+ "positivity": 19966,
+ "poss": 39745,
+ "posse": 17414,
+ "posse": 28413,
+ "possess": 36810,
+ "possessed": 36220,
+ "possession": 16154,
+ "possessions": 40588,
+ "possi": 2521,
+ "possibilities": 17932,
+ "possibility": 18517,
+ "possible": 3134,
+ "possibly": 8601,
+ "possum": 38575,
+ "post": 3489,
+ "post": 1549,
+ "postage": 27570,
+ "postal": 21687,
+ "postcard": 14785,
+ "postcards": 23922,
+ "postdoc": 41013,
+ "posted": 4752,
+ "poster": 22881,
+ "poster": 3574,
+ "posters": 9673,
+ "postgame": 34873,
+ "postgraduate": 31997,
+ "posthum": 42410,
+ "posting": 7559,
+ "postman": 38285,
+ "postpon": 23247,
+ "postponed": 25097,
+ "posts": 7824,
+ "postseason": 24521,
+ "posture": 29681,
+ "posure": 35539,
+ "pot": 3547,
+ "pot": 5168,
+ "potam": 45825,
+ "potassi": 36889,
+ "potassium": 37147,
+ "potat": 5975,
+ "potato": 8527,
+ "potatoes": 11567,
+ "potd": 28765,
+ "pote": 41869,
+ "poten": 4454,
+ "potent": 26082,
+ "potenti": 44104,
+ "potential": 5100,
+ "potentially": 16508,
+ "potholes": 47506,
+ "potion": 46055,
+ "potom": 38848,
+ "potomac": 43372,
+ "pots": 19234,
+ "pott": 28698,
+ "potted": 48581,
+ "potter": 24975,
+ "potter": 9026,
+ "pottery": 18396,
+ "potts": 39839,
+ "potty": 43569,
+ "potus": 8740,
+ "pou": 9423,
+ "pouch": 26811,
+ "poul": 22485,
+ "poultry": 31005,
+ "poun": 33719,
+ "pound": 33809,
+ "pound": 10674,
+ "pounding": 46544,
+ "pounds": 10752,
+ "pour": 33112,
+ "pour": 8180,
+ "poured": 26621,
+ "pouring": 16098,
+ "pours": 26005,
+ "pout": 39621,
+ "poutine": 43768,
+ "pov": 25731,
+ "pover": 8432,
+ "pover": 29464,
+ "poverty": 9095,
+ "pow": 1317,
+ "pow": 17745,
+ "powder": 32427,
+ "powder": 9674,
+ "powe": 36955,
+ "powell": 13305,
+ "power": 2789,
+ "power": 1807,
+ "powerball": 47803,
+ "powered": 45442,
+ "powered": 7332,
+ "powerful": 4875,
+ "powerhouse": 22858,
+ "powering": 16231,
+ "powerof": 31961,
+ "powerpoint": 38940,
+ "powerrangers": 40620,
+ "powers": 9422,
+ "pox": 43649,
+ "poy": 34737,
+ "poyn": 47655,
+ "poz": 39953,
+ "pp": 604,
+ "pp": 4186,
+ "ppa": 10416,
+ "ppard": 23391,
+ "ppc": 27778,
+ "ppe": 24573,
+ "ppe": 11867,
+ "pped": 1873,
+ "ppel": 46523,
+ "ppen": 30663,
+ "pper": 6719,
+ "pper": 2440,
+ "ppers": 5232,
+ "ppery": 27833,
+ "ppet": 20744,
+ "ppets": 25849,
+ "ppg": 27433,
+ "ppi": 9594,
+ "ppie": 33795,
+ "ppin": 8076,
+ "pping": 22214,
+ "pping": 1682,
+ "ppings": 35687,
+ "ppl": 6758,
+ "pple": 12302,
+ "ppm": 42053,
+ "ppo": 10215,
+ "ppor": 37613,
+ "ppp": 14017,
+ "pps": 10683,
+ "ppv": 38864,
+ "ppy": 30360,
+ "ppy": 3860,
+ "pr": 766,
+ "pr": 4150,
+ "pra": 1865,
+ "pra": 19285,
+ "prab": 17901,
+ "prabhas": 29959,
+ "prabhu": 31529,
+ "prac": 2243,
+ "practi": 29995,
+ "practic": 5495,
+ "practical": 10792,
+ "practically": 25588,
+ "practice": 3349,
+ "practiced": 36749,
+ "practices": 9040,
+ "practicing": 12750,
+ "practise": 38938,
+ "practising": 36478,
+ "practiti": 19909,
+ "practitioner": 32591,
+ "practitioners": 29045,
+ "prada": 29456,
+ "pradesh": 15384,
+ "prado": 44141,
+ "prag": 31025,
+ "prague": 14940,
+ "prairi": 12629,
+ "prairie": 14753,
+ "praise": 10013,
+ "praised": 27649,
+ "praises": 23049,
+ "praising": 36961,
+ "prakash": 43708,
+ "prakash": 25366,
+ "pram": 47774,
+ "pran": 20048,
+ "prank": 23654,
+ "pras": 41562,
+ "prasad": 29562,
+ "prat": 23069,
+ "prati": 45773,
+ "pratt": 37863,
+ "pratt": 23396,
+ "prawn": 33102,
+ "prawns": 34903,
+ "pray": 12671,
+ "pray": 6041,
+ "prayed": 34665,
+ "prayer": 41452,
+ "prayer": 6583,
+ "prayers": 8393,
+ "prayfor": 18443,
+ "praying": 11550,
+ "prays": 46602,
+ "prc": 28781,
+ "pre": 679,
+ "pre": 2900,
+ "preach": 22545,
+ "preacher": 29357,
+ "preaching": 23642,
+ "precau": 36532,
+ "precautions": 47845,
+ "prece": 15361,
+ "preci": 5470,
+ "precin": 27908,
+ "precinct": 32587,
+ "precious": 8226,
+ "precipit": 27463,
+ "precipitation": 33399,
+ "precise": 24457,
+ "precisely": 34954,
+ "precision": 44021,
+ "precision": 15621,
+ "pred": 40370,
+ "predat": 13364,
+ "predator": 20653,
+ "predators": 25569,
+ "prede": 38454,
+ "predecess": 38963,
+ "predic": 4876,
+ "predict": 16900,
+ "predictable": 25344,
+ "predicted": 18702,
+ "predicting": 30414,
+ "prediction": 16296,
+ "predictions": 15125,
+ "predictive": 29798,
+ "predicts": 25960,
+ "preds": 40125,
+ "pree": 47026,
+ "preet": 30131,
+ "prefe": 14542,
+ "prefecture": 32890,
+ "prefer": 33426,
+ "prefer": 11450,
+ "preference": 35057,
+ "preferences": 38118,
+ "preferred": 18772,
+ "prefers": 38528,
+ "pregame": 18575,
+ "pregn": 7190,
+ "pregnancy": 12769,
+ "pregnant": 11195,
+ "prehistoric": 32750,
+ "prejudice": 28337,
+ "preli": 15523,
+ "prelimin": 19990,
+ "preliminary": 20997,
+ "prelims": 43223,
+ "prelude": 42966,
+ "prem": 32090,
+ "prem": 21724,
+ "premature": 39253,
+ "premi": 2413,
+ "premier": 16996,
+ "premier": 5539,
+ "premiere": 5367,
+ "premiered": 27652,
+ "premieres": 19907,
+ "premiering": 32615,
+ "premierleague": 22608,
+ "premiers": 44883,
+ "premiership": 23665,
+ "premiosm": 38460,
+ "premiosmtvmiaw": 38630,
+ "premise": 45952,
+ "premises": 27266,
+ "premium": 8011,
+ "pren": 20801,
+ "preneur": 46288,
+ "preorder": 16703,
+ "preorders": 45985,
+ "prep": 6430,
+ "prep": 7277,
+ "prepa": 26270,
+ "prepaid": 42934,
+ "prepar": 4968,
+ "preparation": 11651,
+ "preparations": 19135,
+ "prepare": 7014,
+ "prepared": 7677,
+ "preparedness": 29492,
+ "prepares": 16375,
+ "preparing": 7365,
+ "prepped": 34379,
+ "prepping": 16459,
+ "preps": 14765,
+ "prequel": 40461,
+ "pres": 1385,
+ "pres": 8529,
+ "presale": 27135,
+ "presby": 30447,
+ "presbyter": 33959,
+ "presbyterian": 35370,
+ "preschool": 24354,
+ "prescott": 29392,
+ "prescri": 14851,
+ "prescribed": 36968,
+ "prescription": 23061,
+ "preseason": 13813,
+ "presen": 16742,
+ "presence": 8848,
+ "present": 2344,
+ "present": 2881,
+ "presentation": 4594,
+ "presentations": 16998,
+ "presented": 4587,
+ "presenter": 18587,
+ "presenters": 32759,
+ "presenting": 5339,
+ "presents": 4215,
+ "preserv": 17616,
+ "preservation": 21074,
+ "preserve": 15570,
+ "preserved": 23161,
+ "preserves": 44881,
+ "preserving": 32315,
+ "presi": 1697,
+ "presiden": 43374,
+ "presidency": 18077,
+ "president": 19900,
+ "president": 1940,
+ "presidente": 47363,
+ "presidenti": 48297,
+ "presidential": 8503,
+ "presidents": 16726,
+ "presiding": 45298,
+ "presley": 30013,
+ "press": 4124,
+ "press": 2124,
+ "pressed": 20080,
+ "presser": 27826,
+ "presses": 33748,
+ "pressing": 20893,
+ "pressure": 6083,
+ "pressures": 38487,
+ "prest": 41840,
+ "presti": 12245,
+ "prestige": 29328,
+ "prestigious": 15888,
+ "presto": 42211,
+ "preston": 37335,
+ "preston": 15179,
+ "presu": 21667,
+ "presumably": 42562,
+ "pret": 9652,
+ "preten": 15871,
+ "pretend": 18111,
+ "pretending": 21306,
+ "pretoria": 36080,
+ "prett": 46667,
+ "prettier": 31745,
+ "prettiest": 22866,
+ "pretty": 18286,
+ "pretty": 2111,
+ "pretz": 24890,
+ "pretzel": 36707,
+ "pretzels": 45468,
+ "prev": 20274,
+ "prevail": 31637,
+ "prevalence": 41729,
+ "prevalent": 46260,
+ "preven": 29382,
+ "prevent": 26436,
+ "prevent": 7968,
+ "preventable": 44250,
+ "prevented": 35356,
+ "preventing": 21756,
+ "prevention": 9500,
+ "preventive": 40949,
+ "prevents": 31746,
+ "preview": 4449,
+ "previews": 20279,
+ "previous": 9252,
+ "previously": 13359,
+ "prey": 17131,
+ "prez": 17956,
+ "pri": 955,
+ "pri": 23400,
+ "pric": 24275,
+ "price": 13254,
+ "price": 2827,
+ "priced": 16934,
+ "priceless": 15743,
+ "prices": 5954,
+ "pricing": 14800,
+ "prick": 43921,
+ "prick": 46516,
+ "pride": 15323,
+ "pride": 3436,
+ "pridemonth": 41410,
+ "prie": 22477,
+ "priest": 38756,
+ "priest": 14222,
+ "priests": 30005,
+ "prim": 22004,
+ "prima": 35611,
+ "prima": 33277,
+ "primal": 36604,
+ "primar": 21579,
+ "primaries": 46126,
+ "primarily": 29465,
+ "primark": 48329,
+ "primary": 35024,
+ "primary": 5814,
+ "primavera": 44899,
+ "prime": 14162,
+ "prime": 5183,
+ "primed": 45694,
+ "primer": 22388,
+ "primetime": 29763,
+ "primitive": 37467,
+ "primo": 43215,
+ "primrose": 45891,
+ "prin": 1588,
+ "prince": 9457,
+ "prince": 4735,
+ "princes": 45329,
+ "princes": 30136,
+ "princess": 24123,
+ "princess": 5079,
+ "princesses": 34161,
+ "princeton": 22433,
+ "princi": 5129,
+ "principal": 33599,
+ "principal": 8860,
+ "principals": 27524,
+ "principle": 19595,
+ "principles": 13755,
+ "print": 17851,
+ "print": 3557,
+ "printable": 29648,
+ "printed": 7978,
+ "printer": 14521,
+ "printers": 27881,
+ "printing": 7369,
+ "printmaking": 38669,
+ "prints": 7704,
+ "prior": 20328,
+ "prior": 10572,
+ "priorit": 47773,
+ "prioriti": 28822,
+ "priorities": 15232,
+ "prioritize": 46715,
+ "priority": 12451,
+ "priory": 38665,
+ "prisc": 32468,
+ "priscilla": 42396,
+ "prise": 23343,
+ "prism": 49311,
+ "prism": 34356,
+ "prison": 9281,
+ "prison": 6622,
+ "prisoner": 21427,
+ "prisoners": 17460,
+ "prisons": 26607,
+ "pristine": 30618,
+ "prit": 41668,
+ "prit": 37523,
+ "prith": 39173,
+ "prius": 43561,
+ "priv": 3270,
+ "privacy": 10437,
+ "private": 20362,
+ "private": 4439,
+ "privately": 32970,
+ "privati": 27379,
+ "privi": 8367,
+ "privileg": 18015,
+ "privilege": 11537,
+ "privileged": 18166,
+ "prix": 10875,
+ "priya": 31275,
+ "priyan": 16488,
+ "priyanka": 31959,
+ "priyankach": 30030,
+ "priyankachopra": 30264,
+ "prize": 48222,
+ "prize": 4521,
+ "prized": 38769,
+ "prizes": 9268,
+ "prk": 37094,
+ "pro": 644,
+ "pro": 2630,
+ "proactive": 33364,
+ "prob": 17706,
+ "prob": 24007,
+ "probab": 3907,
+ "probability": 32637,
+ "probable": 42444,
+ "probably": 4047,
+ "probation": 36531,
+ "probe": 14359,
+ "probes": 48564,
+ "probiotics": 49395,
+ "proble": 2719,
+ "problem": 4324,
+ "problematic": 33767,
+ "problems": 4671,
+ "probs": 16330,
+ "probz": 34243,
+ "proc": 38417,
+ "proce": 4076,
+ "procedu": 18204,
+ "procedural": 48177,
+ "procedure": 20163,
+ "procedures": 21109,
+ "proceed": 26664,
+ "proceed": 33894,
+ "proceedings": 26953,
+ "proceeds": 11882,
+ "process": 17291,
+ "process": 4078,
+ "processed": 23816,
+ "processes": 15169,
+ "processing": 11737,
+ "procession": 26288,
+ "processor": 22838,
+ "processors": 43634,
+ "proclaimed": 34489,
+ "proclamation": 32065,
+ "procra": 25361,
+ "procrastin": 25586,
+ "procrastination": 42825,
+ "procreate": 39336,
+ "proctor": 47204,
+ "procu": 21001,
+ "procurement": 23733,
+ "prod": 44349,
+ "prod": 11991,
+ "prodi": 27759,
+ "prodigy": 31973,
+ "produ": 27852,
+ "produc": 1471,
+ "produce": 7529,
+ "produced": 7479,
+ "producer": 7064,
+ "producers": 13883,
+ "produces": 19940,
+ "producing": 13579,
+ "product": 32602,
+ "product": 4306,
+ "production": 4146,
+ "productions": 14166,
+ "productive": 9697,
+ "productivity": 12800,
+ "products": 3964,
+ "prof": 15043,
+ "prof": 5488,
+ "profe": 2611,
+ "profess": 5486,
+ "professi": 3705,
+ "profession": 8104,
+ "profession": 19671,
+ "professional": 46007,
+ "professional": 4774,
+ "professionalism": 41252,
+ "professionally": 33892,
+ "professionals": 10165,
+ "professor": 47302,
+ "professor": 6092,
+ "professors": 27758,
+ "profici": 34685,
+ "profile": 14291,
+ "profile": 6444,
+ "profiles": 22070,
+ "profiling": 37123,
+ "profit": 16941,
+ "profit": 7909,
+ "profitable": 25465,
+ "profits": 13410,
+ "profound": 48245,
+ "profound": 22998,
+ "profs": 19260,
+ "prog": 22219,
+ "progno": 46070,
+ "program": 4162,
+ "program": 2737,
+ "programme": 6322,
+ "programmer": 37001,
+ "programmes": 20468,
+ "programming": 10831,
+ "programs": 7345,
+ "progre": 7069,
+ "progress": 4421,
+ "progressi": 23297,
+ "progressing": 32346,
+ "progression": 24772,
+ "progressive": 12208,
+ "progressives": 41709,
+ "prohi": 41124,
+ "prohib": 45040,
+ "prohibition": 34440,
+ "proj": 39156,
+ "proje": 48345,
+ "projec": 1610,
+ "project": 15911,
+ "project": 1965,
+ "projected": 22873,
+ "projection": 22384,
+ "projections": 34638,
+ "projector": 27816,
+ "projects": 5090,
+ "proli": 19710,
+ "prolife": 32126,
+ "prolifer": 39018,
+ "prolific": 27839,
+ "prolly": 45968,
+ "prolon": 35379,
+ "prolonged": 41972,
+ "prom": 40363,
+ "prom": 7944,
+ "prome": 34355,
+ "promen": 33578,
+ "promenade": 35522,
+ "promethe": 44183,
+ "promin": 35217,
+ "prominent": 19172,
+ "promis": 3963,
+ "promise": 6745,
+ "promised": 11516,
+ "promises": 12064,
+ "promising": 14183,
+ "promo": 3037,
+ "promo": 6755,
+ "promos": 35044,
+ "promote": 47384,
+ "promote": 8003,
+ "promoted": 16395,
+ "promoter": 33081,
+ "promotes": 20169,
+ "promoting": 9695,
+ "promotion": 9259,
+ "promotional": 17619,
+ "promotions": 19142,
+ "promp": 11671,
+ "prompt": 20198,
+ "prompted": 45746,
+ "prompts": 33490,
+ "proms": 37759,
+ "pron": 13285,
+ "prone": 30964,
+ "pronoun": 23022,
+ "pronounce": 40489,
+ "pronounced": 34109,
+ "pronto": 44296,
+ "proof": 17020,
+ "proof": 5248,
+ "proofing": 35679,
+ "proofs": 41023,
+ "prop": 19123,
+ "prop": 16254,
+ "propag": 12151,
+ "propaganda": 14718,
+ "propane": 45546,
+ "propel": 48439,
+ "propeller": 47404,
+ "proper": 3577,
+ "proper": 8205,
+ "properly": 12560,
+ "properties": 10922,
+ "property": 26486,
+ "property": 5043,
+ "prophe": 9662,
+ "prophecy": 32501,
+ "prophet": 15549,
+ "prophetic": 47476,
+ "prophets": 39441,
+ "propor": 35016,
+ "proportion": 35775,
+ "proportions": 39391,
+ "propos": 9455,
+ "proposal": 12139,
+ "proposals": 20568,
+ "propose": 28471,
+ "proposed": 10615,
+ "proposes": 27133,
+ "proposing": 42631,
+ "proposition": 44780,
+ "propri": 28243,
+ "props": 15249,
+ "propulsion": 49380,
+ "pros": 33925,
+ "pros": 14147,
+ "prosciutto": 46565,
+ "prose": 47063,
+ "prose": 28675,
+ "prosecco": 28839,
+ "prosecu": 12136,
+ "prosecution": 30902,
+ "prosecutor": 23736,
+ "prosecutors": 31656,
+ "prosp": 24242,
+ "prospec": 12693,
+ "prospect": 11211,
+ "prospective": 28034,
+ "prospects": 15372,
+ "prosper": 16121,
+ "prosper": 33526,
+ "prosperity": 17203,
+ "prosperous": 28252,
+ "prost": 47923,
+ "prostate": 28808,
+ "prostatec": 49064,
+ "prosthetic": 44602,
+ "prostitu": 37333,
+ "protag": 28950,
+ "protagonist": 38183,
+ "prote": 1845,
+ "protec": 5640,
+ "protect": 25563,
+ "protect": 4817,
+ "protected": 12266,
+ "protecting": 11710,
+ "protection": 6238,
+ "protections": 33772,
+ "protective": 17028,
+ "protector": 20441,
+ "protectors": 45039,
+ "protects": 21889,
+ "protein": 8088,
+ "proteins": 28661,
+ "protest": 6279,
+ "protestant": 46945,
+ "protested": 48089,
+ "protester": 42073,
+ "protesters": 12660,
+ "protesting": 18788,
+ "protestors": 27822,
+ "protests": 12450,
+ "proto": 8672,
+ "proto": 44958,
+ "protocol": 19938,
+ "protocols": 39631,
+ "proton": 40009,
+ "prototype": 16675,
+ "prototyping": 42081,
+ "prou": 5739,
+ "proud": 11080,
+ "proud": 1679,
+ "prouder": 39585,
+ "proudest": 46806,
+ "proudly": 11203,
+ "proudof": 48184,
+ "proudtobe": 35043,
+ "prov": 23772,
+ "prov": 35021,
+ "prove": 10107,
+ "proved": 16473,
+ "proven": 35405,
+ "proven": 14569,
+ "provence": 28067,
+ "prover": 18312,
+ "proverb": 34419,
+ "proverbs": 27016,
+ "proves": 16119,
+ "provi": 2289,
+ "provide": 4832,
+ "provided": 9046,
+ "providence": 19331,
+ "provider": 14409,
+ "providers": 17120,
+ "provides": 7161,
+ "providing": 7250,
+ "provin": 12074,
+ "province": 8978,
+ "provinces": 35050,
+ "provincial": 16002,
+ "proving": 18055,
+ "provision": 30148,
+ "provisional": 36008,
+ "provisions": 39269,
+ "provo": 15367,
+ "provoc": 31618,
+ "provocative": 43809,
+ "provoking": 25510,
+ "provost": 36627,
+ "prow": 38737,
+ "prowrestling": 39825,
+ "prox": 41616,
+ "proxim": 31436,
+ "proximity": 38298,
+ "proxy": 31680,
+ "prs": 23879,
+ "pru": 12961,
+ "pruitt": 39453,
+ "prun": 29029,
+ "pruning": 48133,
+ "pry": 31965,
+ "pryor": 43375,
+ "ps": 3982,
+ "ps": 814,
+ "psa": 14031,
+ "psal": 13859,
+ "psalm": 17995,
+ "psalms": 35003,
+ "psb": 37017,
+ "psc": 43118,
+ "psd": 28810,
+ "pse": 19737,
+ "pse": 5423,
+ "pseu": 24919,
+ "pseudo": 46618,
+ "psg": 17123,
+ "psi": 45848,
+ "psi": 24533,
+ "psic": 29299,
+ "psis": 33041,
+ "psl": 21373,
+ "psn": 36781,
+ "pso": 27045,
+ "pson": 7487,
+ "psori": 44688,
+ "psp": 32769,
+ "pss": 35718,
+ "pss": 42535,
+ "psst": 47814,
+ "pst": 12692,
+ "psu": 41286,
+ "psu": 28338,
+ "psv": 44530,
+ "psy": 3576,
+ "psy": 11056,
+ "psych": 31041,
+ "psych": 20509,
+ "psyched": 19932,
+ "psyched": 35199,
+ "psychedelic": 23292,
+ "psychi": 18147,
+ "psychiatric": 30578,
+ "psychiatry": 39706,
+ "psychic": 24916,
+ "psycho": 6472,
+ "psycho": 22154,
+ "psychological": 18153,
+ "psychologist": 32827,
+ "psychology": 12352,
+ "psychop": 30112,
+ "psychotic": 48774,
+ "pt": 11139,
+ "pt": 1459,
+ "pta": 11586,
+ "ptbo": 40481,
+ "ptc": 44646,
+ "pte": 47804,
+ "pter": 49323,
+ "pti": 29375,
+ "pti": 10491,
+ "ptic": 20670,
+ "ption": 3479,
+ "ptions": 24963,
+ "pto": 31372,
+ "pto": 34092,
+ "pton": 19780,
+ "pts": 5886,
+ "ptsd": 23973,
+ "ptv": 42402,
+ "pu": 755,
+ "pu": 11780,
+ "pub": 20720,
+ "pub": 6301,
+ "puberty": 44122,
+ "pubg": 31496,
+ "publ": 3434,
+ "publi": 1617,
+ "public": 3592,
+ "public": 2122,
+ "publica": 49007,
+ "publication": 13538,
+ "publications": 27334,
+ "publichealth": 35872,
+ "publicity": 20831,
+ "publicly": 18554,
+ "publish": 19032,
+ "published": 4311,
+ "publisher": 20455,
+ "publishers": 25222,
+ "publishes": 35633,
+ "publishing": 10994,
+ "publix": 47985,
+ "pubs": 21099,
+ "puc": 48779,
+ "puck": 17550,
+ "pud": 39234,
+ "pudding": 14025,
+ "puddle": 33545,
+ "pue": 20161,
+ "pueblo": 33076,
+ "puer": 8968,
+ "puerto": 12289,
+ "puertor": 22757,
+ "puertorico": 26356,
+ "puff": 44477,
+ "puff": 17184,
+ "puffin": 47632,
+ "puffs": 47453,
+ "puffy": 49245,
+ "pug": 20950,
+ "pug": 17739,
+ "pugchat": 42266,
+ "pugh": 41302,
+ "puglia": 38345,
+ "pugs": 39425,
+ "puj": 46163,
+ "puja": 33753,
+ "puk": 31811,
+ "pul": 2469,
+ "pul": 40512,
+ "pula": 45856,
+ "puli": 47293,
+ "pulit": 27745,
+ "pulitzer": 31419,
+ "pull": 20155,
+ "pull": 6857,
+ "pulled": 8525,
+ "pulling": 12897,
+ "pullman": 40203,
+ "pullover": 44020,
+ "pulls": 16041,
+ "pulmon": 32613,
+ "pulmonary": 39132,
+ "pulp": 25410,
+ "pulse": 40091,
+ "pulse": 12485,
+ "pulses": 42177,
+ "pulsion": 35398,
+ "pum": 37497,
+ "puma": 20858,
+ "pump": 5179,
+ "pump": 9173,
+ "pumped": 12796,
+ "pumping": 25150,
+ "pumpkin": 36386,
+ "pumpkin": 8842,
+ "pumpkins": 23787,
+ "pumps": 18540,
+ "pun": 2707,
+ "pun": 19929,
+ "punc": 43907,
+ "punch": 29332,
+ "punch": 10730,
+ "punched": 31689,
+ "punches": 35279,
+ "punching": 33468,
+ "punctu": 31565,
+ "punctuation": 47051,
+ "pundit": 41466,
+ "pune": 32593,
+ "pune": 14488,
+ "pung": 45420,
+ "puni": 11479,
+ "punish": 34569,
+ "punished": 31598,
+ "punisher": 38509,
+ "punishment": 19099,
+ "punjab": 19405,
+ "punjab": 12883,
+ "punjabi": 25430,
+ "punk": 28933,
+ "punk": 7246,
+ "punks": 47171,
+ "puns": 35231,
+ "punt": 32699,
+ "punta": 34112,
+ "punter": 47092,
+ "pup": 11926,
+ "pup": 11302,
+ "pupil": 27265,
+ "pupils": 13628,
+ "pupp": 7116,
+ "puppet": 18439,
+ "puppets": 28475,
+ "puppies": 14820,
+ "puppy": 25431,
+ "puppy": 6829,
+ "puppylove": 40849,
+ "pups": 20778,
+ "pur": 1727,
+ "pur": 6265,
+ "pura": 25596,
+ "puram": 46174,
+ "purcell": 46065,
+ "purch": 8384,
+ "purchase": 5481,
+ "purchased": 13399,
+ "purchases": 21887,
+ "purchasing": 20718,
+ "purdu": 40691,
+ "purdue": 22280,
+ "pure": 14202,
+ "pure": 5979,
+ "puree": 45474,
+ "purely": 32459,
+ "puremichigan": 39783,
+ "purest": 45497,
+ "purge": 33514,
+ "puri": 16910,
+ "puri": 21974,
+ "purification": 47724,
+ "purity": 29780,
+ "purple": 17837,
+ "purple": 5496,
+ "purpose": 33492,
+ "purpose": 7391,
+ "purposes": 22020,
+ "purr": 49262,
+ "purr": 46343,
+ "purse": 16480,
+ "pursue": 19463,
+ "pursuing": 26424,
+ "pursuit": 16469,
+ "purée": 40981,
+ "pus": 13841,
+ "pusa": 40825,
+ "push": 16028,
+ "push": 6831,
+ "pushaw": 35407,
+ "pushaward": 35448,
+ "pushawards": 47184,
+ "pushed": 16155,
+ "pushes": 23828,
+ "pushing": 11549,
+ "put": 29535,
+ "put": 1983,
+ "putin": 10693,
+ "putnam": 40235,
+ "puts": 7898,
+ "putt": 30279,
+ "putter": 44723,
+ "putting": 5154,
+ "puzz": 19760,
+ "puzzle": 12875,
+ "puzzles": 27986,
+ "pv": 14517,
+ "pv": 13495,
+ "pvc": 26959,
+ "pvp": 44172,
+ "pvt": 29898,
+ "pw": 19419,
+ "pw": 16067,
+ "pwc": 22965,
+ "px": 24790,
+ "px": 10262,
+ "pxrtg": 36262,
+ "py": 4005,
+ "py": 7504,
+ "pye": 31099,
+ "pyeongchang": 36066,
+ "pyg": 41450,
+ "pyram": 14405,
+ "pyramid": 18725,
+ "pyramids": 36877,
+ "pyrene": 36740,
+ "pyrenees": 39744,
+ "pyro": 39762,
+ "python": 13370,
+ "pz": 48361,
+ "pé": 43167,
+ "q": 80,
+ "q": 336,
+ "qa": 24944,
+ "qa": 16360,
+ "qad": 27844,
+ "qadri": 35672,
+ "qaeda": 31246,
+ "qanda": 48672,
+ "qanon": 19182,
+ "qant": 35404,
+ "qantas": 43250,
+ "qatar": 32804,
+ "qatar": 10872,
+ "qb": 8073,
+ "qbs": 38188,
+ "qc": 17406,
+ "qe": 30974,
+ "qf": 27215,
+ "qi": 25054,
+ "qi": 11256,
+ "qing": 46522,
+ "qing": 34339,
+ "ql": 28366,
+ "qld": 23039,
+ "qld": 13765,
+ "qldpol": 42296,
+ "qm": 42148,
+ "qotd": 24504,
+ "qpr": 24788,
+ "qq": 31960,
+ "qr": 18193,
+ "qs": 14364,
+ "qt": 15013,
+ "qtr": 44803,
+ "qu": 666,
+ "qu": 28646,
+ "qua": 20363,
+ "quack": 45575,
+ "quad": 11656,
+ "quad": 13419,
+ "quadcopter": 39792,
+ "quadru": 35831,
+ "quaid": 34265,
+ "quail": 34392,
+ "quaint": 45976,
+ "quake": 8421,
+ "quaker": 43395,
+ "quakes": 24572,
+ "qual": 9979,
+ "qual": 32405,
+ "qualcomm": 38683,
+ "quali": 4574,
+ "qualification": 21508,
+ "qualifications": 35225,
+ "qualified": 11927,
+ "qualifier": 18733,
+ "qualifiers": 21388,
+ "qualifies": 35820,
+ "qualify": 17019,
+ "qualifying": 11895,
+ "qualitative": 45847,
+ "qualities": 20488,
+ "quality": 28545,
+ "quality": 3027,
+ "quan": 11669,
+ "quan": 27490,
+ "quand": 28198,
+ "quant": 15050,
+ "quanti": 31540,
+ "quantitative": 40583,
+ "quantities": 33917,
+ "quantity": 26920,
+ "quantum": 15320,
+ "quar": 3856,
+ "quare": 42549,
+ "quarry": 27601,
+ "quart": 7851,
+ "quarter": 8816,
+ "quarter": 6632,
+ "quarterback": 16545,
+ "quarterfinal": 37992,
+ "quarterfinals": 28971,
+ "quarterly": 23350,
+ "quarters": 10146,
+ "quartet": 18056,
+ "quartz": 17752,
+ "quat": 25715,
+ "quattro": 40300,
+ "quay": 40276,
+ "quay": 17304,
+ "que": 1147,
+ "que": 2319,
+ "quebec": 15373,
+ "queen": 6407,
+ "queen": 2997,
+ "queenof": 44398,
+ "queens": 22943,
+ "queens": 9330,
+ "queensland": 15168,
+ "queer": 38874,
+ "queer": 18161,
+ "quel": 39774,
+ "quel": 21879,
+ "quen": 23876,
+ "quen": 38324,
+ "quent": 23808,
+ "quentin": 27530,
+ "quer": 17378,
+ "quer": 26859,
+ "quered": 23210,
+ "queries": 32958,
+ "querque": 30338,
+ "query": 27464,
+ "ques": 25328,
+ "ques": 7715,
+ "queso": 40110,
+ "quest": 31653,
+ "quest": 4846,
+ "questi": 2391,
+ "question": 18961,
+ "question": 4382,
+ "questionable": 30733,
+ "questioned": 31847,
+ "questioning": 24887,
+ "questions": 3883,
+ "quests": 44611,
+ "quet": 8513,
+ "quets": 39055,
+ "quetta": 38326,
+ "quette": 18993,
+ "queu": 32705,
+ "queue": 18549,
+ "queues": 40649,
+ "queuing": 44082,
+ "quez": 18677,
+ "quezon": 41117,
+ "qui": 1912,
+ "qui": 18046,
+ "quic": 26474,
+ "quiche": 47723,
+ "quick": 5969,
+ "quick": 3712,
+ "quicker": 29211,
+ "quickest": 37734,
+ "quickly": 7787,
+ "quid": 30732,
+ "quie": 43875,
+ "quien": 43482,
+ "quiere": 42723,
+ "quiero": 32567,
+ "quiet": 17853,
+ "quiet": 7557,
+ "quietly": 22208,
+ "quig": 44690,
+ "quil": 12305,
+ "quill": 48951,
+ "quilt": 23977,
+ "quilted": 46052,
+ "quin": 8607,
+ "quin": 17167,
+ "quincy": 27640,
+ "quind": 32339,
+ "quinn": 12306,
+ "quinoa": 26703,
+ "quins": 39701,
+ "quint": 26898,
+ "quinta": 47446,
+ "quinte": 22098,
+ "quintess": 37538,
+ "quintet": 35125,
+ "quipment": 42813,
+ "quir": 15943,
+ "quirky": 25044,
+ "quis": 15064,
+ "quist": 25128,
+ "quit": 19358,
+ "quit": 11140,
+ "quite": 4135,
+ "quito": 35828,
+ "quits": 32505,
+ "quitting": 33871,
+ "quity": 33133,
+ "quiz": 31197,
+ "quiz": 8344,
+ "quizz": 35041,
+ "quo": 3046,
+ "quo": 28127,
+ "quoi": 45549,
+ "quot": 5452,
+ "quot": 47587,
+ "quota": 42097,
+ "quotation": 49195,
+ "quote": 15446,
+ "quote": 4020,
+ "quoted": 27706,
+ "quoteoftheday": 19975,
+ "quotes": 5808,
+ "quoting": 31651,
+ "qur": 37782,
+ "quran": 19690,
+ "qureshi": 46307,
+ "qvist": 42322,
+ "qx": 45038,
+ "r": 81,
+ "r": 337,
+ "ra": 559,
+ "ra": 1735,
+ "raa": 44344,
+ "rab": 14816,
+ "rab": 33224,
+ "rabb": 6875,
+ "rabbi": 20959,
+ "rabbit": 10274,
+ "rabbits": 27028,
+ "rabhu": 25806,
+ "rable": 10182,
+ "rac": 1773,
+ "rac": 30462,
+ "raccoon": 29516,
+ "race": 10978,
+ "race": 2471,
+ "racec": 18814,
+ "racecourse": 25036,
+ "raced": 36021,
+ "racer": 16798,
+ "racers": 33603,
+ "races": 8605,
+ "raceway": 24650,
+ "rach": 6876,
+ "rach": 33429,
+ "racha": 21952,
+ "racha": 35022,
+ "rachael": 29095,
+ "rachel": 13511,
+ "rachel": 8029,
+ "raci": 33381,
+ "racial": 13801,
+ "racially": 43577,
+ "racing": 23306,
+ "racing": 3699,
+ "racism": 11276,
+ "racist": 9684,
+ "racists": 41777,
+ "rack": 24600,
+ "rack": 12034,
+ "racket": 37691,
+ "racks": 21191,
+ "rad": 4473,
+ "rad": 8238,
+ "rada": 30437,
+ "radar": 9672,
+ "radcliffe": 33096,
+ "rade": 44494,
+ "rade": 17911,
+ "rader": 45002,
+ "radford": 45800,
+ "radha": 43122,
+ "radi": 5772,
+ "radial": 42028,
+ "radiance": 45670,
+ "radiant": 25614,
+ "radiation": 18210,
+ "radiator": 39372,
+ "radic": 18082,
+ "radical": 13712,
+ "radicals": 45903,
+ "radio": 7176,
+ "radio": 2638,
+ "radioactive": 34704,
+ "radiodisney": 36483,
+ "radiohead": 39472,
+ "radiology": 29684,
+ "radios": 43669,
+ "radish": 37789,
+ "radius": 37570,
+ "rado": 29784,
+ "rae": 21646,
+ "rae": 15051,
+ "rael": 45390,
+ "raer": 44561,
+ "raf": 11495,
+ "raf": 11490,
+ "rafa": 14352,
+ "rafa": 24850,
+ "rafael": 38221,
+ "rafael": 19216,
+ "rafaelnadal": 49219,
+ "raff": 34900,
+ "raffic": 32928,
+ "raffle": 13752,
+ "raffles": 43489,
+ "rafi": 35304,
+ "raft": 9233,
+ "rafting": 36309,
+ "rag": 13958,
+ "rag": 20687,
+ "rage": 8593,
+ "rages": 34253,
+ "ragh": 35642,
+ "ragha": 40972,
+ "raging": 25015,
+ "ragn": 24125,
+ "ragnar": 34385,
+ "ragnarok": 41856,
+ "ragon": 34768,
+ "rags": 47838,
+ "rah": 12277,
+ "rah": 8766,
+ "raheem": 43317,
+ "rahim": 24152,
+ "rahman": 19680,
+ "rahu": 13129,
+ "rahul": 37239,
+ "rahul": 17440,
+ "rahulg": 27510,
+ "rahulgandhi": 28293,
+ "rai": 9165,
+ "rai": 9638,
+ "raid": 6877,
+ "raided": 43417,
+ "raider": 27368,
+ "raider": 21455,
+ "raidernation": 47901,
+ "raiders": 11817,
+ "raids": 26655,
+ "rail": 4573,
+ "rail": 6879,
+ "raila": 47273,
+ "railminindia": 35557,
+ "railroad": 17080,
+ "rails": 23427,
+ "railway": 27614,
+ "railway": 7856,
+ "railwayana": 46750,
+ "railways": 20765,
+ "raim": 45785,
+ "rain": 3128,
+ "rain": 2443,
+ "raina": 30564,
+ "rainbow": 24562,
+ "rainbow": 6286,
+ "rainbows": 30483,
+ "raine": 49038,
+ "raine": 6871,
+ "rained": 32310,
+ "rainf": 15024,
+ "rainfall": 15350,
+ "rainforest": 22823,
+ "rainier": 37850,
+ "raining": 13964,
+ "rains": 14272,
+ "rainy": 10222,
+ "rais": 14729,
+ "raise": 24249,
+ "raise": 5078,
+ "raised": 6027,
+ "raiser": 33555,
+ "raises": 13297,
+ "raisethe": 47109,
+ "raisin": 36864,
+ "raising": 6883,
+ "raj": 5958,
+ "raj": 10813,
+ "raja": 46069,
+ "raja": 19150,
+ "rajan": 46595,
+ "rajas": 16185,
+ "rajasthan": 18017,
+ "raje": 21899,
+ "rajesh": 43602,
+ "raji": 27569,
+ "rajini": 29600,
+ "rajini": 40622,
+ "rajinikanth": 32922,
+ "rajiv": 40197,
+ "rajkumar": 49304,
+ "rajput": 47572,
+ "raju": 47029,
+ "rak": 13523,
+ "rak": 26287,
+ "rake": 26825,
+ "rake": 32712,
+ "rakesh": 41083,
+ "ral": 8062,
+ "ral": 1406,
+ "rale": 14192,
+ "raleigh": 18207,
+ "rall": 23249,
+ "rallies": 25230,
+ "rally": 18882,
+ "rally": 5041,
+ "rallying": 36836,
+ "ralph": 25290,
+ "ralph": 12234,
+ "ram": 1976,
+ "ram": 2007,
+ "rama": 22112,
+ "ramad": 12736,
+ "ramadan": 15547,
+ "ramadhan": 47415,
+ "raman": 39816,
+ "ramapho": 43963,
+ "ramaphosa": 44993,
+ "ramatta": 49112,
+ "rambo": 41855,
+ "ramcharan": 45275,
+ "rame": 47745,
+ "ramen": 18892,
+ "ramesh": 48640,
+ "ramesh": 40186,
+ "rami": 43016,
+ "ramirez": 23877,
+ "ramon": 27958,
+ "ramone": 47201,
+ "ramos": 21046,
+ "ramp": 14271,
+ "rampage": 32077,
+ "rampant": 41985,
+ "ramps": 35257,
+ "rams": 10292,
+ "ramsay": 26259,
+ "ramsey": 19215,
+ "ran": 1433,
+ "ran": 4031,
+ "rana": 22143,
+ "ranbir": 40881,
+ "rance": 29034,
+ "ranch": 43955,
+ "ranch": 10659,
+ "rancho": 26258,
+ "rand": 5628,
+ "rand": 18718,
+ "randall": 23639,
+ "rande": 21469,
+ "randolph": 29899,
+ "random": 11396,
+ "random": 6160,
+ "randomly": 17272,
+ "rands": 39153,
+ "randy": 29479,
+ "randy": 13279,
+ "rane": 28852,
+ "rang": 4043,
+ "rang": 24377,
+ "range": 13627,
+ "range": 3818,
+ "ranger": 31472,
+ "ranger": 13593,
+ "rangers": 7664,
+ "ranges": 25685,
+ "ranging": 25946,
+ "rani": 29264,
+ "rani": 22631,
+ "rank": 11501,
+ "ranked": 8307,
+ "rankin": 37539,
+ "ranking": 12347,
+ "rankings": 12596,
+ "ranks": 14469,
+ "rano": 18608,
+ "rans": 46259,
+ "ransom": 28523,
+ "ransom": 34646,
+ "ransomware": 33815,
+ "rant": 46467,
+ "rant": 9819,
+ "rants": 34014,
+ "ranveer": 32402,
+ "ranveer": 41482,
+ "ranveerofficial": 42116,
+ "rao": 16913,
+ "rap": 7773,
+ "rap": 7348,
+ "rape": 46099,
+ "rape": 10070,
+ "raped": 23700,
+ "rapha": 22754,
+ "raphael": 30091,
+ "rapi": 8610,
+ "rapid": 47697,
+ "rapid": 12205,
+ "rapidly": 16710,
+ "rapids": 18848,
+ "raping": 44926,
+ "rapist": 33360,
+ "rapp": 19283,
+ "rapper": 11860,
+ "rappers": 30315,
+ "rapping": 42864,
+ "raps": 37887,
+ "raptor": 26762,
+ "raptors": 17035,
+ "raq": 39787,
+ "raq": 43312,
+ "raqqa": 47074,
+ "raquel": 44338,
+ "rar": 26819,
+ "rar": 24605,
+ "rard": 21012,
+ "rare": 18992,
+ "rare": 3865,
+ "rarely": 17315,
+ "rarest": 43237,
+ "rarity": 45862,
+ "ras": 23492,
+ "ras": 8224,
+ "rasc": 30085,
+ "rascal": 43481,
+ "rash": 14917,
+ "rash": 30608,
+ "rashad": 46527,
+ "rasheed": 41638,
+ "rashi": 19426,
+ "rashid": 26757,
+ "rasp": 10487,
+ "raspberries": 37742,
+ "raspberry": 40162,
+ "raspberry": 13615,
+ "raspberrypi": 43934,
+ "rass": 45654,
+ "rasta": 47002,
+ "rat": 3806,
+ "rat": 8985,
+ "rata": 28568,
+ "ratchet": 25078,
+ "rate": 5068,
+ "rated": 8183,
+ "rates": 6864,
+ "rath": 18268,
+ "rath": 39772,
+ "rather": 5252,
+ "rati": 11486,
+ "rating": 10567,
+ "ratings": 14176,
+ "ratio": 15893,
+ "ration": 27002,
+ "ration": 35662,
+ "rational": 33086,
+ "ratna": 49078,
+ "ratri": 32288,
+ "rats": 19043,
+ "ratt": 20737,
+ "ratt": 34785,
+ "rattle": 40824,
+ "rattle": 41839,
+ "rau": 27744,
+ "raul": 30218,
+ "raun": 41169,
+ "rav": 14367,
+ "rav": 23606,
+ "rave": 38784,
+ "rave": 17601,
+ "ravel": 27927,
+ "raven": 10269,
+ "raven": 16803,
+ "ravens": 17946,
+ "ravi": 22947,
+ "ravi": 19538,
+ "ravin": 39099,
+ "raving": 45807,
+ "raviol": 41104,
+ "ravioli": 43460,
+ "raw": 10166,
+ "raw": 6323,
+ "rawlings": 40662,
+ "rax": 38520,
+ "ray": 5312,
+ "ray": 3077,
+ "raya": 29991,
+ "raymond": 16683,
+ "rayn": 47852,
+ "rayon": 47900,
+ "rays": 11064,
+ "raz": 9700,
+ "raz": 19087,
+ "raza": 37724,
+ "razer": 33832,
+ "razor": 24934,
+ "razor": 21300,
+ "razz": 43769,
+ "rb": 12740,
+ "rb": 7477,
+ "rbc": 37500,
+ "rbi": 15687,
+ "rbs": 29102,
+ "rc": 7575,
+ "rc": 7457,
+ "rca": 33942,
+ "rcb": 45240,
+ "rcmp": 31489,
+ "rcn": 49370,
+ "rctid": 49223,
+ "rd": 13501,
+ "rd": 1973,
+ "rda": 45755,
+ "rdr": 44364,
+ "rds": 32378,
+ "re": 515,
+ "re": 810,
+ "rea": 11521,
+ "reach": 4483,
+ "reach": 4279,
+ "reached": 6878,
+ "reaches": 14462,
+ "reaching": 11358,
+ "react": 36566,
+ "react": 15065,
+ "reacted": 42515,
+ "reacting": 40595,
+ "reaction": 7189,
+ "reactions": 18438,
+ "reactive": 42072,
+ "reactjs": 46173,
+ "reactor": 32037,
+ "reacts": 23115,
+ "read": 933,
+ "read": 1199,
+ "reader": 9884,
+ "readers": 10335,
+ "readiness": 28131,
+ "reading": 17556,
+ "reading": 2337,
+ "readingfc": 47428,
+ "readings": 23361,
+ "reads": 6597,
+ "ready": 17351,
+ "ready": 1112,
+ "reagan": 17767,
+ "real": 2017,
+ "real": 1532,
+ "realdonaldtrump": 7025,
+ "reale": 5930,
+ "realest": 45855,
+ "realestate": 32937,
+ "realestate": 6569,
+ "reali": 4185,
+ "realis": 38114,
+ "realise": 14773,
+ "realised": 17945,
+ "realising": 39537,
+ "realism": 20024,
+ "realist": 30248,
+ "realistic": 16157,
+ "realities": 32443,
+ "reality": 46802,
+ "reality": 5004,
+ "realization": 40402,
+ "realize": 7538,
+ "realized": 10489,
+ "realizes": 42918,
+ "realizing": 23284,
+ "reall": 39686,
+ "really": 43249,
+ "really": 1414,
+ "realm": 23083,
+ "realmadrid": 27866,
+ "realms": 43033,
+ "realness": 46761,
+ "realtime": 44002,
+ "realtime": 38203,
+ "realtor": 18038,
+ "realtors": 31759,
+ "realty": 20471,
+ "ream": 37242,
+ "ream": 15219,
+ "rean": 48477,
+ "reap": 31334,
+ "reaper": 29922,
+ "rear": 39652,
+ "rear": 10223,
+ "reas": 9121,
+ "reason": 12882,
+ "reason": 3893,
+ "reasonable": 18558,
+ "reasonably": 38589,
+ "reasoning": 30341,
+ "reasons": 5686,
+ "reau": 32398,
+ "reb": 12370,
+ "reb": 18796,
+ "reba": 48543,
+ "rebate": 43817,
+ "rebe": 25227,
+ "rebec": 10774,
+ "rebecca": 12892,
+ "rebel": 8185,
+ "rebel": 12248,
+ "rebellion": 22170,
+ "rebels": 13623,
+ "rebirth": 33303,
+ "reboot": 22385,
+ "reborn": 30229,
+ "reboun": 43381,
+ "rebound": 31280,
+ "rebounds": 19190,
+ "rebs": 28164,
+ "rebu": 43162,
+ "rebuild": 20022,
+ "rebuilding": 30880,
+ "rebuilt": 33137,
+ "rec": 1020,
+ "rec": 11243,
+ "recall": 15151,
+ "recalled": 32142,
+ "recalling": 47855,
+ "recalls": 24740,
+ "recap": 29816,
+ "recap": 8337,
+ "recaps": 47997,
+ "recard": 35536,
+ "rece": 1890,
+ "recei": 2148,
+ "receip": 38503,
+ "receipt": 30479,
+ "receipts": 41181,
+ "receive": 4800,
+ "received": 4178,
+ "receiver": 17659,
+ "receivers": 45294,
+ "receives": 10027,
+ "receiving": 7252,
+ "recent": 3969,
+ "recently": 4482,
+ "recep": 17450,
+ "reception": 8364,
+ "receptions": 46881,
+ "receptor": 41835,
+ "recess": 38182,
+ "recession": 27176,
+ "recharge": 29396,
+ "rechargeable": 37516,
+ "reci": 2037,
+ "recipe": 28923,
+ "recipe": 4614,
+ "recipeoftheday": 38727,
+ "recipes": 9243,
+ "recipi": 10136,
+ "recipient": 13703,
+ "recipients": 18940,
+ "recipro": 41789,
+ "recital": 23457,
+ "recite": 48824,
+ "reck": 11715,
+ "reckless": 26284,
+ "reckon": 23854,
+ "recl": 42277,
+ "reclaim": 35969,
+ "reclaimed": 32648,
+ "reco": 2535,
+ "reco": 46038,
+ "recogn": 6343,
+ "recogni": 5329,
+ "recognise": 19824,
+ "recognised": 20986,
+ "recognising": 48423,
+ "recognition": 9415,
+ "recognizable": 47240,
+ "recognize": 10905,
+ "recognized": 9929,
+ "recognizes": 26909,
+ "recognizing": 19666,
+ "recomm": 4540,
+ "recommend": 11628,
+ "recommend": 8942,
+ "recommendation": 20118,
+ "recommendations": 16516,
+ "recommended": 11100,
+ "recommending": 44301,
+ "recommends": 22940,
+ "recon": 15371,
+ "recon": 28996,
+ "reconciliation": 26451,
+ "reconstruction": 24955,
+ "recor": 1723,
+ "record": 21328,
+ "record": 2717,
+ "recorded": 9392,
+ "recorder": 26747,
+ "recording": 48237,
+ "recording": 6942,
+ "recordings": 19715,
+ "records": 4529,
+ "recover": 16785,
+ "recovered": 16444,
+ "recovering": 19005,
+ "recovers": 47935,
+ "recovery": 6591,
+ "recre": 22148,
+ "recreate": 29775,
+ "recreated": 40888,
+ "recreating": 48224,
+ "recreation": 17331,
+ "recreational": 24329,
+ "recru": 4745,
+ "recruit": 9011,
+ "recruit": 15585,
+ "recruited": 36518,
+ "recruiter": 43120,
+ "recruiters": 46542,
+ "recruiting": 10533,
+ "recruitment": 10541,
+ "recruits": 22647,
+ "recs": 33069,
+ "rectan": 43041,
+ "rectangular": 43321,
+ "rector": 41585,
+ "recu": 26798,
+ "recur": 19983,
+ "recurring": 35912,
+ "recy": 6790,
+ "recycla": 40659,
+ "recyclable": 48907,
+ "recycle": 19366,
+ "recycled": 16829,
+ "recycling": 12566,
+ "red": 1893,
+ "red": 736,
+ "redbubble": 46137,
+ "redbull": 29483,
+ "redbull": 29219,
+ "redcarpet": 32259,
+ "redcross": 30659,
+ "redd": 22149,
+ "redd": 40618,
+ "redding": 41061,
+ "reddish": 43383,
+ "reddit": 15226,
+ "reddy": 23028,
+ "rede": 10913,
+ "redeem": 37449,
+ "redefining": 46352,
+ "redemption": 20233,
+ "redesign": 24188,
+ "redesigned": 33111,
+ "redevelopment": 30322,
+ "redhead": 36267,
+ "redi": 7976,
+ "redman": 44753,
+ "redmond": 39627,
+ "rednation": 28180,
+ "rednationrising": 28262,
+ "redneck": 39105,
+ "redness": 22626,
+ "redo": 42524,
+ "redon": 48506,
+ "redro": 37722,
+ "reds": 11221,
+ "redskins": 19023,
+ "redsox": 19144,
+ "reduc": 5015,
+ "reduce": 6604,
+ "reduced": 10821,
+ "reduces": 20539,
+ "reducing": 13836,
+ "reduction": 12219,
+ "reductions": 48263,
+ "redux": 43014,
+ "redvelvet": 41845,
+ "redwings": 31058,
+ "redwood": 31748,
+ "ree": 9282,
+ "ree": 5813,
+ "reebok": 26734,
+ "reece": 30457,
+ "reed": 26209,
+ "reed": 10435,
+ "reedus": 32865,
+ "reef": 46557,
+ "reef": 15624,
+ "reefs": 34459,
+ "reel": 34467,
+ "reel": 17166,
+ "reels": 48127,
+ "reem": 48891,
+ "reen": 21638,
+ "reen": 23679,
+ "rees": 18314,
+ "reese": 20929,
+ "reeves": 23060,
+ "ref": 4067,
+ "ref": 9591,
+ "refe": 5624,
+ "refer": 18425,
+ "refer": 22325,
+ "referee": 20398,
+ "referees": 45583,
+ "referen": 13535,
+ "reference": 10214,
+ "references": 24009,
+ "referendum": 16732,
+ "referr": 47784,
+ "referral": 30219,
+ "referred": 22969,
+ "referring": 29797,
+ "refers": 30069,
+ "refill": 37859,
+ "refin": 13455,
+ "refined": 26098,
+ "refinery": 31393,
+ "refining": 48406,
+ "reflec": 4608,
+ "reflect": 13373,
+ "reflected": 28732,
+ "reflecting": 19700,
+ "reflection": 11884,
+ "reflections": 16647,
+ "reflective": 27008,
+ "reflects": 15821,
+ "reflex": 45756,
+ "reflex": 36050,
+ "reform": 45678,
+ "reform": 8875,
+ "reformation": 45119,
+ "reformed": 40880,
+ "reforms": 19274,
+ "refr": 34850,
+ "refre": 11995,
+ "refresh": 17836,
+ "refresh": 23288,
+ "refreshed": 35925,
+ "refresher": 41481,
+ "refreshing": 14159,
+ "refreshments": 31127,
+ "refriger": 21076,
+ "refrigerator": 36662,
+ "refs": 35595,
+ "refu": 3545,
+ "refuge": 5638,
+ "refuge": 17432,
+ "refugee": 11556,
+ "refugees": 42687,
+ "refugees": 8316,
+ "refund": 28899,
+ "refur": 15519,
+ "refurbi": 18259,
+ "refurbished": 26190,
+ "refurbishment": 35803,
+ "refusal": 46547,
+ "refuse": 16412,
+ "refused": 17190,
+ "refuses": 20085,
+ "refusing": 26704,
+ "reg": 5472,
+ "reg": 12353,
+ "regain": 37510,
+ "regal": 31512,
+ "regal": 25028,
+ "regan": 34062,
+ "regar": 5881,
+ "regard": 21801,
+ "regarded": 32017,
+ "regarding": 8493,
+ "regardless": 17220,
+ "regards": 23079,
+ "regatta": 26316,
+ "regen": 46545,
+ "regency": 29341,
+ "regeneration": 29257,
+ "regent": 30455,
+ "regents": 46710,
+ "regg": 12757,
+ "reggae": 37821,
+ "reggae": 15214,
+ "reggie": 21872,
+ "regi": 1608,
+ "regime": 11378,
+ "regiment": 18603,
+ "regin": 23287,
+ "regina": 16841,
+ "region": 16542,
+ "region": 4341,
+ "regional": 5552,
+ "regionals": 26043,
+ "regions": 14530,
+ "regis": 28094,
+ "register": 3967,
+ "registered": 10254,
+ "registering": 33510,
+ "registr": 29193,
+ "registration": 7302,
+ "registrations": 38423,
+ "registry": 30020,
+ "rego": 47351,
+ "regram": 30329,
+ "regrann": 48802,
+ "regre": 8627,
+ "regression": 43733,
+ "regret": 14374,
+ "regrets": 23231,
+ "regu": 3411,
+ "regui": 46722,
+ "regul": 11847,
+ "regular": 14882,
+ "regular": 6307,
+ "regularly": 17263,
+ "regulat": 14575,
+ "regulate": 33494,
+ "regulated": 31384,
+ "regulating": 48156,
+ "regulation": 14267,
+ "regulations": 16654,
+ "regulator": 30364,
+ "regulators": 35837,
+ "regulatory": 17717,
+ "reh": 21492,
+ "reha": 10193,
+ "rehab": 16973,
+ "rehabil": 17930,
+ "rehabilitation": 21042,
+ "rehear": 7273,
+ "rehearsal": 11482,
+ "rehearsals": 17977,
+ "rehearsing": 23125,
+ "rehman": 39206,
+ "rei": 15343,
+ "rei": 26033,
+ "reic": 41230,
+ "reich": 48589,
+ "reich": 28929,
+ "reid": 45125,
+ "reid": 11744,
+ "reig": 13092,
+ "reign": 41419,
+ "reign": 14827,
+ "reigning": 28409,
+ "reigns": 21217,
+ "reiki": 46960,
+ "reilly": 28120,
+ "reim": 35421,
+ "reimagined": 46799,
+ "reimbur": 39857,
+ "rein": 9240,
+ "rein": 45009,
+ "reina": 43847,
+ "reinde": 23810,
+ "reindeer": 25072,
+ "reinfor": 48161,
+ "reinforced": 41909,
+ "reinst": 33969,
+ "reinvent": 38171,
+ "reissue": 34042,
+ "reiter": 35394,
+ "rejec": 9958,
+ "reject": 22435,
+ "rejected": 17505,
+ "rejection": 32264,
+ "rejects": 23155,
+ "rejo": 20150,
+ "rejoice": 24712,
+ "rejuven": 26332,
+ "rek": 47542,
+ "rek": 19201,
+ "rel": 1825,
+ "rel": 5233,
+ "rela": 4362,
+ "reland": 15220,
+ "relat": 27192,
+ "relatable": 31010,
+ "relate": 17520,
+ "related": 5880,
+ "relates": 36064,
+ "relating": 27373,
+ "relation": 4561,
+ "relation": 16207,
+ "relations": 10100,
+ "relationship": 47239,
+ "relationship": 5837,
+ "relationships": 10610,
+ "relative": 17265,
+ "relatively": 18351,
+ "relatives": 21981,
+ "relax": 6777,
+ "relax": 9035,
+ "relaxation": 22194,
+ "relaxed": 18999,
+ "relaxing": 10256,
+ "relay": 12403,
+ "relays": 28404,
+ "rele": 1602,
+ "release": 29100,
+ "release": 2706,
+ "released": 3410,
+ "releases": 7393,
+ "releasethe": 44008,
+ "releasing": 10321,
+ "releg": 23378,
+ "relegated": 45884,
+ "relegation": 35040,
+ "relent": 22213,
+ "relentless": 27207,
+ "relessly": 33927,
+ "relev": 9349,
+ "relevance": 31400,
+ "relevant": 10568,
+ "reli": 2674,
+ "reliability": 27220,
+ "reliable": 13714,
+ "reliance": 27727,
+ "relic": 27802,
+ "relics": 43208,
+ "relief": 7518,
+ "relies": 41579,
+ "relieve": 28623,
+ "relieved": 36597,
+ "religi": 4940,
+ "religion": 8803,
+ "religions": 31189,
+ "religious": 8289,
+ "relish": 35550,
+ "relive": 23939,
+ "reliving": 47558,
+ "rell": 28802,
+ "rell": 7127,
+ "rella": 9952,
+ "relle": 31390,
+ "reloaded": 38908,
+ "relocated": 46791,
+ "relocation": 39198,
+ "rels": 23320,
+ "relu": 32058,
+ "reluct": 32549,
+ "reluctant": 45552,
+ "rely": 4158,
+ "relying": 42168,
+ "rem": 15098,
+ "rem": 21637,
+ "rema": 4569,
+ "remain": 29144,
+ "remain": 6415,
+ "remainder": 41672,
+ "remained": 23714,
+ "remaining": 11392,
+ "remains": 6807,
+ "remake": 16234,
+ "remark": 11136,
+ "remarkable": 12404,
+ "remarkably": 39087,
+ "remarks": 15001,
+ "remastered": 24932,
+ "rematch": 26473,
+ "rembrandt": 45972,
+ "reme": 20071,
+ "remedi": 18442,
+ "remedies": 25581,
+ "remedy": 25794,
+ "remem": 7966,
+ "rememb": 7062,
+ "remember": 22045,
+ "remember": 2195,
+ "remembered": 11763,
+ "remembering": 8135,
+ "remembers": 12551,
+ "remembrance": 40321,
+ "remembrance": 15860,
+ "remembranceday": 48333,
+ "rement": 7173,
+ "rements": 12667,
+ "remi": 41693,
+ "remin": 3216,
+ "remind": 9868,
+ "reminded": 12309,
+ "reminder": 5565,
+ "reminders": 34121,
+ "reminding": 19976,
+ "reminds": 8303,
+ "remington": 43527,
+ "reminis": 17723,
+ "reminiscent": 41704,
+ "reminiscing": 32552,
+ "remix": 8519,
+ "remixes": 31011,
+ "remn": 29127,
+ "remnants": 39032,
+ "remo": 4064,
+ "remo": 33259,
+ "remodel": 34159,
+ "remodel": 37495,
+ "remodeling": 41432,
+ "remote": 47163,
+ "remote": 9687,
+ "remotely": 32375,
+ "removable": 44095,
+ "removal": 13679,
+ "remove": 9709,
+ "removed": 10289,
+ "remover": 44267,
+ "removes": 29018,
+ "removing": 18504,
+ "remy": 30434,
+ "ren": 737,
+ "ren": 2596,
+ "rena": 12591,
+ "renais": 15409,
+ "renaissance": 16007,
+ "renal": 36096,
+ "renamed": 31535,
+ "renault": 17600,
+ "rence": 19245,
+ "rence": 1553,
+ "rences": 8545,
+ "rend": 33932,
+ "rend": 22851,
+ "render": 39752,
+ "render": 13024,
+ "rendered": 23652,
+ "rendering": 21339,
+ "renders": 39419,
+ "rendez": 43293,
+ "rendezvous": 45644,
+ "rendition": 28891,
+ "rendon": 46272,
+ "rendous": 49403,
+ "rends": 38842,
+ "rene": 15438,
+ "rene": 12597,
+ "renee": 23480,
+ "reneg": 29909,
+ "renegade": 41229,
+ "renergy": 37151,
+ "renew": 6645,
+ "renew": 22015,
+ "renewable": 31269,
+ "renewable": 15941,
+ "renewableenergy": 33357,
+ "renewables": 21619,
+ "renewal": 21270,
+ "renewed": 20524,
+ "renfre": 45043,
+ "reng": 36795,
+ "reno": 11520,
+ "reno": 12831,
+ "renov": 9984,
+ "renovated": 23839,
+ "renovation": 17121,
+ "renovations": 31311,
+ "renowned": 14727,
+ "rens": 18183,
+ "renshaw": 44445,
+ "rent": 17377,
+ "rent": 1609,
+ "rental": 12193,
+ "rentals": 24105,
+ "rented": 35932,
+ "rential": 31692,
+ "renting": 37662,
+ "rently": 2615,
+ "rents": 31109,
+ "reo": 15963,
+ "reo": 26854,
+ "reon": 15761,
+ "reopen": 26883,
+ "reopened": 32868,
+ "reopening": 36663,
+ "reopens": 40644,
+ "rep": 4229,
+ "rep": 6487,
+ "repair": 8419,
+ "repaired": 32953,
+ "repairing": 38534,
+ "repairs": 16297,
+ "repar": 34065,
+ "repe": 5785,
+ "repeal": 42622,
+ "repeal": 23938,
+ "repeat": 10192,
+ "repeated": 27904,
+ "repeatedly": 26630,
+ "repeating": 33834,
+ "repeats": 39158,
+ "repell": 46235,
+ "repent": 47261,
+ "reper": 29085,
+ "repet": 38533,
+ "repl": 13047,
+ "replac": 6069,
+ "replace": 9466,
+ "replaceable": 47762,
+ "replaced": 13200,
+ "replacement": 10835,
+ "replaces": 27781,
+ "replacing": 18647,
+ "replay": 16875,
+ "repleni": 44839,
+ "replic": 21651,
+ "replica": 18125,
+ "replied": 24238,
+ "replies": 18808,
+ "reply": 8965,
+ "replying": 47599,
+ "repor": 2628,
+ "report": 2417,
+ "reported": 7598,
+ "reportedly": 10953,
+ "reporter": 11019,
+ "reporters": 18454,
+ "reporting": 9218,
+ "reports": 4908,
+ "reposit": 41276,
+ "repository": 46977,
+ "repost": 33147,
+ "repost": 7217,
+ "repostapp": 38388,
+ "reposting": 20223,
+ "reppin": 19163,
+ "repping": 22574,
+ "repre": 3397,
+ "represent": 8293,
+ "represent": 8406,
+ "representation": 13520,
+ "representative": 13175,
+ "representatives": 15591,
+ "represented": 12299,
+ "representing": 7561,
+ "represents": 14433,
+ "repri": 31854,
+ "reproduction": 35714,
+ "reproductive": 25522,
+ "reps": 14265,
+ "reptile": 36938,
+ "reptiles": 38679,
+ "republic": 6376,
+ "republic": 7185,
+ "republican": 9842,
+ "republicans": 12384,
+ "repur": 41852,
+ "req": 42411,
+ "requ": 10664,
+ "reque": 9539,
+ "request": 7813,
+ "requested": 16199,
+ "requesting": 33245,
+ "requests": 17087,
+ "requi": 4863,
+ "requiem": 40316,
+ "require": 14437,
+ "required": 8500,
+ "requirement": 27146,
+ "requirements": 12860,
+ "requires": 13396,
+ "requiring": 33425,
+ "requis": 42602,
+ "rer": 41295,
+ "rer": 3407,
+ "rera": 14301,
+ "rero": 21860,
+ "rers": 18869,
+ "res": 4466,
+ "res": 934,
+ "resc": 3956,
+ "rescheduled": 43553,
+ "rescu": 8618,
+ "rescue": 28567,
+ "rescue": 5718,
+ "rescued": 11919,
+ "rescues": 32439,
+ "rescuing": 43770,
+ "rese": 13000,
+ "resear": 6090,
+ "research": 25694,
+ "research": 2379,
+ "researched": 42733,
+ "researcher": 18334,
+ "researchers": 9522,
+ "researching": 24544,
+ "reseller": 35391,
+ "resemb": 16916,
+ "resemblance": 26856,
+ "resemble": 37230,
+ "resembles": 35417,
+ "reser": 16420,
+ "reserv": 11906,
+ "reservation": 20289,
+ "reservations": 19307,
+ "reserve": 6911,
+ "reserved": 19796,
+ "reserves": 19705,
+ "reservoir": 20574,
+ "reset": 26250,
+ "resh": 47432,
+ "reshi": 39435,
+ "resi": 2152,
+ "residen": 22311,
+ "residence": 11672,
+ "residences": 38855,
+ "residency": 18545,
+ "resident": 9016,
+ "residente": 44637,
+ "residentevil": 48393,
+ "residential": 11002,
+ "residents": 6008,
+ "resign": 23584,
+ "resignation": 24779,
+ "resigned": 31014,
+ "resigns": 29738,
+ "resil": 10932,
+ "resili": 39212,
+ "resilience": 15271,
+ "resilient": 24694,
+ "resin": 24156,
+ "resist": 37345,
+ "resist": 9587,
+ "resistance": 7392,
+ "resistant": 17542,
+ "resisting": 43679,
+ "resolution": 9977,
+ "resolutions": 26816,
+ "resolve": 20787,
+ "resolved": 28807,
+ "reson": 18092,
+ "resonance": 42310,
+ "resort": 6594,
+ "resorts": 18839,
+ "resource": 43729,
+ "resource": 9760,
+ "resources": 6723,
+ "respec": 7466,
+ "respect": 31411,
+ "respect": 4916,
+ "respected": 19126,
+ "respectful": 24379,
+ "respecting": 36172,
+ "respective": 25817,
+ "respectively": 28794,
+ "respects": 23553,
+ "respir": 20771,
+ "respiratory": 24483,
+ "respon": 2421,
+ "respond": 12355,
+ "responded": 21121,
+ "respondents": 49253,
+ "responders": 25155,
+ "responding": 18037,
+ "responds": 17436,
+ "response": 5399,
+ "responses": 19006,
+ "responsi": 5490,
+ "responsibilities": 30375,
+ "responsibility": 11272,
+ "responsible": 8936,
+ "responsibly": 33675,
+ "responsive": 21544,
+ "ress": 34651,
+ "ress": 13629,
+ "resso": 15133,
+ "rest": 10974,
+ "rest": 2539,
+ "restart": 37378,
+ "restaur": 3775,
+ "restaurant": 41930,
+ "restaurant": 4489,
+ "restaurants": 11714,
+ "rested": 46020,
+ "resting": 18044,
+ "restless": 36724,
+ "restling": 30076,
+ "resto": 11118,
+ "resto": 41666,
+ "restock": 34060,
+ "restocked": 36966,
+ "restor": 8984,
+ "restoration": 11989,
+ "restorative": 46509,
+ "restore": 14008,
+ "restored": 14238,
+ "restoring": 24406,
+ "restra": 25424,
+ "restric": 11036,
+ "restricted": 27197,
+ "restriction": 44282,
+ "restrictions": 19884,
+ "restroom": 43423,
+ "restructuring": 43260,
+ "rests": 33775,
+ "resu": 10095,
+ "resul": 2655,
+ "result": 5659,
+ "resulted": 26449,
+ "resulting": 24581,
+ "results": 3790,
+ "resume": 15077,
+ "resumes": 30268,
+ "resur": 14865,
+ "resurg": 45962,
+ "resurgence": 47692,
+ "resurrec": 18487,
+ "resurrection": 25811,
+ "resusc": 47523,
+ "ret": 20500,
+ "ret": 10048,
+ "reta": 20153,
+ "retail": 14910,
+ "retail": 6455,
+ "retailer": 22549,
+ "retailers": 19418,
+ "retain": 24430,
+ "retained": 42737,
+ "retaining": 35571,
+ "retains": 42583,
+ "retali": 33101,
+ "retar": 29964,
+ "retarded": 44111,
+ "retention": 26247,
+ "rethink": 29078,
+ "rethinking": 42951,
+ "reti": 4721,
+ "retin": 31270,
+ "retina": 36919,
+ "retire": 18846,
+ "retired": 11477,
+ "retirement": 9205,
+ "retires": 29060,
+ "retiring": 21200,
+ "retrac": 32735,
+ "retreat": 11210,
+ "retri": 16918,
+ "retriever": 28394,
+ "retro": 6535,
+ "retro": 7755,
+ "retrogamer": 47220,
+ "retrogaming": 11316,
+ "retrospective": 27105,
+ "rett": 41082,
+ "rett": 8425,
+ "rette": 33066,
+ "return": 43042,
+ "return": 3458,
+ "returned": 10476,
+ "returning": 9290,
+ "returns": 5020,
+ "retwee": 48190,
+ "retweet": 3195,
+ "retweeted": 12705,
+ "retweeting": 32345,
+ "retweets": 10160,
+ "rety": 41550,
+ "reu": 20255,
+ "reu": 40371,
+ "reuben": 40450,
+ "reunion": 10247,
+ "reunite": 26179,
+ "reunited": 13516,
+ "reusable": 30395,
+ "reuse": 26535,
+ "reut": 15210,
+ "reuters": 15569,
+ "rev": 8424,
+ "rev": 11789,
+ "revamp": 29819,
+ "revamped": 36420,
+ "revan": 45277,
+ "reve": 3115,
+ "reveal": 8052,
+ "revealed": 7171,
+ "revealing": 21321,
+ "reveals": 6621,
+ "revel": 14133,
+ "revelation": 24053,
+ "revelations": 36163,
+ "reven": 10171,
+ "revenge": 12717,
+ "revenue": 10637,
+ "revenues": 33348,
+ "rever": 14829,
+ "rever": 41913,
+ "revere": 44187,
+ "reverend": 34407,
+ "revers": 20726,
+ "reversal": 33367,
+ "reverse": 12812,
+ "reversed": 42485,
+ "reversi": 31601,
+ "reversible": 34212,
+ "revi": 8317,
+ "review": 2268,
+ "reviewed": 16678,
+ "reviewer": 36409,
+ "reviewers": 48195,
+ "reviewing": 20458,
+ "reviews": 7227,
+ "revise": 46801,
+ "revised": 22806,
+ "revising": 46882,
+ "revision": 20335,
+ "revisit": 26568,
+ "revisited": 34302,
+ "revisiting": 33144,
+ "revit": 26367,
+ "revitalization": 46923,
+ "revival": 14142,
+ "revive": 26450,
+ "revived": 42912,
+ "revo": 28660,
+ "revol": 13447,
+ "revolt": 31697,
+ "revolu": 4900,
+ "revolution": 17699,
+ "revolution": 6644,
+ "revolutionary": 14734,
+ "revolver": 38747,
+ "revolving": 47230,
+ "revs": 49286,
+ "revue": 43428,
+ "rew": 37564,
+ "rewar": 15857,
+ "reward": 11223,
+ "rewarded": 27163,
+ "rewarding": 23351,
+ "rewards": 15235,
+ "rewatch": 35610,
+ "rewatching": 41287,
+ "rewind": 26867,
+ "rewrite": 45218,
+ "rex": 13002,
+ "rex": 10904,
+ "rexperience": 33924,
+ "rey": 9681,
+ "rey": 4517,
+ "reyes": 18255,
+ "reykja": 47571,
+ "reyn": 11998,
+ "reynolds": 14309,
+ "reys": 48284,
+ "rez": 27597,
+ "rez": 15192,
+ "reza": 35888,
+ "rf": 35529,
+ "rf": 16368,
+ "rfc": 19003,
+ "rfid": 40204,
+ "rg": 33055,
+ "rg": 14897,
+ "rgb": 36128,
+ "rgv": 33685,
+ "rh": 8745,
+ "rh": 22404,
+ "rha": 19473,
+ "rhapso": 32532,
+ "rhapsody": 35774,
+ "rhe": 9186,
+ "rhea": 28612,
+ "rhetor": 24359,
+ "rhetoric": 29985,
+ "rhett": 42984,
+ "rheu": 42953,
+ "rhi": 21212,
+ "rhin": 12269,
+ "rhine": 22863,
+ "rhine": 44833,
+ "rhinestone": 30450,
+ "rhino": 41744,
+ "rhino": 20056,
+ "rhinos": 30671,
+ "rho": 7637,
+ "rhode": 39302,
+ "rhode": 27907,
+ "rhodes": 17785,
+ "rhon": 25882,
+ "rhonda": 46100,
+ "rhp": 27199,
+ "rhs": 24551,
+ "rhu": 23897,
+ "rhubarb": 30213,
+ "rhy": 7740,
+ "rhyme": 37356,
+ "rhymes": 33143,
+ "rhys": 28647,
+ "rhyth": 27069,
+ "rhythm": 16172,
+ "rhythmic": 46386,
+ "rhythms": 40872,
+ "ri": 553,
+ "ri": 2574,
+ "ria": 3650,
+ "rial": 15200,
+ "rian": 7788,
+ "rib": 44634,
+ "rib": 18298,
+ "riba": 44992,
+ "ribb": 10081,
+ "ribbon": 12114,
+ "ribbons": 35271,
+ "ribe": 46115,
+ "ribs": 17519,
+ "ric": 920,
+ "ric": 4798,
+ "rica": 14230,
+ "rical": 18109,
+ "rican": 30958,
+ "ricardo": 23140,
+ "ricci": 35783,
+ "ricciardo": 49282,
+ "rice": 36362,
+ "rice": 4741,
+ "rich": 5223,
+ "rich": 4021,
+ "richar": 9350,
+ "richard": 9080,
+ "richard": 4470,
+ "richards": 11372,
+ "richardson": 15984,
+ "riche": 23286,
+ "richer": 34138,
+ "riches": 37093,
+ "richest": 25572,
+ "richi": 38934,
+ "richie": 19797,
+ "richland": 43079,
+ "richmond": 34143,
+ "richmond": 11292,
+ "richter": 37591,
+ "rick": 6237,
+ "rick": 3064,
+ "ricket": 46161,
+ "ricket": 23671,
+ "ricks": 23111,
+ "ricky": 19188,
+ "ricky": 12814,
+ "rico": 37962,
+ "rico": 11362,
+ "ricotta": 38473,
+ "rics": 7353,
+ "ricul": 6980,
+ "rid": 18103,
+ "rid": 9874,
+ "ridd": 21990,
+ "ridden": 32025,
+ "riddle": 31839,
+ "ride": 15816,
+ "ride": 2994,
+ "rider": 31056,
+ "rider": 9707,
+ "riders": 10826,
+ "rides": 11308,
+ "ridg": 42646,
+ "ridge": 16580,
+ "ridge": 6352,
+ "ridic": 9624,
+ "ridiculous": 12659,
+ "ridiculously": 25661,
+ "ridin": 47869,
+ "riding": 6765,
+ "ridley": 27883,
+ "rie": 14824,
+ "rie": 5322,
+ "ried": 7552,
+ "riel": 26696,
+ "rien": 35237,
+ "rier": 40714,
+ "rier": 13336,
+ "ries": 28179,
+ "ries": 3059,
+ "riesling": 36372,
+ "rif": 7044,
+ "riff": 30359,
+ "rifle": 15354,
+ "rifles": 25678,
+ "rift": 26681,
+ "rig": 18462,
+ "rig": 13871,
+ "riga": 36626,
+ "rigged": 35897,
+ "rigging": 38160,
+ "riggs": 40328,
+ "righ": 15391,
+ "right": 13341,
+ "right": 1155,
+ "righte": 20762,
+ "righteous": 28169,
+ "righteousness": 42481,
+ "rightful": 42601,
+ "rightly": 42669,
+ "rights": 3336,
+ "rigid": 43138,
+ "rigor": 36788,
+ "rigorous": 41654,
+ "rigs": 42893,
+ "rihanna": 13744,
+ "rij": 41097,
+ "rik": 31136,
+ "rik": 27832,
+ "rika": 28580,
+ "ril": 12270,
+ "ril": 2388,
+ "riley": 35056,
+ "riley": 12260,
+ "rill": 23705,
+ "rilla": 43956,
+ "rilla": 18685,
+ "rim": 28147,
+ "rim": 12199,
+ "rime": 27064,
+ "rimin": 11527,
+ "rimo": 47817,
+ "rims": 34327,
+ "rin": 5859,
+ "rin": 11739,
+ "rina": 12869,
+ "rine": 24952,
+ "ring": 8318,
+ "ring": 2540,
+ "ringed": 44712,
+ "ringer": 35761,
+ "ringing": 26035,
+ "ringo": 38845,
+ "rings": 5751,
+ "rington": 12455,
+ "rink": 21497,
+ "rinka": 47316,
+ "rino": 47188,
+ "rinse": 48320,
+ "rio": 15681,
+ "rio": 5782,
+ "rion": 31623,
+ "rion": 34046,
+ "rios": 32814,
+ "riot": 32636,
+ "riot": 14218,
+ "riots": 24844,
+ "rious": 6340,
+ "rip": 10353,
+ "rip": 4243,
+ "ripe": 22832,
+ "ripley": 41589,
+ "ripp": 25276,
+ "ripped": 17815,
+ "ripper": 35347,
+ "ripping": 29126,
+ "ripple": 24825,
+ "rips": 30182,
+ "rir": 36792,
+ "ris": 6108,
+ "ris": 1999,
+ "rise": 13641,
+ "rise": 3151,
+ "risen": 23653,
+ "risers": 44983,
+ "rises": 13362,
+ "riseup": 35760,
+ "rish": 18378,
+ "rish": 18927,
+ "rishi": 48434,
+ "rising": 30452,
+ "rising": 5448,
+ "risis": 37998,
+ "risk": 27967,
+ "risk": 4213,
+ "risking": 48155,
+ "risks": 12474,
+ "risky": 27630,
+ "risotto": 31471,
+ "rist": 40610,
+ "rit": 5156,
+ "rit": 17333,
+ "rita": 16178,
+ "ritchie": 30997,
+ "rite": 39318,
+ "rite": 18429,
+ "rites": 36160,
+ "rith": 48169,
+ "rith": 48850,
+ "riti": 32904,
+ "rito": 19379,
+ "ritos": 33507,
+ "ritt": 26092,
+ "ritter": 34854,
+ "ritu": 13391,
+ "ritual": 19712,
+ "rituals": 31145,
+ "ritz": 39151,
+ "ritz": 25627,
+ "rium": 33884,
+ "riv": 25113,
+ "rival": 13412,
+ "rival": 15629,
+ "rivalry": 19511,
+ "rivals": 15135,
+ "rive": 27588,
+ "rive": 34917,
+ "river": 5239,
+ "river": 2473,
+ "rivera": 18275,
+ "riverdale": 28304,
+ "riverfront": 44439,
+ "rivers": 10723,
+ "riverside": 15809,
+ "riveting": 44024,
+ "riviera": 25851,
+ "rix": 43407,
+ "rix": 9483,
+ "riya": 36908,
+ "riyad": 31564,
+ "riyadh": 33577,
+ "riz": 18426,
+ "riz": 35411,
+ "rizal": 41555,
+ "rizio": 40191,
+ "rizz": 34826,
+ "rizzo": 49076,
+ "rj": 26016,
+ "rj": 20949,
+ "rk": 38725,
+ "rk": 21422,
+ "rl": 18041,
+ "rl": 14590,
+ "rlly": 43222,
+ "rly": 25954,
+ "rm": 20202,
+ "rm": 8431,
+ "rmb": 49097,
+ "rms": 40529,
+ "rn": 13206,
+ "rn": 7666,
+ "rna": 24566,
+ "rnb": 31556,
+ "rnc": 35309,
+ "rnli": 29748,
+ "ro": 532,
+ "ro": 2795,
+ "roa": 8313,
+ "roach": 31073,
+ "road": 4370,
+ "road": 1759,
+ "roadhouse": 47891,
+ "roadmap": 30111,
+ "roads": 6189,
+ "roadsafety": 39992,
+ "roadshow": 21168,
+ "roadside": 26928,
+ "roadster": 28920,
+ "roadto": 24681,
+ "roadtrip": 15094,
+ "roadway": 42744,
+ "roam": 34045,
+ "roaming": 29240,
+ "roano": 34184,
+ "roanoke": 36587,
+ "roar": 34193,
+ "roar": 18483,
+ "roaring": 26428,
+ "roast": 11404,
+ "roasted": 10479,
+ "roasting": 32228,
+ "rob": 2668,
+ "rob": 6442,
+ "robb": 14059,
+ "robb": 39673,
+ "robbed": 24163,
+ "robber": 35545,
+ "robbers": 40852,
+ "robbery": 16393,
+ "robbi": 44898,
+ "robbie": 37200,
+ "robbie": 15970,
+ "robbing": 47569,
+ "robbins": 23461,
+ "robby": 44128,
+ "robe": 23116,
+ "rober": 4532,
+ "robert": 8811,
+ "robert": 3929,
+ "roberta": 43373,
+ "roberto": 42645,
+ "roberto": 16227,
+ "roberts": 10366,
+ "robertson": 17643,
+ "robes": 29304,
+ "robi": 16743,
+ "robin": 6681,
+ "robin": 7988,
+ "robins": 35502,
+ "robinson": 8523,
+ "robles": 47646,
+ "roblo": 27481,
+ "roblox": 37798,
+ "robo": 4672,
+ "robo": 36057,
+ "robot": 46089,
+ "robot": 8797,
+ "robotic": 23975,
+ "robotics": 13546,
+ "robots": 13473,
+ "robson": 31113,
+ "robust": 22780,
+ "robyn": 34533,
+ "roc": 3268,
+ "roc": 13776,
+ "rocco": 30009,
+ "roch": 23788,
+ "rochdale": 41880,
+ "roche": 31776,
+ "rochelle": 40161,
+ "rochester": 18057,
+ "rock": 2640,
+ "rock": 2172,
+ "rockab": 39353,
+ "rockabilly": 45019,
+ "rocke": 19914,
+ "rocked": 16116,
+ "rockefeller": 35476,
+ "rocker": 29008,
+ "rockers": 32338,
+ "rocket": 25435,
+ "rocket": 8383,
+ "rockets": 13292,
+ "rockford": 41039,
+ "rockies": 20621,
+ "rockin": 12073,
+ "rocking": 7081,
+ "rockn": 24442,
+ "rocknroll": 27840,
+ "rocks": 6135,
+ "rockstar": 23603,
+ "rockstar": 18000,
+ "rockstargames": 27516,
+ "rockstars": 46639,
+ "rockthe": 49363,
+ "rockwell": 34747,
+ "rocky": 33481,
+ "rocky": 9648,
+ "rod": 9712,
+ "rod": 8291,
+ "roddy": 42332,
+ "rode": 18449,
+ "rodeo": 18250,
+ "rodgers": 17612,
+ "rodi": 49100,
+ "rodney": 21753,
+ "rodri": 11053,
+ "rodrigo": 33944,
+ "rodriguez": 14057,
+ "rods": 28618,
+ "roe": 27671,
+ "roe": 9996,
+ "rof": 33029,
+ "rofl": 48228,
+ "roft": 45212,
+ "rog": 34269,
+ "rog": 34017,
+ "rogen": 23380,
+ "roger": 13929,
+ "roger": 7735,
+ "rogerfederer": 40182,
+ "rogers": 10661,
+ "rogue": 32575,
+ "rogue": 15162,
+ "roh": 14933,
+ "roh": 29840,
+ "rohan": 39848,
+ "rohing": 23600,
+ "rohingya": 26146,
+ "rohit": 44649,
+ "rohit": 24299,
+ "roi": 21877,
+ "rok": 36807,
+ "rol": 3393,
+ "rol": 7818,
+ "roland": 33713,
+ "roland": 19569,
+ "role": 18485,
+ "role": 3414,
+ "roles": 11871,
+ "rolex": 21093,
+ "rolf": 48606,
+ "roll": 4711,
+ "roll": 3341,
+ "rolled": 11982,
+ "roller": 21034,
+ "roller": 12342,
+ "rollercoaster": 38248,
+ "rollers": 36941,
+ "rollin": 27545,
+ "rolling": 24250,
+ "rolling": 6347,
+ "rollingstones": 41309,
+ "rollins": 27724,
+ "rollout": 47710,
+ "rollover": 39214,
+ "rolls": 8614,
+ "rolltide": 28101,
+ "rom": 11377,
+ "rom": 19205,
+ "roma": 44134,
+ "roma": 11631,
+ "romain": 48897,
+ "roman": 4416,
+ "roman": 7370,
+ "romance": 7215,
+ "romania": 15884,
+ "romanian": 30866,
+ "romano": 38409,
+ "romans": 23066,
+ "romantic": 41457,
+ "romantic": 8821,
+ "rome": 9406,
+ "rome": 5243,
+ "romeo": 14429,
+ "romero": 23694,
+ "romney": 19287,
+ "romo": 32248,
+ "romper": 43699,
+ "ron": 2393,
+ "ron": 3372,
+ "rona": 42385,
+ "ronal": 46194,
+ "ronald": 15683,
+ "ronaldo": 13463,
+ "ronan": 34971,
+ "rond": 31935,
+ "ronda": 37436,
+ "rondo": 43756,
+ "rone": 48082,
+ "rone": 32763,
+ "roni": 47234,
+ "ronnie": 45257,
+ "ronnie": 16421,
+ "rons": 19536,
+ "ront": 48881,
+ "roo": 1249,
+ "roo": 31227,
+ "rood": 38007,
+ "roof": 9120,
+ "roof": 6449,
+ "roofing": 24415,
+ "roofs": 34635,
+ "rooftop": 16319,
+ "rook": 35918,
+ "rookie": 9771,
+ "rookies": 31917,
+ "room": 8845,
+ "room": 1530,
+ "roomie": 36851,
+ "roommate": 19825,
+ "roommates": 37323,
+ "rooms": 6328,
+ "rooney": 17712,
+ "roos": 32938,
+ "roosevel": 17644,
+ "roosevelt": 18488,
+ "rooster": 46263,
+ "rooster": 30926,
+ "roosters": 43693,
+ "root": 25930,
+ "root": 9728,
+ "rooted": 30428,
+ "rooting": 25523,
+ "roots": 8084,
+ "rop": 43401,
+ "rope": 9953,
+ "ropes": 30506,
+ "ror": 8668,
+ "ror": 2843,
+ "rors": 12072,
+ "rory": 42804,
+ "rory": 17813,
+ "ros": 5288,
+ "ros": 6930,
+ "rosa": 14393,
+ "rosal": 30397,
+ "rosario": 33640,
+ "rosary": 33098,
+ "rosberg": 46037,
+ "rose": 6146,
+ "rose": 3568,
+ "roseanne": 47528,
+ "rosel": 33616,
+ "rosemary": 19472,
+ "rosen": 13214,
+ "rosen": 36424,
+ "rosenberg": 43558,
+ "rosenthal": 46990,
+ "roses": 9061,
+ "rosetta": 43800,
+ "rosewood": 38686,
+ "rosie": 43049,
+ "rosie": 16888,
+ "ross": 8801,
+ "ross": 2158,
+ "rosse": 11602,
+ "rossi": 24817,
+ "rosso": 33023,
+ "roster": 12487,
+ "roswell": 45116,
+ "rosy": 46705,
+ "rosé": 28006,
+ "rot": 10055,
+ "rot": 9643,
+ "rotar": 45959,
+ "rotary": 14654,
+ "rotating": 32265,
+ "rotation": 18089,
+ "rotc": 32252,
+ "roth": 17741,
+ "roth": 19139,
+ "rother": 23174,
+ "rotherham": 37687,
+ "rothschild": 45089,
+ "roti": 46940,
+ "roto": 34698,
+ "rotor": 42991,
+ "rots": 16642,
+ "rott": 34806,
+ "rotten": 24324,
+ "rotter": 22614,
+ "rotterdam": 23422,
+ "rotun": 42970,
+ "rou": 2964,
+ "rou": 34783,
+ "roud": 28375,
+ "rouge": 16209,
+ "rough": 11699,
+ "rough": 8511,
+ "roughly": 21910,
+ "roughs": 37598,
+ "rouhani": 39912,
+ "roulette": 39930,
+ "roun": 5602,
+ "round": 9403,
+ "round": 2522,
+ "roundabout": 29953,
+ "rounded": 26973,
+ "rounder": 37024,
+ "rounding": 40208,
+ "rounds": 11242,
+ "roundtable": 19386,
+ "roundup": 17503,
+ "roup": 29220,
+ "rourke": 38753,
+ "rous": 33645,
+ "rous": 34531,
+ "rousey": 46267,
+ "rout": 7502,
+ "rout": 41778,
+ "route": 5261,
+ "router": 29962,
+ "routes": 14923,
+ "routine": 12319,
+ "routines": 44074,
+ "routing": 44086,
+ "roux": 43416,
+ "rov": 23971,
+ "rove": 30130,
+ "rover": 12776,
+ "rovers": 16373,
+ "row": 5275,
+ "row": 1044,
+ "rowan": 26240,
+ "rowdy": 32141,
+ "rowe": 28323,
+ "rowed": 22615,
+ "rower": 43345,
+ "rowers": 41806,
+ "rowing": 12807,
+ "rowland": 33037,
+ "rowley": 48793,
+ "rowling": 29371,
+ "rown": 22287,
+ "rown": 25060,
+ "rows": 9409,
+ "rox": 14111,
+ "rox": 41033,
+ "roxy": 28093,
+ "roy": 2128,
+ "roy": 6354,
+ "royal": 6691,
+ "royal": 3853,
+ "royale": 20630,
+ "royalnavy": 41545,
+ "royals": 13335,
+ "royalties": 48660,
+ "royalty": 18296,
+ "royalwedding": 27461,
+ "royce": 18444,
+ "royd": 41476,
+ "royo": 39357,
+ "roz": 28989,
+ "roz": 37250,
+ "rp": 17305,
+ "rp": 8174,
+ "rpa": 41872,
+ "rpg": 12445,
+ "rpm": 23715,
+ "rps": 49215,
+ "rr": 5311,
+ "rr": 9126,
+ "rrp": 36967,
+ "rrr": 18267,
+ "rrrr": 25561,
+ "rrrr": 34444,
+ "rs": 6978,
+ "rs": 1724,
+ "rsa": 29437,
+ "rsc": 48524,
+ "rsd": 34426,
+ "rsi": 39046,
+ "rsl": 44752,
+ "rsp": 16381,
+ "rspb": 38508,
+ "rspb": 36727,
+ "rspca": 45643,
+ "rss": 46466,
+ "rss": 22350,
+ "rstats": 38700,
+ "rsvp": 9774,
+ "rt": 8959,
+ "rt": 8991,
+ "rtc": 31648,
+ "rte": 33822,
+ "rte": 23322,
+ "rtg": 22028,
+ "rti": 47549,
+ "rtr": 43999,
+ "rts": 8496,
+ "rtw": 34673,
+ "ru": 681,
+ "ru": 13735,
+ "rub": 15862,
+ "rub": 22586,
+ "rubb": 19597,
+ "rubbed": 45239,
+ "rubber": 31131,
+ "rubber": 11331,
+ "rubbing": 41262,
+ "rubbish": 21108,
+ "rubble": 42230,
+ "ruben": 44058,
+ "ruben": 29722,
+ "rubi": 27856,
+ "rubin": 34128,
+ "rubio": 24244,
+ "rubs": 43422,
+ "ruby": 24552,
+ "ruby": 11493,
+ "ruck": 27449,
+ "rucker": 45402,
+ "rud": 35256,
+ "rudd": 31836,
+ "rude": 16548,
+ "rudi": 48360,
+ "rudol": 40927,
+ "rudolf": 46835,
+ "rudolph": 30119,
+ "rudy": 38226,
+ "rudy": 22131,
+ "rue": 38024,
+ "rue": 19276,
+ "rufc": 45084,
+ "ruff": 28177,
+ "ruff": 30304,
+ "rufus": 39322,
+ "rug": 4217,
+ "rug": 19220,
+ "rugby": 15091,
+ "rugby": 4964,
+ "rugbyleague": 44419,
+ "ruger": 48655,
+ "rugged": 25225,
+ "rugs": 29946,
+ "rui": 46974,
+ "ruin": 16256,
+ "ruined": 17231,
+ "ruining": 29952,
+ "ruins": 16094,
+ "ruiz": 27873,
+ "ruk": 46628,
+ "rukh": 43075,
+ "rukh": 27631,
+ "rule": 31643,
+ "rule": 6175,
+ "ruled": 16324,
+ "ruler": 26286,
+ "rulers": 45328,
+ "rules": 5272,
+ "ruling": 14690,
+ "rum": 9223,
+ "rum": 11233,
+ "rumb": 42432,
+ "rumble": 18900,
+ "rumi": 31428,
+ "rumor": 22254,
+ "rumored": 36694,
+ "rumors": 16160,
+ "rumour": 34296,
+ "rumours": 20716,
+ "rump": 29366,
+ "run": 1639,
+ "run": 1934,
+ "runaway": 28851,
+ "runchat": 25838,
+ "rundown": 41100,
+ "rune": 33882,
+ "rune": 49244,
+ "runner": 37370,
+ "runner": 7913,
+ "runners": 10571,
+ "runnin": 43130,
+ "running": 24451,
+ "running": 2761,
+ "runoff": 38564,
+ "runs": 5586,
+ "runway": 13927,
+ "rup": 7996,
+ "rup": 14980,
+ "rupaul": 44211,
+ "rupee": 43916,
+ "rupees": 44110,
+ "rupert": 25625,
+ "rupt": 23055,
+ "ruption": 35403,
+ "rural": 28801,
+ "rural": 8737,
+ "rus": 35811,
+ "rus": 5998,
+ "rush": 12148,
+ "rush": 6973,
+ "rushed": 28104,
+ "rusher": 48745,
+ "rushes": 47217,
+ "rushing": 20284,
+ "russ": 6285,
+ "russ": 20764,
+ "russell": 26122,
+ "russell": 8150,
+ "russi": 2600,
+ "russia": 4018,
+ "russian": 30731,
+ "russian": 4868,
+ "russians": 25413,
+ "russo": 30679,
+ "rust": 28682,
+ "rust": 14212,
+ "rustic": 19822,
+ "rusty": 43966,
+ "rusty": 22646,
+ "rut": 14973,
+ "rut": 39102,
+ "rutger": 49029,
+ "rutgers": 28934,
+ "ruth": 15798,
+ "ruth": 12029,
+ "ruther": 26676,
+ "rutherford": 31070,
+ "ruthless": 36063,
+ "rutland": 46024,
+ "ruto": 43702,
+ "ruz": 23275,
+ "rv": 17135,
+ "rv": 17951,
+ "rva": 24278,
+ "rw": 9085,
+ "rw": 22926,
+ "rwa": 47452,
+ "rwand": 31758,
+ "rwanda": 15427,
+ "rwby": 39698,
+ "rwc": 32321,
+ "rx": 41188,
+ "rx": 15945,
+ "ry": 1511,
+ "ry": 913,
+ "ryan": 8682,
+ "ryan": 4053,
+ "ryanair": 43526,
+ "ryder": 43564,
+ "ryder": 21805,
+ "rye": 24015,
+ "rye": 17409,
+ "rying": 7838,
+ "ryn": 37728,
+ "ryo": 24460,
+ "rys": 21654,
+ "ryu": 46656,
+ "ryu": 34604,
+ "ré": 29106,
+ "s": 82,
+ "s": 338,
+ "sa": 774,
+ "sa": 1344,
+ "saa": 13429,
+ "saab": 27158,
+ "saad": 36530,
+ "saas": 25761,
+ "saat": 33151,
+ "sab": 3233,
+ "sab": 23213,
+ "saba": 38344,
+ "sabah": 32854,
+ "saban": 41620,
+ "sabar": 47102,
+ "sabbath": 26008,
+ "sabc": 30010,
+ "sabcnews": 41093,
+ "saber": 46822,
+ "saber": 25624,
+ "sabha": 23431,
+ "sabi": 47073,
+ "sabine": 44062,
+ "sable": 19224,
+ "sabot": 30700,
+ "sabotage": 40496,
+ "sabre": 35110,
+ "sabres": 29620,
+ "sabrin": 37029,
+ "sabrina": 24994,
+ "sac": 3632,
+ "sac": 12905,
+ "sach": 30168,
+ "sacha": 49010,
+ "sachin": 47527,
+ "sachin": 30297,
+ "sachs": 31451,
+ "sack": 28964,
+ "sack": 14979,
+ "sacked": 27519,
+ "sacks": 26441,
+ "sacram": 13334,
+ "sacramento": 16065,
+ "sacred": 40612,
+ "sacred": 12477,
+ "sacri": 15283,
+ "sacrif": 12117,
+ "sacrific": 16919,
+ "sacrifice": 12556,
+ "sacrificed": 31116,
+ "sacrifices": 28858,
+ "sacrificing": 48146,
+ "sad": 2810,
+ "sad": 3719,
+ "saddened": 27720,
+ "saddest": 34925,
+ "saddle": 30469,
+ "saddle": 20283,
+ "sade": 27429,
+ "sadh": 40955,
+ "sadi": 22207,
+ "sadie": 30333,
+ "sadiq": 44107,
+ "sadler": 45600,
+ "sadly": 11603,
+ "sadness": 20399,
+ "sae": 38633,
+ "sae": 34883,
+ "saeed": 29745,
+ "saf": 2125,
+ "saf": 25760,
+ "safar": 23443,
+ "safari": 14091,
+ "safarilive": 34816,
+ "safc": 27998,
+ "safe": 2901,
+ "safe": 2996,
+ "safeguard": 42249,
+ "safeguarding": 47451,
+ "safely": 11513,
+ "safer": 40124,
+ "safer": 15504,
+ "safest": 38973,
+ "safety": 19050,
+ "safety": 3406,
+ "safetyfirst": 43608,
+ "saffron": 27529,
+ "sag": 6609,
+ "sag": 30048,
+ "saga": 15758,
+ "sagan": 37193,
+ "sagar": 42518,
+ "sage": 25800,
+ "sage": 7509,
+ "sages": 25979,
+ "sagin": 47097,
+ "sagitt": 44685,
+ "sagu": 44708,
+ "sah": 30943,
+ "sah": 26342,
+ "saha": 36062,
+ "sahara": 24599,
+ "saharan": 44255,
+ "sahi": 24608,
+ "sahib": 34150,
+ "sai": 16048,
+ "sai": 10886,
+ "said": 40319,
+ "said": 1946,
+ "saif": 44164,
+ "saig": 36328,
+ "saigon": 41081,
+ "sail": 7528,
+ "sail": 12156,
+ "sailed": 43047,
+ "sailing": 11003,
+ "sailor": 28002,
+ "sailor": 16076,
+ "sailormoon": 40673,
+ "sailors": 25355,
+ "sails": 27526,
+ "sain": 21226,
+ "sain": 40378,
+ "sains": 24860,
+ "sainsbury": 45879,
+ "sainsburys": 36934,
+ "saint": 11274,
+ "saint": 5599,
+ "saints": 8769,
+ "saintsfc": 31102,
+ "sair": 46600,
+ "sair": 30971,
+ "saire": 28087,
+ "saison": 33256,
+ "sait": 48008,
+ "saj": 33580,
+ "sak": 11511,
+ "sak": 35900,
+ "saka": 33609,
+ "sake": 12874,
+ "sakh": 43945,
+ "saki": 40514,
+ "saku": 37550,
+ "sakura": 24162,
+ "sal": 980,
+ "sal": 6126,
+ "sala": 17300,
+ "salaam": 46773,
+ "salad": 6188,
+ "salads": 30948,
+ "salah": 22516,
+ "salam": 19007,
+ "salam": 33963,
+ "salamat": 44696,
+ "salami": 46885,
+ "salaries": 33132,
+ "salary": 16312,
+ "salazar": 45988,
+ "sale": 17786,
+ "sale": 1690,
+ "saleh": 38353,
+ "salem": 48194,
+ "salem": 16884,
+ "sales": 13347,
+ "sales": 3765,
+ "salesforce": 22680,
+ "salesman": 37633,
+ "salford": 25629,
+ "sali": 15411,
+ "salim": 42760,
+ "salinas": 41990,
+ "saline": 46918,
+ "salis": 20667,
+ "salis": 39378,
+ "salisbury": 24763,
+ "sall": 27122,
+ "sall": 20883,
+ "salle": 23738,
+ "sally": 29542,
+ "sally": 13349,
+ "salman": 13754,
+ "salman": 16219,
+ "salmankhan": 15177,
+ "salmon": 37040,
+ "salmon": 9137,
+ "salom": 38268,
+ "salon": 33916,
+ "salon": 11105,
+ "saloon": 26038,
+ "sals": 16307,
+ "salsa": 16442,
+ "salt": 12763,
+ "salt": 6611,
+ "salted": 26313,
+ "saltlife": 47809,
+ "salts": 40559,
+ "saltwater": 43616,
+ "salty": 20678,
+ "salu": 31711,
+ "salud": 46867,
+ "salut": 44998,
+ "salute": 44908,
+ "salute": 9747,
+ "salutes": 32762,
+ "salv": 8299,
+ "salvador": 20874,
+ "salvage": 33131,
+ "salvation": 19534,
+ "salvatore": 38772,
+ "salz": 33594,
+ "salzburg": 43396,
+ "sam": 1644,
+ "sam": 3730,
+ "sama": 19272,
+ "samanth": 11465,
+ "samantha": 15466,
+ "samanthap": 38266,
+ "samanthaprabhu": 38643,
+ "samar": 21820,
+ "samaritan": 45495,
+ "samba": 37190,
+ "same": 23062,
+ "same": 2208,
+ "samheughan": 36255,
+ "sami": 48400,
+ "sami": 24322,
+ "sammy": 31091,
+ "sammy": 16758,
+ "samo": 30006,
+ "samoa": 34932,
+ "samp": 31225,
+ "sample": 9542,
+ "sampler": 40629,
+ "samples": 13387,
+ "sampling": 19522,
+ "sampson": 39983,
+ "sams": 44667,
+ "samson": 34659,
+ "samsun": 47875,
+ "samsung": 35369,
+ "samsung": 8115,
+ "samu": 7646,
+ "samuel": 30612,
+ "samuel": 12787,
+ "samurai": 21739,
+ "san": 1489,
+ "san": 2223,
+ "sana": 19434,
+ "sanantonio": 34714,
+ "sanat": 29091,
+ "sanatomy": 36052,
+ "sanc": 7398,
+ "sance": 15930,
+ "sanchez": 13971,
+ "sanctioned": 43032,
+ "sanctions": 17790,
+ "sanctu": 12712,
+ "sanctuary": 14044,
+ "sand": 2147,
+ "sand": 5094,
+ "sandal": 36445,
+ "sandal": 42185,
+ "sandals": 20731,
+ "sandalwood": 47502,
+ "sandeep": 46973,
+ "sander": 34111,
+ "sanders": 10429,
+ "sanderson": 36198,
+ "sandi": 44249,
+ "sandiego": 45997,
+ "sandiego": 15793,
+ "sandman": 45730,
+ "sando": 35921,
+ "sandoval": 44157,
+ "sandra": 33733,
+ "sandra": 13415,
+ "sandro": 42389,
+ "sands": 5936,
+ "sandstone": 36796,
+ "sandwich": 17050,
+ "sandwich": 8687,
+ "sandwiches": 19667,
+ "sandy": 29679,
+ "sandy": 10355,
+ "sane": 23419,
+ "sanford": 32330,
+ "sanfrancisco": 20254,
+ "sang": 13235,
+ "sang": 11684,
+ "sange": 12466,
+ "sangria": 42665,
+ "sani": 39137,
+ "sani": 34492,
+ "sanitary": 33842,
+ "sanitation": 25414,
+ "saniti": 43987,
+ "sanity": 30517,
+ "sanjay": 31712,
+ "sanjay": 25796,
+ "sanje": 40405,
+ "sanjose": 45971,
+ "sank": 43692,
+ "sano": 34053,
+ "sans": 16982,
+ "sansk": 39689,
+ "sanskrit": 48083,
+ "sant": 8356,
+ "sant": 23120,
+ "santa": 22175,
+ "santa": 4555,
+ "santac": 28876,
+ "santam": 45627,
+ "santana": 27033,
+ "santander": 46476,
+ "santi": 13856,
+ "santiago": 16568,
+ "santo": 29631,
+ "santo": 18400,
+ "santor": 28448,
+ "santorini": 39573,
+ "santos": 16582,
+ "sany": 47679,
+ "sao": 28026,
+ "sap": 8089,
+ "sap": 11591,
+ "sapi": 40016,
+ "sapp": 13427,
+ "sapp": 40729,
+ "sapphire": 22044,
+ "sar": 1808,
+ "sar": 9424,
+ "sara": 37196,
+ "sara": 10063,
+ "sarab": 40716,
+ "sarac": 35722,
+ "sarah": 9086,
+ "sarah": 5327,
+ "saraj": 42592,
+ "sarajevo": 48211,
+ "saras": 20373,
+ "sarasota": 31990,
+ "sarato": 24845,
+ "saratoga": 29496,
+ "sarawak": 47331,
+ "sarcasm": 37246,
+ "sarcastic": 48639,
+ "sardar": 41786,
+ "sarde": 43925,
+ "sardin": 27383,
+ "sardinia": 41025,
+ "sare": 13051,
+ "saree": 30860,
+ "sargent": 34864,
+ "sari": 42327,
+ "sari": 20261,
+ "saries": 47586,
+ "sarkar": 30673,
+ "sarko": 33658,
+ "sarkodie": 42848,
+ "sarmy": 20954,
+ "sart": 33006,
+ "sary": 15398,
+ "sas": 3960,
+ "sas": 5235,
+ "sash": 35656,
+ "sasha": 46078,
+ "sasha": 20894,
+ "sasia": 44751,
+ "sask": 47091,
+ "sask": 30416,
+ "saskat": 17102,
+ "saskatchewan": 23899,
+ "saskatoon": 31128,
+ "sass": 31351,
+ "sassy": 20827,
+ "sat": 1382,
+ "sat": 3279,
+ "sata": 41520,
+ "satan": 19446,
+ "satanic": 38224,
+ "satchel": 45908,
+ "sate": 35749,
+ "satell": 9031,
+ "satellite": 10316,
+ "satellites": 28483,
+ "sath": 29675,
+ "sathletics": 30154,
+ "sati": 7038,
+ "satin": 21803,
+ "sation": 23674,
+ "sations": 31232,
+ "satire": 29875,
+ "satis": 9906,
+ "satisf": 22941,
+ "satisfaction": 19925,
+ "satisfied": 18101,
+ "satisfy": 29444,
+ "satisfying": 23755,
+ "sato": 34376,
+ "satu": 45283,
+ "satur": 1634,
+ "saturated": 32466,
+ "saturday": 12537,
+ "saturday": 1748,
+ "saturdaymorning": 29053,
+ "saturdaymotivation": 40843,
+ "saturdays": 18930,
+ "saturn": 17312,
+ "saty": 39426,
+ "sau": 2096,
+ "sau": 19455,
+ "sauce": 5520,
+ "saucer": 42272,
+ "sauces": 40367,
+ "saucy": 46684,
+ "saudi": 24511,
+ "saudi": 8548,
+ "saudiarabia": 28680,
+ "sauer": 46333,
+ "saul": 47623,
+ "saul": 23252,
+ "sault": 40361,
+ "sauna": 35460,
+ "saunders": 23794,
+ "saur": 13227,
+ "saura": 46532,
+ "saurus": 22118,
+ "saus": 36121,
+ "sausage": 11855,
+ "sausages": 31593,
+ "sauté": 36290,
+ "sautéed": 38517,
+ "sauvi": 30116,
+ "sauvignon": 32745,
+ "sav": 2248,
+ "sav": 26533,
+ "sava": 40198,
+ "savag": 43039,
+ "savage": 11859,
+ "savannah": 18662,
+ "save": 5895,
+ "save": 2673,
+ "saved": 7137,
+ "saveour": 33390,
+ "saver": 20987,
+ "savers": 31416,
+ "saves": 12907,
+ "savethe": 18031,
+ "savi": 14721,
+ "saving": 28498,
+ "saving": 6979,
+ "savings": 10651,
+ "savior": 24762,
+ "saviour": 35800,
+ "savor": 48071,
+ "savory": 32992,
+ "savoury": 49071,
+ "savoy": 39552,
+ "savvy": 29278,
+ "saw": 12429,
+ "saw": 2425,
+ "sawa": 39613,
+ "sawards": 29012,
+ "sawyer": 27726,
+ "sax": 14169,
+ "sax": 23766,
+ "saxon": 31856,
+ "saxophon": 43760,
+ "saxophone": 32296,
+ "say": 3047,
+ "say": 1451,
+ "saya": 35170,
+ "sayang": 46322,
+ "sayers": 44116,
+ "sayin": 23662,
+ "saying": 4455,
+ "says": 1563,
+ "saz": 35577,
+ "sb": 5576,
+ "sb": 4977,
+ "sba": 44970,
+ "sback": 43840,
+ "sband": 27539,
+ "sbaseball": 46491,
+ "sbball": 39190,
+ "sbc": 31404,
+ "sberg": 20358,
+ "sbi": 41369,
+ "sbk": 39211,
+ "sboro": 18909,
+ "sbridge": 49228,
+ "sbs": 18883,
+ "sbu": 48075,
+ "sbu": 46281,
+ "sburg": 7390,
+ "sburgh": 48205,
+ "sbury": 14081,
+ "sby": 26519,
+ "sby": 10287,
+ "sc": 663,
+ "sc": 3219,
+ "sca": 11001,
+ "scab": 31716,
+ "scaf": 28981,
+ "scafe": 45574,
+ "scaffolding": 41687,
+ "scal": 10859,
+ "scala": 37997,
+ "scalable": 44084,
+ "scale": 37817,
+ "scale": 5879,
+ "scaled": 41923,
+ "scales": 22891,
+ "scaling": 29116,
+ "scallo": 19936,
+ "scallop": 39544,
+ "scallops": 31430,
+ "scalp": 38898,
+ "scam": 17620,
+ "scam": 13215,
+ "scamp": 28451,
+ "scams": 34395,
+ "scan": 10650,
+ "scan": 11261,
+ "scanada": 27121,
+ "scand": 8110,
+ "scandal": 35420,
+ "scandal": 11622,
+ "scandals": 45490,
+ "scandin": 32014,
+ "scandinavian": 35661,
+ "scanned": 43719,
+ "scanner": 24185,
+ "scanning": 24092,
+ "scans": 31251,
+ "scap": 35883,
+ "scape": 36005,
+ "scape": 12314,
+ "scapes": 31933,
+ "scar": 4171,
+ "scar": 18088,
+ "scarborough": 24254,
+ "scarce": 38572,
+ "scarcity": 45812,
+ "scare": 33536,
+ "scare": 15920,
+ "scarec": 38814,
+ "scarecrow": 46504,
+ "scared": 9870,
+ "scares": 34096,
+ "scarf": 13365,
+ "scari": 27050,
+ "scariest": 37213,
+ "scarlet": 20389,
+ "scarlett": 28325,
+ "scars": 20747,
+ "scarves": 29249,
+ "scary": 9250,
+ "scat": 13899,
+ "scattered": 22090,
+ "scavenger": 36778,
+ "scc": 19458,
+ "scd": 48422,
+ "scen": 2204,
+ "scenario": 20456,
+ "scenarios": 31346,
+ "scence": 33418,
+ "scene": 3562,
+ "scenery": 16025,
+ "scenes": 5415,
+ "scenic": 15394,
+ "scent": 36277,
+ "scent": 7683,
+ "scented": 27190,
+ "scenter": 23059,
+ "scentre": 39371,
+ "scents": 26336,
+ "scep": 24439,
+ "scfc": 38578,
+ "sch": 844,
+ "sch": 7542,
+ "scha": 42809,
+ "schaf": 45588,
+ "schaft": 41010,
+ "schal": 35568,
+ "schalke": 41029,
+ "schallenge": 43665,
+ "schan": 31328,
+ "schar": 15085,
+ "schat": 31842,
+ "schau": 35830,
+ "sche": 3038,
+ "sche": 7289,
+ "schedu": 4207,
+ "schedule": 5521,
+ "scheduled": 10986,
+ "schedules": 28986,
+ "scheduling": 32216,
+ "scheer": 26776,
+ "schel": 39881,
+ "schel": 38569,
+ "schem": 17720,
+ "scheme": 9024,
+ "schemes": 22958,
+ "schen": 22738,
+ "scher": 21925,
+ "scher": 21299,
+ "schi": 13731,
+ "schi": 24984,
+ "schicago": 46230,
+ "schiff": 39431,
+ "schild": 32148,
+ "schiz": 33230,
+ "schizoph": 40004,
+ "schizophre": 41163,
+ "schle": 32022,
+ "schmid": 17375,
+ "schmidt": 18463,
+ "schnau": 45745,
+ "schnei": 19941,
+ "schneider": 22972,
+ "schnit": 40903,
+ "scho": 2493,
+ "schoice": 23860,
+ "schol": 4498,
+ "scholar": 7192,
+ "scholar": 12830,
+ "scholarly": 41065,
+ "scholars": 13818,
+ "scholarship": 9070,
+ "scholarships": 17866,
+ "scholastic": 35743,
+ "schoo": 20721,
+ "school": 6063,
+ "school": 1228,
+ "schooled": 44722,
+ "schoolers": 31455,
+ "schooling": 28608,
+ "schools": 3513,
+ "schre": 47685,
+ "schri": 25453,
+ "schro": 32381,
+ "schu": 11318,
+ "schubert": 46939,
+ "schul": 14945,
+ "schultz": 30308,
+ "schulz": 39572,
+ "schumacher": 39208,
+ "schumer": 25313,
+ "schur": 42475,
+ "schwab": 47602,
+ "schwar": 13985,
+ "schwartz": 30617,
+ "schwarz": 27074,
+ "schwarzenegger": 33860,
+ "schwe": 25324,
+ "sci": 2267,
+ "sci": 8309,
+ "sciart": 31704,
+ "scicom": 28606,
+ "scicomm": 29573,
+ "scien": 39261,
+ "science": 10201,
+ "science": 2497,
+ "sciencefiction": 39170,
+ "sciences": 11481,
+ "scienti": 4338,
+ "scientific": 9750,
+ "scientist": 11083,
+ "scientists": 8045,
+ "sciento": 36193,
+ "scientology": 44694,
+ "scifi": 41862,
+ "scifi": 12230,
+ "scion": 47208,
+ "sciss": 25667,
+ "scissors": 30867,
+ "sciutto": 44392,
+ "sclerosis": 39446,
+ "sclub": 20017,
+ "sco": 1065,
+ "sco": 4763,
+ "scoe": 31164,
+ "scol": 13599,
+ "scoll": 44895,
+ "scollege": 39536,
+ "scom": 26407,
+ "scon": 17163,
+ "scon": 29272,
+ "scones": 36443,
+ "sconf": 39704,
+ "scoo": 14199,
+ "scooby": 34469,
+ "scoop": 13829,
+ "scoops": 41360,
+ "scope": 7979,
+ "scopes": 30328,
+ "scopic": 23869,
+ "scopy": 20018,
+ "scor": 8442,
+ "score": 12067,
+ "score": 4431,
+ "scoreboard": 30104,
+ "scorecard": 38128,
+ "scored": 6143,
+ "scoreless": 33469,
+ "scorer": 16572,
+ "scorers": 26699,
+ "scores": 7039,
+ "scoring": 9198,
+ "scorpi": 15445,
+ "scorpio": 34331,
+ "scorpion": 28461,
+ "scorpions": 45401,
+ "scorsese": 45975,
+ "scot": 2496,
+ "scot": 9271,
+ "scotch": 16687,
+ "scoti": 46446,
+ "scotia": 27859,
+ "scotland": 29174,
+ "scotland": 4203,
+ "scots": 17260,
+ "scotsman": 39612,
+ "scott": 7775,
+ "scott": 3664,
+ "scotti": 6227,
+ "scottish": 18039,
+ "scottish": 7442,
+ "scottsdale": 27817,
+ "scotty": 39697,
+ "scotty": 26836,
+ "scotus": 21720,
+ "scou": 44909,
+ "scoun": 16110,
+ "scouncil": 48787,
+ "scountry": 40432,
+ "scour": 46172,
+ "scout": 32213,
+ "scout": 10786,
+ "scouting": 19072,
+ "scouts": 14837,
+ "scow": 27929,
+ "scowboys": 31386,
+ "scp": 45030,
+ "scr": 36131,
+ "scra": 11187,
+ "scrabble": 39488,
+ "scram": 17289,
+ "scramble": 32688,
+ "scrambled": 39026,
+ "scran": 41774,
+ "scranton": 45274,
+ "scrap": 27950,
+ "scrap": 21695,
+ "scrapbook": 48733,
+ "scrapped": 43325,
+ "scraps": 40809,
+ "scrat": 9572,
+ "scratch": 13258,
+ "scratched": 48831,
+ "scratches": 46556,
+ "scratching": 44617,
+ "scre": 1795,
+ "scream": 31645,
+ "scream": 13239,
+ "screamed": 35427,
+ "screaming": 12891,
+ "screams": 23989,
+ "screen": 5351,
+ "screen": 3750,
+ "screened": 31450,
+ "screening": 6688,
+ "screenings": 27655,
+ "screenplay": 30058,
+ "screens": 12689,
+ "screenshot": 20637,
+ "screenshot": 12646,
+ "screenshots": 26783,
+ "screenshotsaturday": 21406,
+ "screenwriter": 37293,
+ "screenwriting": 35465,
+ "screw": 25529,
+ "screw": 14225,
+ "screwdriver": 48748,
+ "screwed": 30592,
+ "screws": 38292,
+ "scri": 2139,
+ "scrib": 34259,
+ "scribe": 36228,
+ "scribed": 38334,
+ "scricket": 45947,
+ "scrim": 21978,
+ "scrimmage": 25216,
+ "scrip": 11955,
+ "script": 8374,
+ "scripted": 40513,
+ "scription": 26604,
+ "scriptions": 39512,
+ "scripts": 20109,
+ "scripture": 27186,
+ "scro": 30768,
+ "scroll": 24160,
+ "scrolling": 28889,
+ "scrolls": 38113,
+ "scroo": 42263,
+ "scru": 7589,
+ "scrub": 23432,
+ "scrubs": 37919,
+ "scrum": 29047,
+ "scrump": 39791,
+ "scrumptious": 40987,
+ "scrutiny": 34305,
+ "scs": 26853,
+ "sct": 39284,
+ "scu": 8181,
+ "scu": 32135,
+ "scuba": 39053,
+ "scuba": 20559,
+ "scubadiving": 49046,
+ "scue": 25955,
+ "scul": 4948,
+ "scully": 36598,
+ "sculp": 6093,
+ "sculpt": 45044,
+ "sculpted": 41296,
+ "sculpting": 44389,
+ "sculptor": 29409,
+ "sculpture": 8757,
+ "sculptures": 20378,
+ "scum": 29655,
+ "scumb": 44525,
+ "scup": 21506,
+ "scur": 32742,
+ "scwx": 41966,
+ "scy": 27471,
+ "sd": 3080,
+ "sd": 4159,
+ "sda": 25548,
+ "sdale": 12327,
+ "sday": 5902,
+ "sday": 1376,
+ "sdays": 14491,
+ "sdc": 40992,
+ "sdcc": 13246,
+ "sden": 17241,
+ "sdf": 34681,
+ "sdg": 20177,
+ "sdgs": 16261,
+ "sdk": 40015,
+ "sdlive": 34561,
+ "sdn": 41925,
+ "sdsu": 41284,
+ "se": 567,
+ "se": 611,
+ "sea": 5970,
+ "sea": 2102,
+ "seab": 15728,
+ "seabir": 42558,
+ "seac": 35626,
+ "seaf": 9336,
+ "seafood": 12472,
+ "seag": 15730,
+ "seagu": 38076,
+ "seagull": 38858,
+ "seagulls": 42215,
+ "seahawks": 15341,
+ "seal": 21381,
+ "seal": 10159,
+ "sealed": 13358,
+ "sealing": 42992,
+ "seals": 18179,
+ "seam": 13710,
+ "seam": 44201,
+ "seaman": 47513,
+ "seamless": 29373,
+ "seamus": 40175,
+ "sean": 11406,
+ "sean": 6077,
+ "seanhannity": 43316,
+ "seap": 29983,
+ "seaport": 46418,
+ "sear": 1612,
+ "search": 23129,
+ "search": 1920,
+ "searched": 28961,
+ "searches": 26378,
+ "searching": 10626,
+ "seared": 29727,
+ "sears": 26693,
+ "seas": 7329,
+ "seas": 9556,
+ "seascape": 42593,
+ "seaside": 18867,
+ "season": 19288,
+ "season": 1367,
+ "seasonal": 14215,
+ "seasoned": 28399,
+ "seasoning": 43439,
+ "seasons": 8635,
+ "seat": 19670,
+ "seat": 4922,
+ "seated": 23953,
+ "seater": 37543,
+ "seating": 16240,
+ "seats": 6944,
+ "seattle": 24388,
+ "seattle": 6274,
+ "seau": 32263,
+ "seaw": 32658,
+ "seaweed": 30204,
+ "seaworld": 27422,
+ "seb": 35766,
+ "seb": 25171,
+ "sebasti": 10324,
+ "sebastian": 43792,
+ "sebastian": 13181,
+ "sebring": 41086,
+ "sec": 2875,
+ "sec": 5338,
+ "seca": 37847,
+ "secco": 27394,
+ "sece": 46297,
+ "seclu": 42392,
+ "secon": 1846,
+ "second": 9329,
+ "second": 2241,
+ "secondary": 13107,
+ "seconds": 6541,
+ "secre": 2460,
+ "secret": 20710,
+ "secret": 4145,
+ "secretari": 29515,
+ "secretariat": 31767,
+ "secretary": 6552,
+ "secretly": 21400,
+ "secrets": 9735,
+ "secs": 28665,
+ "sect": 15772,
+ "section": 34986,
+ "section": 4853,
+ "sectional": 21876,
+ "sections": 20061,
+ "sector": 6579,
+ "sectors": 22173,
+ "secu": 4894,
+ "secular": 47483,
+ "secular": 27560,
+ "secur": 2557,
+ "secure": 44763,
+ "secure": 7515,
+ "secured": 16848,
+ "secures": 31567,
+ "securing": 24759,
+ "securities": 25080,
+ "security": 31245,
+ "security": 2741,
+ "sed": 14034,
+ "sed": 1252,
+ "sedan": 24237,
+ "sedg": 46926,
+ "sedge": 45288,
+ "sedi": 29269,
+ "sedly": 31771,
+ "sedona": 46862,
+ "seduc": 19933,
+ "seductive": 43721,
+ "see": 1751,
+ "see": 862,
+ "seed": 14064,
+ "seed": 6488,
+ "seeded": 33688,
+ "seeding": 40050,
+ "seedlings": 47933,
+ "seeds": 9128,
+ "seeing": 3214,
+ "seek": 8839,
+ "seeker": 28011,
+ "seekers": 20732,
+ "seeking": 8592,
+ "seeks": 12594,
+ "seem": 20043,
+ "seem": 7523,
+ "seemed": 17240,
+ "seemingly": 25917,
+ "seems": 4453,
+ "seen": 36273,
+ "seen": 2041,
+ "seer": 32486,
+ "sees": 7594,
+ "seeyou": 41279,
+ "sef": 27453,
+ "seg": 10551,
+ "sega": 16122,
+ "segment": 15615,
+ "segments": 43053,
+ "segreg": 49117,
+ "segregation": 39086,
+ "segu": 33156,
+ "segun": 43087,
+ "seh": 27536,
+ "seh": 41430,
+ "sehun": 17705,
+ "sei": 13130,
+ "sei": 15907,
+ "sein": 24669,
+ "seine": 41378,
+ "seinfeld": 33706,
+ "seis": 25559,
+ "seismic": 38459,
+ "seiz": 22171,
+ "seize": 26624,
+ "seized": 15826,
+ "seizure": 36804,
+ "seizures": 47199,
+ "sek": 45515,
+ "sek": 25880,
+ "sel": 1000,
+ "sel": 4098,
+ "sela": 47006,
+ "selamat": 37692,
+ "selangor": 44402,
+ "selby": 43546,
+ "selca": 38606,
+ "selcaday": 35924,
+ "seldom": 48322,
+ "sele": 29137,
+ "selec": 3014,
+ "select": 8690,
+ "selected": 6881,
+ "selecting": 32696,
+ "selection": 6724,
+ "selections": 24099,
+ "selective": 28686,
+ "selects": 32902,
+ "selen": 19970,
+ "selena": 14677,
+ "selenagomez": 27653,
+ "seley": 30556,
+ "self": 10139,
+ "self": 1322,
+ "selfcare": 39560,
+ "selfi": 3007,
+ "selfie": 26735,
+ "selfie": 3666,
+ "selfies": 46058,
+ "selfies": 10050,
+ "selfish": 26907,
+ "selfless": 34236,
+ "sell": 10279,
+ "sell": 5119,
+ "seller": 11779,
+ "sellers": 16562,
+ "selling": 4396,
+ "sells": 14306,
+ "selma": 36652,
+ "sels": 42070,
+ "selves": 4505,
+ "sely": 8402,
+ "sem": 8645,
+ "sem": 17106,
+ "sema": 31816,
+ "seman": 29119,
+ "seman": 28378,
+ "semana": 41780,
+ "semb": 36054,
+ "seme": 10855,
+ "sement": 10714,
+ "sements": 31449,
+ "semester": 11905,
+ "semi": 11023,
+ "semi": 6684,
+ "semic": 26967,
+ "semicon": 34315,
+ "semiconduc": 35646,
+ "semiconductor": 43551,
+ "semifinal": 22935,
+ "semifinals": 21863,
+ "semin": 5595,
+ "seminar": 7269,
+ "seminars": 34870,
+ "seminary": 31655,
+ "seminole": 42956,
+ "semis": 24013,
+ "semit": 22628,
+ "semite": 23721,
+ "semitic": 34894,
+ "semitism": 25911,
+ "semper": 47391,
+ "sen": 1057,
+ "sen": 2249,
+ "sena": 21584,
+ "senate": 30703,
+ "senate": 6843,
+ "senator": 20871,
+ "senator": 8495,
+ "senators": 16889,
+ "send": 27684,
+ "send": 3625,
+ "sending": 6985,
+ "sends": 10817,
+ "sene": 25269,
+ "seneca": 33419,
+ "senegal": 28255,
+ "senew": 49313,
+ "seng": 43022,
+ "seng": 29971,
+ "senior": 19865,
+ "senior": 3415,
+ "seniors": 8138,
+ "senna": 36195,
+ "senpai": 46562,
+ "sens": 5218,
+ "sens": 22837,
+ "sensation": 19383,
+ "sensational": 23051,
+ "sense": 29162,
+ "sense": 4747,
+ "sensei": 36158,
+ "senses": 21809,
+ "sensi": 38802,
+ "sensible": 30635,
+ "sensing": 29236,
+ "sensiti": 20531,
+ "sensitive": 13734,
+ "sensitivity": 27788,
+ "sensor": 15330,
+ "sensors": 20356,
+ "sensory": 21831,
+ "sensu": 28157,
+ "sensual": 40860,
+ "sent": 6200,
+ "sent": 3676,
+ "sentence": 12737,
+ "sentenced": 17773,
+ "sentences": 25858,
+ "sentencing": 34394,
+ "senti": 19042,
+ "sentim": 25102,
+ "sentiment": 25949,
+ "sentimental": 40070,
+ "sentiments": 47450,
+ "sentin": 20042,
+ "sentinel": 23123,
+ "senting": 3924,
+ "seo": 24743,
+ "seo": 8622,
+ "seok": 34697,
+ "seok": 22482,
+ "seokjin": 45584,
+ "seoul": 13253,
+ "sep": 3212,
+ "sep": 10434,
+ "separ": 6859,
+ "separate": 13886,
+ "separated": 22163,
+ "separately": 41904,
+ "separates": 45365,
+ "separati": 39377,
+ "separating": 43480,
+ "separation": 22007,
+ "sephora": 38414,
+ "sepsis": 40205,
+ "sept": 5380,
+ "septe": 3672,
+ "september": 3707,
+ "septic": 34690,
+ "sepul": 47360,
+ "seq": 44379,
+ "sequ": 5491,
+ "seque": 44662,
+ "sequel": 15701,
+ "sequence": 18833,
+ "sequences": 47306,
+ "sequencing": 33484,
+ "sequo": 32781,
+ "sequoia": 42404,
+ "ser": 803,
+ "ser": 2771,
+ "sera": 28250,
+ "serbia": 19038,
+ "serbian": 33687,
+ "sere": 35770,
+ "seren": 7880,
+ "serena": 19519,
+ "serenawilliams": 48316,
+ "serendip": 45805,
+ "serendipity": 49386,
+ "serene": 28269,
+ "serenity": 24187,
+ "serge": 13477,
+ "serge": 35700,
+ "sergeant": 22049,
+ "sergei": 39870,
+ "sergey": 35390,
+ "sergi": 47675,
+ "sergio": 18359,
+ "seri": 2763,
+ "seri": 37509,
+ "serial": 14216,
+ "serie": 19752,
+ "seriea": 32660,
+ "series": 1857,
+ "serious": 47421,
+ "serious": 4770,
+ "seriously": 4885,
+ "sermon": 24884,
+ "sero": 48883,
+ "serpent": 37084,
+ "serpent": 35364,
+ "serra": 39851,
+ "serrano": 44236,
+ "sers": 13509,
+ "serum": 25385,
+ "serv": 1297,
+ "serv": 24571,
+ "servant": 20810,
+ "servants": 29652,
+ "serve": 39202,
+ "serve": 2838,
+ "served": 4740,
+ "server": 36458,
+ "server": 8398,
+ "serverless": 49243,
+ "servers": 22262,
+ "serves": 9915,
+ "servic": 27115,
+ "service": 21496,
+ "service": 2086,
+ "serviced": 44687,
+ "services": 3100,
+ "servicing": 41300,
+ "serving": 5722,
+ "sery": 14279,
+ "ses": 23708,
+ "ses": 1386,
+ "sesame": 21706,
+ "sese": 37128,
+ "sesh": 24274,
+ "session": 2550,
+ "sessions": 6327,
+ "set": 7965,
+ "set": 1167,
+ "setback": 43605,
+ "seth": 20005,
+ "seth": 11870,
+ "sethu": 38933,
+ "setlist": 33141,
+ "seton": 43799,
+ "sets": 4650,
+ "sett": 4984,
+ "sett": 17567,
+ "sette": 14613,
+ "setter": 23153,
+ "settes": 44145,
+ "setti": 45170,
+ "setting": 5264,
+ "settings": 18628,
+ "settle": 15075,
+ "settled": 18310,
+ "settlement": 16494,
+ "settlements": 36605,
+ "settlers": 35671,
+ "settles": 41498,
+ "settling": 22036,
+ "setup": 11092,
+ "seu": 31539,
+ "seul": 48975,
+ "seum": 18838,
+ "seun": 24209,
+ "seung": 32393,
+ "seung": 33711,
+ "seungri": 41627,
+ "seuss": 34441,
+ "sev": 26585,
+ "sev": 37600,
+ "seva": 42604,
+ "seve": 21458,
+ "seve": 22468,
+ "sevel": 17439,
+ "seven": 7874,
+ "seven": 5757,
+ "sevens": 29911,
+ "sevent": 43048,
+ "seventeen": 19337,
+ "seventh": 17568,
+ "seventy": 47170,
+ "sever": 3250,
+ "sever": 45557,
+ "several": 5560,
+ "severance": 26194,
+ "severe": 6215,
+ "severely": 24417,
+ "severn": 34626,
+ "severy": 34207,
+ "sevilla": 24947,
+ "seville": 34988,
+ "sew": 28640,
+ "sewage": 32777,
+ "sewer": 28294,
+ "sewing": 15974,
+ "sewn": 42118,
+ "sex": 3548,
+ "sex": 5937,
+ "sexi": 20562,
+ "sexiest": 25426,
+ "sexism": 32059,
+ "sexist": 33047,
+ "sexu": 14741,
+ "sexual": 6749,
+ "sexuality": 21244,
+ "sexually": 23032,
+ "sexy": 21019,
+ "sexy": 38127,
+ "sey": 6317,
+ "sey": 2258,
+ "seychel": 36809,
+ "seychelles": 38519,
+ "seye": 35604,
+ "seym": 22657,
+ "seymour": 25850,
+ "seys": 15081,
+ "sez": 42377,
+ "señ": 43368,
+ "sf": 4435,
+ "sf": 4915,
+ "sfa": 32675,
+ "sfam": 37649,
+ "sfb": 27930,
+ "sfc": 14129,
+ "sfest": 49024,
+ "sff": 42056,
+ "sfgiants": 20923,
+ "sfield": 11801,
+ "sfo": 39182,
+ "sfootball": 45259,
+ "sfor": 9115,
+ "sford": 28917,
+ "sforsale": 28888,
+ "sfw": 18073,
+ "sfx": 37995,
+ "sg": 9599,
+ "sg": 7611,
+ "sga": 33049,
+ "sgate": 27558,
+ "sgh": 47590,
+ "sgo": 5393,
+ "sgo": 21044,
+ "sgt": 13748,
+ "sh": 552,
+ "sh": 849,
+ "sha": 1514,
+ "sha": 3337,
+ "shaa": 44221,
+ "shab": 8323,
+ "shabbat": 38042,
+ "shabby": 28838,
+ "shack": 23866,
+ "shack": 18785,
+ "shad": 3182,
+ "shad": 23874,
+ "shade": 34554,
+ "shade": 10097,
+ "shaded": 43506,
+ "shades": 46608,
+ "shades": 9270,
+ "shadesof": 45180,
+ "shading": 37348,
+ "shado": 9325,
+ "shadow": 15243,
+ "shadow": 7068,
+ "shadowhun": 19931,
+ "shadowhunters": 24834,
+ "shadowing": 46092,
+ "shadows": 12971,
+ "shady": 22158,
+ "shaf": 12032,
+ "shaft": 21545,
+ "shag": 22439,
+ "shaggy": 42662,
+ "shah": 13203,
+ "shah": 8439,
+ "shahe": 23643,
+ "shaheed": 30060,
+ "shaheer": 43969,
+ "shahi": 46972,
+ "shahid": 25696,
+ "shahid": 27138,
+ "shahidkapoor": 29892,
+ "shahzad": 45915,
+ "shai": 47941,
+ "shaikh": 45712,
+ "shail": 37603,
+ "shair": 43135,
+ "shak": 8385,
+ "shake": 8206,
+ "shake": 8251,
+ "shaken": 38237,
+ "shaker": 26210,
+ "shakers": 38411,
+ "shakes": 19668,
+ "shakespe": 9890,
+ "shakespeare": 22499,
+ "shakespeare": 12488,
+ "shakespearesunday": 32320,
+ "shaking": 19101,
+ "shakira": 40795,
+ "shakti": 48593,
+ "shakti": 32458,
+ "shakur": 48915,
+ "shal": 15056,
+ "shal": 28175,
+ "shale": 32864,
+ "shall": 4742,
+ "shallow": 23730,
+ "shalom": 31339,
+ "sham": 6453,
+ "sham": 9005,
+ "shaman": 48727,
+ "shambles": 40799,
+ "shame": 14776,
+ "shame": 7593,
+ "shameful": 28283,
+ "shameless": 25380,
+ "shaming": 40553,
+ "shampoo": 23944,
+ "shamrock": 34199,
+ "shan": 5171,
+ "shan": 8834,
+ "shana": 44835,
+ "shand": 29101,
+ "shane": 26863,
+ "shane": 11572,
+ "shang": 11141,
+ "shanghai": 12742,
+ "shani": 46665,
+ "shank": 24685,
+ "shankar": 24108,
+ "shann": 9932,
+ "shannon": 22842,
+ "shannon": 13581,
+ "shant": 36610,
+ "shap": 5581,
+ "shape": 26925,
+ "shape": 6448,
+ "shaped": 10127,
+ "shapes": 15377,
+ "shaping": 18632,
+ "shapiro": 32110,
+ "shaq": 46402,
+ "shaq": 26843,
+ "shar": 1669,
+ "shar": 36542,
+ "shara": 48849,
+ "sharapo": 36489,
+ "sharapova": 36671,
+ "shard": 42207,
+ "share": 7585,
+ "share": 1978,
+ "shared": 5368,
+ "shareholder": 38241,
+ "shareholders": 34778,
+ "sharepoint": 39213,
+ "shares": 4974,
+ "sharethe": 49277,
+ "shareyour": 45890,
+ "shari": 27738,
+ "shari": 47390,
+ "sharia": 37244,
+ "sharif": 15501,
+ "sharing": 3567,
+ "sharjah": 33420,
+ "shark": 15836,
+ "shark": 7980,
+ "sharks": 10047,
+ "sharkweek": 39571,
+ "sharma": 10105,
+ "sharon": 28722,
+ "sharon": 14138,
+ "sharp": 17126,
+ "sharp": 8157,
+ "sharpe": 34374,
+ "sharpen": 41465,
+ "sharpie": 46858,
+ "sharply": 37185,
+ "shasta": 46727,
+ "shat": 12169,
+ "shat": 44388,
+ "shatter": 45008,
+ "shattered": 26820,
+ "shau": 13750,
+ "shaun": 23446,
+ "shaun": 16669,
+ "shav": 11410,
+ "shave": 17735,
+ "shaved": 25571,
+ "shaving": 24261,
+ "shaw": 6122,
+ "shaw": 6805,
+ "shawa": 46413,
+ "shawl": 35132,
+ "shawn": 16677,
+ "shawn": 10970,
+ "shawnee": 48060,
+ "shawnmendes": 27277,
+ "shawty": 38026,
+ "shay": 10778,
+ "shay": 18361,
+ "shaykh": 47223,
+ "shaz": 18618,
+ "shazam": 29063,
+ "shc": 43419,
+ "shd": 37729,
+ "she": 1729,
+ "she": 1043,
+ "shea": 20407,
+ "shead": 44287,
+ "shead": 20434,
+ "shealth": 41743,
+ "shealth": 22197,
+ "shear": 27974,
+ "shear": 32108,
+ "shearer": 40505,
+ "sheath": 45637,
+ "shed": 16586,
+ "shed": 1492,
+ "shedding": 33608,
+ "sheds": 25921,
+ "shee": 23450,
+ "shee": 34321,
+ "sheed": 26105,
+ "sheehan": 41809,
+ "sheen": 25025,
+ "sheep": 23604,
+ "sheep": 9629,
+ "sheer": 17577,
+ "sheeran": 18561,
+ "sheet": 7298,
+ "sheets": 12744,
+ "shef": 8237,
+ "sheff": 38844,
+ "sheff": 43821,
+ "sheffiel": 26940,
+ "sheffield": 41763,
+ "sheffield": 10420,
+ "sheffieldissuper": 33628,
+ "sheh": 31667,
+ "sheikh": 15031,
+ "sheil": 42765,
+ "sheila": 25734,
+ "shek": 33285,
+ "shel": 3159,
+ "shelby": 36906,
+ "shelby": 16885,
+ "sheldon": 25079,
+ "shelf": 10955,
+ "shell": 23374,
+ "shell": 6648,
+ "shelley": 22497,
+ "shelling": 43166,
+ "shells": 19265,
+ "shelly": 37461,
+ "shelter": 8599,
+ "sheltered": 48070,
+ "shelters": 24312,
+ "shelton": 24471,
+ "shelves": 16225,
+ "shem": 40299,
+ "shen": 10154,
+ "shen": 31098,
+ "shenan": 20965,
+ "shenando": 44666,
+ "shenanigans": 26590,
+ "shenko": 39751,
+ "shenmue": 48279,
+ "shenzhen": 38970,
+ "shep": 33757,
+ "shep": 44857,
+ "shepard": 26810,
+ "shepher": 11008,
+ "shepherd": 13242,
+ "shepherds": 42792,
+ "sheppard": 37304,
+ "sher": 3570,
+ "sher": 4510,
+ "sheraton": 39400,
+ "shere": 21507,
+ "sheri": 9235,
+ "sheridan": 27085,
+ "sheriff": 10309,
+ "sherlock": 17294,
+ "sherman": 17822,
+ "sherry": 44348,
+ "sherry": 24689,
+ "shers": 14141,
+ "sherwood": 24527,
+ "sheryl": 39773,
+ "shes": 45514,
+ "shes": 2502,
+ "shet": 15850,
+ "shetland": 29595,
+ "shetty": 25533,
+ "shev": 45182,
+ "sheva": 45132,
+ "shh": 35025,
+ "shhh": 36932,
+ "shi": 823,
+ "shi": 3533,
+ "shia": 23791,
+ "shibu": 36177,
+ "shibuya": 41623,
+ "shie": 26638,
+ "shiel": 33413,
+ "shield": 8670,
+ "shields": 19085,
+ "shies": 35312,
+ "shif": 35317,
+ "shift": 43767,
+ "shift": 6905,
+ "shifted": 34429,
+ "shifter": 48944,
+ "shifting": 21992,
+ "shifts": 23957,
+ "shik": 36980,
+ "shil": 14370,
+ "shill": 32121,
+ "shill": 30090,
+ "shilpa": 47062,
+ "shilpa": 40690,
+ "shim": 11986,
+ "shim": 32780,
+ "shima": 14382,
+ "shimano": 48904,
+ "shimi": 40517,
+ "shimmer": 38792,
+ "shin": 5664,
+ "shin": 11784,
+ "shinde": 41516,
+ "shine": 17582,
+ "shine": 3780,
+ "shinee": 19660,
+ "shines": 16015,
+ "shing": 38641,
+ "shing": 1743,
+ "shining": 10485,
+ "shino": 43074,
+ "shiny": 12190,
+ "ship": 7645,
+ "ship": 1158,
+ "shipment": 28553,
+ "shipp": 34709,
+ "shipped": 15279,
+ "shippers": 44789,
+ "shipping": 5721,
+ "ships": 3262,
+ "shipwreck": 48878,
+ "shipy": 26828,
+ "shipyard": 31273,
+ "shir": 1956,
+ "shiraz": 35618,
+ "shire": 11975,
+ "shire": 2968,
+ "shirehour": 32456,
+ "shirley": 18189,
+ "shiro": 26048,
+ "shirt": 27576,
+ "shirt": 2523,
+ "shirtless": 28959,
+ "shirts": 5803,
+ "shistory": 34979,
+ "shiv": 18042,
+ "shiv": 37121,
+ "shiva": 33881,
+ "shiva": 21174,
+ "shka": 38944,
+ "shld": 49359,
+ "shma": 48074,
+ "shment": 8802,
+ "shments": 18822,
+ "sho": 719,
+ "sho": 13756,
+ "shock": 19617,
+ "shock": 8736,
+ "shocked": 15787,
+ "shocker": 37971,
+ "shockey": 22258,
+ "shocking": 13394,
+ "shocks": 31886,
+ "shoe": 16308,
+ "shoe": 7342,
+ "shoes": 49391,
+ "shoes": 4079,
+ "shol": 21472,
+ "sholm": 44139,
+ "shome": 42701,
+ "shon": 19526,
+ "shon": 37621,
+ "shone": 47173,
+ "shoo": 1975,
+ "shook": 20730,
+ "shoops": 29956,
+ "shoot": 12531,
+ "shoot": 3704,
+ "shooter": 13645,
+ "shooters": 31902,
+ "shooting": 3992,
+ "shootings": 26753,
+ "shootout": 20666,
+ "shoots": 14144,
+ "shop": 5738,
+ "shop": 1557,
+ "shopify": 47949,
+ "shoplocal": 21775,
+ "shopp": 38486,
+ "shoppe": 38236,
+ "shopped": 28088,
+ "shopper": 24346,
+ "shoppers": 22316,
+ "shopping": 42101,
+ "shopping": 4266,
+ "shops": 6467,
+ "shopsmall": 35942,
+ "shor": 3209,
+ "shore": 14717,
+ "shore": 5928,
+ "shored": 33140,
+ "shoreditch": 35042,
+ "shoreline": 34807,
+ "shores": 18102,
+ "short": 6803,
+ "short": 3005,
+ "shortage": 19910,
+ "shortages": 38730,
+ "shortcuts": 45793,
+ "shorten": 41711,
+ "shorter": 20350,
+ "shortest": 33717,
+ "shortfilm": 37204,
+ "shorth": 37397,
+ "shortlist": 28163,
+ "shortlisted": 20631,
+ "shortly": 11967,
+ "shorts": 9680,
+ "shorty": 33502,
+ "shot": 9805,
+ "shot": 2000,
+ "shotel": 42365,
+ "shotgun": 21643,
+ "shots": 5342,
+ "shou": 3890,
+ "shoul": 29847,
+ "should": 14947,
+ "should": 1535,
+ "shoulder": 8476,
+ "shoulders": 18738,
+ "shouldn": 9416,
+ "shour": 20025,
+ "shouse": 28671,
+ "shout": 7335,
+ "shout": 5214,
+ "shouted": 44397,
+ "shouting": 26464,
+ "shoutout": 8274,
+ "shouts": 26709,
+ "shovel": 31778,
+ "show": 2133,
+ "show": 1080,
+ "showbiz": 34156,
+ "showcas": 14290,
+ "showcase": 7265,
+ "showcased": 35786,
+ "showcases": 26266,
+ "showcasing": 17036,
+ "showdown": 15576,
+ "showed": 7150,
+ "shower": 7777,
+ "showers": 9893,
+ "showing": 3649,
+ "shown": 8506,
+ "showroom": 16821,
+ "shows": 2665,
+ "showtime": 40576,
+ "showtime": 15442,
+ "showyour": 46733,
+ "shp": 38341,
+ "shq": 21145,
+ "shr": 10118,
+ "shra": 21360,
+ "shradd": 28172,
+ "shraddha": 35208,
+ "shraddhakapoor": 40385,
+ "shre": 12101,
+ "shred": 19756,
+ "shred": 33017,
+ "shredded": 31772,
+ "shredding": 45534,
+ "shree": 37410,
+ "shrek": 35009,
+ "shrews": 26411,
+ "shrewsbury": 30921,
+ "shri": 8838,
+ "shri": 11424,
+ "shrimp": 12727,
+ "shrin": 24865,
+ "shrine": 16156,
+ "shrink": 34957,
+ "shrinking": 41243,
+ "shrm": 44163,
+ "shro": 15259,
+ "shroff": 32081,
+ "shrop": 22630,
+ "shropshire": 26344,
+ "shru": 14911,
+ "shrub": 41464,
+ "shrubs": 47975,
+ "shrun": 46767,
+ "shs": 16184,
+ "sht": 44210,
+ "shti": 38927,
+ "shu": 2872,
+ "shu": 17651,
+ "shua": 33771,
+ "shub": 40552,
+ "shud": 45782,
+ "shuff": 42641,
+ "shuffle": 21681,
+ "shui": 45473,
+ "shuk": 29927,
+ "shukla": 46829,
+ "shul": 30721,
+ "shum": 37383,
+ "shun": 24479,
+ "shun": 39594,
+ "shur": 41032,
+ "shut": 8702,
+ "shut": 8282,
+ "shutdown": 16051,
+ "shutout": 24385,
+ "shuts": 28313,
+ "shutt": 31866,
+ "shutter": 36235,
+ "shutter": 33902,
+ "shutters": 46894,
+ "shutting": 31383,
+ "shuttle": 15842,
+ "shwar": 41640,
+ "shy": 22678,
+ "shy": 9682,
+ "si": 564,
+ "si": 2990,
+ "sia": 2357,
+ "siam": 29686,
+ "siam": 48248,
+ "siamese": 43161,
+ "sian": 28510,
+ "sian": 6221,
+ "sians": 26583,
+ "sias": 28645,
+ "siber": 22206,
+ "siberia": 39969,
+ "siberian": 34058,
+ "sibl": 14338,
+ "sible": 14507,
+ "sibling": 43060,
+ "sibling": 23779,
+ "siblings": 17156,
+ "sic": 8278,
+ "sic": 1118,
+ "sica": 34125,
+ "sical": 33875,
+ "sichuan": 48950,
+ "sicilian": 45292,
+ "sicily": 23179,
+ "sick": 11143,
+ "sick": 5359,
+ "sickest": 47972,
+ "sickle": 41459,
+ "sickness": 28898,
+ "sics": 26297,
+ "sid": 10117,
+ "sid": 15119,
+ "sidd": 19842,
+ "siddi": 35227,
+ "side": 5869,
+ "side": 1145,
+ "sided": 21061,
+ "sidekick": 44683,
+ "sidel": 43557,
+ "sideline": 32056,
+ "sidelines": 31046,
+ "sider": 30581,
+ "siders": 41249,
+ "sides": 7578,
+ "sideshow": 46789,
+ "sidewalk": 23278,
+ "sidewalks": 43583,
+ "sideways": 35593,
+ "siding": 38758,
+ "sidney": 22598,
+ "sie": 8533,
+ "sie": 5685,
+ "sieg": 49203,
+ "siege": 18460,
+ "siegel": 48559,
+ "siem": 18434,
+ "siemens": 30147,
+ "siempre": 44030,
+ "siena": 33336,
+ "sienna": 40373,
+ "sier": 10028,
+ "sier": 7444,
+ "sierra": 13552,
+ "siers": 35923,
+ "sies": 16367,
+ "siest": 18323,
+ "sif": 29300,
+ "sig": 872,
+ "sig": 19145,
+ "sigh": 36303,
+ "sigh": 15505,
+ "sighs": 44579,
+ "sight": 16897,
+ "sight": 6329,
+ "sighted": 33034,
+ "sighting": 17507,
+ "sightings": 30004,
+ "sights": 17364,
+ "sightseeing": 34210,
+ "sigma": 45075,
+ "sigma": 15697,
+ "sign": 5538,
+ "sign": 2292,
+ "signage": 21156,
+ "signal": 10781,
+ "signaling": 38492,
+ "signalling": 48426,
+ "signals": 17150,
+ "signation": 24347,
+ "signature": 9189,
+ "signatures": 21865,
+ "signed": 3163,
+ "signee": 39778,
+ "signi": 34023,
+ "signific": 6374,
+ "significance": 23769,
+ "significant": 8735,
+ "significantly": 16187,
+ "signing": 4401,
+ "signingday": 40282,
+ "signings": 27731,
+ "signs": 4659,
+ "signup": 40791,
+ "sigue": 49401,
+ "sii": 36672,
+ "sik": 19974,
+ "sik": 22413,
+ "sika": 31144,
+ "sikh": 21829,
+ "sikhs": 45426,
+ "sil": 1556,
+ "sil": 8315,
+ "sila": 41754,
+ "sile": 37620,
+ "silen": 39048,
+ "silence": 8462,
+ "silenced": 45415,
+ "silent": 30352,
+ "silent": 8487,
+ "silently": 42640,
+ "silhou": 20589,
+ "silhouette": 26149,
+ "silic": 23830,
+ "silicon": 32412,
+ "silicon": 17888,
+ "silicone": 28221,
+ "silk": 25891,
+ "silk": 9743,
+ "silky": 29554,
+ "sill": 42468,
+ "sill": 48024,
+ "silly": 11883,
+ "silon": 31841,
+ "sils": 39708,
+ "silva": 16489,
+ "silve": 37697,
+ "silver": 7525,
+ "silver": 3467,
+ "silverado": 46160,
+ "silverstone": 29666,
+ "silvia": 37289,
+ "sim": 5026,
+ "sim": 10740,
+ "sima": 35871,
+ "simba": 39492,
+ "simcoe": 47148,
+ "sime": 28329,
+ "simi": 38073,
+ "simil": 7202,
+ "similar": 8547,
+ "similarities": 34716,
+ "simm": 13001,
+ "simmons": 14699,
+ "simo": 37171,
+ "simon": 8796,
+ "simon": 6668,
+ "simona": 46277,
+ "simone": 19062,
+ "simons": 33097,
+ "simp": 2542,
+ "simple": 19018,
+ "simple": 4129,
+ "simpler": 35489,
+ "simplest": 39588,
+ "simpli": 16868,
+ "simplicity": 21262,
+ "simplified": 36647,
+ "simplify": 35479,
+ "simply": 25637,
+ "simply": 6151,
+ "simpson": 41805,
+ "simpson": 11750,
+ "simpsons": 21092,
+ "sims": 14021,
+ "simul": 9845,
+ "simulated": 46395,
+ "simulation": 18610,
+ "simulator": 20821,
+ "simultaneous": 48816,
+ "simultaneously": 28575,
+ "sin": 1303,
+ "sin": 3421,
+ "sina": 19541,
+ "sinai": 33226,
+ "sinatra": 27262,
+ "sinc": 30464,
+ "since": 1855,
+ "sincere": 24513,
+ "sincere": 24886,
+ "sincerely": 25673,
+ "sinclair": 23100,
+ "sind": 39598,
+ "sind": 30877,
+ "sindh": 20754,
+ "sindia": 48038,
+ "sine": 22741,
+ "sine": 33793,
+ "sinfo": 47178,
+ "sing": 1387,
+ "sing": 1197,
+ "singapo": 27861,
+ "singapore": 28879,
+ "singapore": 6754,
+ "singer": 33880,
+ "singer": 5108,
+ "singers": 15613,
+ "singersongwriter": 44585,
+ "singh": 19445,
+ "singh": 5715,
+ "singing": 5864,
+ "single": 19524,
+ "single": 2688,
+ "singles": 12025,
+ "singleton": 46247,
+ "singly": 16619,
+ "sings": 13635,
+ "singul": 34003,
+ "singular": 44009,
+ "singularity": 48410,
+ "sinha": 29416,
+ "sini": 41781,
+ "sini": 26319,
+ "sinister": 31313,
+ "sink": 37232,
+ "sink": 14551,
+ "sinking": 27949,
+ "sinks": 32710,
+ "sinn": 36315,
+ "sinner": 45380,
+ "sinners": 43436,
+ "sino": 29759,
+ "sins": 9345,
+ "sinthe": 30737,
+ "sinu": 37351,
+ "sinus": 47535,
+ "sio": 10807,
+ "siob": 40954,
+ "siology": 46315,
+ "sion": 5676,
+ "sion": 1015,
+ "sional": 14533,
+ "sionally": 30754,
+ "sions": 4060,
+ "sioux": 44695,
+ "sioux": 24954,
+ "sip": 16096,
+ "sipping": 28527,
+ "sir": 10708,
+ "sir": 3846,
+ "sire": 28450,
+ "siren": 33026,
+ "sirens": 35907,
+ "siri": 13986,
+ "siri": 18394,
+ "sirius": 23574,
+ "sirius": 34999,
+ "siriusxm": 29833,
+ "sirloin": 46828,
+ "sis": 18132,
+ "sis": 2580,
+ "sisd": 27132,
+ "sisi": 37892,
+ "siss": 42929,
+ "sissy": 27564,
+ "sist": 20520,
+ "sista": 37448,
+ "sister": 17417,
+ "sister": 3677,
+ "sisterhood": 37313,
+ "sisters": 6404,
+ "sit": 7387,
+ "sit": 4037,
+ "sitcom": 30426,
+ "site": 26792,
+ "site": 1988,
+ "sites": 7236,
+ "sith": 41499,
+ "sito": 42613,
+ "sits": 12726,
+ "sitt": 42988,
+ "sitter": 40777,
+ "sittin": 40887,
+ "sitting": 4919,
+ "situ": 5562,
+ "situ": 42536,
+ "situated": 22030,
+ "situation": 7144,
+ "situations": 19096,
+ "sity": 38177,
+ "sity": 5477,
+ "siu": 40174,
+ "sium": 8090,
+ "sius": 27595,
+ "siva": 20991,
+ "sivan": 36931,
+ "sive": 23572,
+ "sive": 1875,
+ "sively": 10343,
+ "siveness": 39667,
+ "sives": 23896,
+ "sivity": 42738,
+ "siwon": 29055,
+ "six": 5968,
+ "six": 4093,
+ "sixers": 25941,
+ "sixteen": 28677,
+ "sixth": 12909,
+ "sixties": 44948,
+ "sixty": 32588,
+ "siya": 44440,
+ "size": 38377,
+ "size": 3235,
+ "sized": 9832,
+ "sizes": 10253,
+ "sizing": 28330,
+ "sizz": 23778,
+ "sizzle": 47890,
+ "sizzling": 35799,
+ "sj": 7536,
+ "sj": 16010,
+ "sjo": 42012,
+ "sk": 909,
+ "sk": 2058,
+ "ska": 7495,
+ "skag": 31948,
+ "skan": 46772,
+ "skar": 27587,
+ "skar": 26835,
+ "skate": 13740,
+ "skate": 12745,
+ "skateboard": 31777,
+ "skateboarding": 31352,
+ "skater": 30337,
+ "skaters": 39824,
+ "skates": 31479,
+ "skc": 44551,
+ "ske": 6261,
+ "ske": 25516,
+ "skel": 36564,
+ "skelet": 27075,
+ "skeletal": 37369,
+ "skeleton": 20062,
+ "skeletons": 48874,
+ "skell": 40801,
+ "skep": 27772,
+ "skeptical": 44934,
+ "sker": 37640,
+ "sker": 33600,
+ "sket": 3744,
+ "sketch": 11767,
+ "sketch": 5269,
+ "sketchbook": 18899,
+ "sketched": 38581,
+ "sketches": 17622,
+ "sketching": 23228,
+ "sketchy": 41582,
+ "skey": 37453,
+ "ski": 3327,
+ "ski": 3428,
+ "skid": 36574,
+ "skid": 32099,
+ "skier": 42585,
+ "skies": 7244,
+ "skiing": 14400,
+ "skil": 24543,
+ "skill": 15598,
+ "skill": 10604,
+ "skilled": 17535,
+ "skillet": 40568,
+ "skills": 4113,
+ "skim": 33191,
+ "skin": 5821,
+ "skin": 3575,
+ "skincare": 12648,
+ "skine": 37300,
+ "sking": 46215,
+ "skinned": 42199,
+ "skinner": 30261,
+ "skinny": 42729,
+ "skinny": 15457,
+ "skins": 11594,
+ "skip": 39793,
+ "skip": 14296,
+ "skipped": 40639,
+ "skipper": 22226,
+ "skipping": 34867,
+ "skir": 8919,
+ "skirt": 12386,
+ "skirts": 24840,
+ "skis": 32843,
+ "skit": 43573,
+ "skitchen": 42820,
+ "skittles": 43213,
+ "sko": 15141,
+ "sko": 23493,
+ "skoda": 38668,
+ "skool": 26743,
+ "skril": 43149,
+ "skrillex": 43651,
+ "sks": 48136,
+ "sku": 10836,
+ "skul": 17561,
+ "skull": 34068,
+ "skull": 12092,
+ "skulls": 31804,
+ "skunk": 42194,
+ "sky": 3075,
+ "sky": 2390,
+ "skybet": 45540,
+ "skye": 21475,
+ "skyl": 43554,
+ "skylar": 45411,
+ "skyline": 14606,
+ "skymap": 41734,
+ "skynews": 40977,
+ "skype": 17069,
+ "skyrim": 33693,
+ "skysports": 39845,
+ "skysports": 46725,
+ "skywalker": 32936,
+ "sl": 2621,
+ "sl": 7489,
+ "sla": 2725,
+ "sla": 26707,
+ "slab": 24241,
+ "slabs": 42818,
+ "slack": 37108,
+ "slack": 30142,
+ "slade": 33546,
+ "slain": 35972,
+ "slalom": 43540,
+ "slam": 14891,
+ "slam": 10131,
+ "slammed": 29772,
+ "slams": 18907,
+ "slan": 44663,
+ "slan": 47193,
+ "sland": 11294,
+ "slang": 33655,
+ "slap": 48830,
+ "slap": 21751,
+ "slapped": 38861,
+ "slaps": 46796,
+ "slash": 19749,
+ "slat": 38966,
+ "slate": 17919,
+ "slated": 36094,
+ "slater": 25968,
+ "slaugh": 26782,
+ "slaughter": 19815,
+ "slaughtered": 46615,
+ "slav": 47292,
+ "slava": 41797,
+ "slave": 14029,
+ "slavery": 15754,
+ "slaves": 23833,
+ "slaw": 28178,
+ "slay": 48319,
+ "slay": 19380,
+ "slayed": 44870,
+ "slayer": 21605,
+ "slaying": 27812,
+ "slays": 45648,
+ "slc": 21972,
+ "sle": 1709,
+ "sleague": 23336,
+ "sled": 28438,
+ "sledge": 48750,
+ "slee": 17642,
+ "slee": 38977,
+ "sleek": 23187,
+ "sleep": 4656,
+ "sleep": 3840,
+ "sleeper": 28709,
+ "sleeping": 6982,
+ "sleepless": 39779,
+ "sleepover": 39415,
+ "sleeps": 16610,
+ "sleepy": 32572,
+ "sleepy": 14497,
+ "sleet": 36948,
+ "sleeve": 35270,
+ "sleeve": 10536,
+ "sleeveless": 38049,
+ "sleeves": 19691,
+ "sleg": 47650,
+ "sleigh": 30865,
+ "slender": 40331,
+ "slept": 20388,
+ "sler": 14066,
+ "sley": 17198,
+ "sley": 6496,
+ "sli": 1811,
+ "sli": 44824,
+ "slic": 19692,
+ "slice": 13431,
+ "sliced": 28121,
+ "slices": 28424,
+ "slick": 18341,
+ "slide": 27828,
+ "slide": 8837,
+ "slider": 37861,
+ "sliders": 40700,
+ "slides": 15939,
+ "slideshow": 42817,
+ "sliding": 21468,
+ "slife": 15448,
+ "sliga": 21080,
+ "slight": 14297,
+ "slightly": 8456,
+ "sligo": 30424,
+ "slike": 38744,
+ "slim": 35226,
+ "slim": 12364,
+ "slime": 29107,
+ "sling": 28021,
+ "sling": 32607,
+ "slinger": 47269,
+ "slions": 43363,
+ "slip": 39785,
+ "slip": 12105,
+ "slipknot": 41816,
+ "slipped": 30344,
+ "slipper": 39644,
+ "slippers": 26509,
+ "slippery": 30814,
+ "slipping": 36301,
+ "slips": 30632,
+ "slist": 33749,
+ "slit": 47011,
+ "slive": 31652,
+ "slo": 4303,
+ "slo": 36083,
+ "sloan": 29110,
+ "sloane": 41553,
+ "slogan": 23398,
+ "slogans": 42795,
+ "slope": 22769,
+ "slopes": 24066,
+ "sloppy": 36154,
+ "slot": 14500,
+ "sloth": 30007,
+ "slots": 19238,
+ "slou": 48493,
+ "slovak": 23315,
+ "slovakia": 25994,
+ "sloven": 17018,
+ "slovenia": 21037,
+ "slow": 6674,
+ "slow": 5444,
+ "slowdown": 38421,
+ "slowed": 43793,
+ "slower": 29181,
+ "slowing": 29839,
+ "slowly": 9568,
+ "slows": 46855,
+ "slp": 45599,
+ "slr": 21325,
+ "sls": 33651,
+ "slt": 39283,
+ "sltd": 36388,
+ "slu": 7224,
+ "slu": 47456,
+ "slug": 34190,
+ "slugger": 48671,
+ "slum": 46754,
+ "slumber": 44295,
+ "slump": 35588,
+ "slur": 30476,
+ "slush": 39815,
+ "slv": 45526,
+ "sly": 28145,
+ "sly": 21062,
+ "sm": 978,
+ "sm": 2764,
+ "sma": 4357,
+ "sma": 11854,
+ "smack": 21280,
+ "smack": 30026,
+ "smackdown": 26138,
+ "smafia": 47686,
+ "smag": 32212,
+ "smal": 48379,
+ "small": 5244,
+ "small": 2442,
+ "smallbiz": 41724,
+ "smallbiz": 18987,
+ "smallbusiness": 21316,
+ "smalle": 18490,
+ "smaller": 12431,
+ "smallest": 18686,
+ "smalls": 41696,
+ "sman": 9612,
+ "smar": 3201,
+ "smart": 5383,
+ "smart": 4115,
+ "smartcities": 34822,
+ "smartcity": 33973,
+ "smarter": 18990,
+ "smartest": 37092,
+ "smarthome": 47726,
+ "smartphone": 11290,
+ "smartphones": 22212,
+ "smartwatch": 35798,
+ "smash": 17258,
+ "smash": 10332,
+ "smashbros": 44897,
+ "smashed": 18410,
+ "smashes": 45657,
+ "smashing": 19632,
+ "smatter": 16537,
+ "smb": 30446,
+ "smc": 31375,
+ "smc": 28312,
+ "smd": 34582,
+ "sme": 11758,
+ "sme": 15650,
+ "smear": 37546,
+ "smel": 28476,
+ "smell": 9688,
+ "smelling": 32493,
+ "smells": 14668,
+ "smelly": 46145,
+ "smen": 15961,
+ "smer": 48526,
+ "smere": 39629,
+ "smes": 26141,
+ "smg": 46876,
+ "smh": 9623,
+ "smi": 5655,
+ "smi": 40049,
+ "smil": 33937,
+ "smile": 27641,
+ "smile": 3490,
+ "smiled": 34362,
+ "smiles": 8726,
+ "smiley": 22925,
+ "smiling": 9200,
+ "smir": 24667,
+ "smith": 10527,
+ "smith": 2915,
+ "smiths": 27872,
+ "smithson": 25372,
+ "smithsonian": 31209,
+ "smm": 19510,
+ "smma": 42370,
+ "smo": 2513,
+ "smo": 13437,
+ "smobile": 38923,
+ "smog": 44425,
+ "smoke": 20381,
+ "smoke": 6664,
+ "smoked": 11161,
+ "smoker": 32348,
+ "smokers": 29571,
+ "smokes": 40336,
+ "smokey": 23670,
+ "smokin": 32825,
+ "smoking": 9038,
+ "smoky": 25549,
+ "smol": 29939,
+ "smol": 40403,
+ "smoo": 5430,
+ "smooth": 10958,
+ "smooth": 8990,
+ "smoother": 44271,
+ "smoothie": 16668,
+ "smoothies": 34458,
+ "smoothly": 32380,
+ "smore": 48323,
+ "smp": 32260,
+ "smriti": 49227,
+ "sms": 10409,
+ "smt": 26672,
+ "smtown": 26072,
+ "smu": 10878,
+ "smu": 30458,
+ "smug": 41021,
+ "smugg": 28130,
+ "smuggling": 34146,
+ "smur": 24708,
+ "smusic": 19191,
+ "smw": 44929,
+ "smx": 46699,
+ "smy": 14381,
+ "smyth": 44822,
+ "sn": 1672,
+ "sn": 5844,
+ "sna": 4032,
+ "snack": 47548,
+ "snack": 10039,
+ "snacking": 46474,
+ "snacks": 12349,
+ "snag": 34789,
+ "snag": 28043,
+ "snagged": 48534,
+ "snail": 23132,
+ "snails": 34928,
+ "snake": 30133,
+ "snake": 8798,
+ "snakes": 19605,
+ "snap": 4578,
+ "snap": 7404,
+ "snapback": 31234,
+ "snapchat": 7799,
+ "snapmatic": 45907,
+ "snapp": 10185,
+ "snapped": 15543,
+ "snapper": 31677,
+ "snapping": 31581,
+ "snaps": 16890,
+ "snapshot": 18243,
+ "snar": 30810,
+ "snare": 40651,
+ "snat": 18457,
+ "snatch": 35302,
+ "snatched": 44821,
+ "snation": 14362,
+ "snazzy": 48963,
+ "snc": 39918,
+ "sne": 3791,
+ "sne": 46503,
+ "sneak": 27871,
+ "sneak": 6917,
+ "sneaker": 31698,
+ "sneaker": 24781,
+ "sneakers": 17397,
+ "sneaking": 34633,
+ "sneakpeek": 47831,
+ "sneaks": 40926,
+ "sneaky": 21293,
+ "snee": 42095,
+ "snell": 46410,
+ "sner": 31424,
+ "snes": 26667,
+ "snews": 18623,
+ "snf": 47651,
+ "sng": 41549,
+ "snhl": 43093,
+ "sni": 7186,
+ "sni": 35570,
+ "snickers": 49127,
+ "sniff": 37841,
+ "snip": 42954,
+ "sniper": 22157,
+ "snippet": 37531,
+ "snippets": 44001,
+ "snl": 16011,
+ "sno": 8567,
+ "sno": 17802,
+ "snoo": 11352,
+ "snooker": 25657,
+ "snoop": 44503,
+ "snoop": 27754,
+ "snoopdogg": 48388,
+ "snoopy": 41967,
+ "snooze": 40718,
+ "snor": 16590,
+ "snoring": 44560,
+ "snorkel": 44285,
+ "snorkeling": 48103,
+ "snow": 3880,
+ "snow": 2583,
+ "snowball": 39254,
+ "snowboard": 33403,
+ "snowboarding": 32397,
+ "snowday": 37982,
+ "snowden": 32154,
+ "snowdon": 47107,
+ "snowdonia": 36088,
+ "snowed": 45073,
+ "snowfall": 21714,
+ "snowflake": 33447,
+ "snowflakes": 38618,
+ "snowing": 21443,
+ "snowman": 22668,
+ "snowstorm": 38777,
+ "snowy": 14191,
+ "snp": 15301,
+ "sns": 36343,
+ "snsd": 27961,
+ "snt": 34834,
+ "snu": 9694,
+ "snuck": 36522,
+ "snug": 45169,
+ "snuggle": 31327,
+ "snuggles": 48165,
+ "sny": 17526,
+ "snyder": 22106,
+ "snz": 37678,
+ "so": 759,
+ "so": 706,
+ "soa": 39584,
+ "soak": 24839,
+ "soaked": 26592,
+ "soaking": 26750,
+ "soap": 26086,
+ "soap": 11088,
+ "soaps": 40958,
+ "soar": 48997,
+ "soar": 22241,
+ "soaring": 27968,
+ "soars": 41348,
+ "sob": 24900,
+ "sob": 35507,
+ "sobbing": 36691,
+ "sober": 30969,
+ "sober": 24487,
+ "sobre": 42768,
+ "sobri": 49308,
+ "sobs": 43636,
+ "soc": 3253,
+ "soc": 7741,
+ "soca": 49239,
+ "socal": 46470,
+ "socal": 20450,
+ "soccer": 16268,
+ "soccer": 4233,
+ "socceroos": 41997,
+ "socent": 30831,
+ "sochi": 21014,
+ "soci": 1720,
+ "social": 4803,
+ "social": 2346,
+ "socialism": 23372,
+ "socialist": 18450,
+ "socialists": 43839,
+ "socially": 24555,
+ "socialmedi": 23813,
+ "socialmedia": 9600,
+ "socialmediamarketing": 31790,
+ "societal": 40058,
+ "societies": 25855,
+ "society": 3757,
+ "socio": 44319,
+ "socio": 42790,
+ "sociology": 32373,
+ "sock": 29801,
+ "sock": 18277,
+ "socket": 28657,
+ "socks": 8774,
+ "socorro": 46409,
+ "socute": 45086,
+ "sod": 31435,
+ "soda": 13533,
+ "sodium": 29070,
+ "soe": 44136,
+ "soe": 25498,
+ "soever": 34024,
+ "sof": 1571,
+ "sof": 41187,
+ "sofa": 15723,
+ "soff": 35290,
+ "soff": 30684,
+ "sofficial": 20563,
+ "sofi": 41537,
+ "sofia": 18914,
+ "sofinstagram": 17301,
+ "soft": 12778,
+ "soft": 3773,
+ "softball": 8369,
+ "softer": 44462,
+ "softhe": 23127,
+ "softly": 34958,
+ "software": 35941,
+ "software": 5847,
+ "softwitter": 11311,
+ "sog": 44775,
+ "soggy": 41168,
+ "sohn": 49267,
+ "soho": 47749,
+ "soho": 17592,
+ "soi": 40495,
+ "soil": 33417,
+ "soil": 9216,
+ "soils": 34891,
+ "soir": 43427,
+ "sok": 43456,
+ "sol": 1175,
+ "sol": 9941,
+ "sola": 40086,
+ "solace": 42567,
+ "solar": 16990,
+ "solar": 5199,
+ "solareclipse": 44727,
+ "sold": 33116,
+ "sold": 3939,
+ "soldi": 5098,
+ "soldier": 9355,
+ "soldiers": 7547,
+ "sole": 10519,
+ "sole": 8576,
+ "soleil": 33148,
+ "solely": 27913,
+ "solent": 47783,
+ "soles": 22682,
+ "soli": 3911,
+ "solic": 19369,
+ "solicitor": 45647,
+ "solicitors": 46000,
+ "solid": 30626,
+ "solid": 6148,
+ "solidar": 10415,
+ "solidarity": 10983,
+ "solidi": 46136,
+ "solids": 49070,
+ "solihull": 45293,
+ "solit": 37039,
+ "solitaire": 47257,
+ "solitary": 33094,
+ "solitude": 33199,
+ "solo": 17626,
+ "solo": 5797,
+ "soloist": 46391,
+ "solom": 15768,
+ "solomon": 19785,
+ "solos": 44868,
+ "solst": 20298,
+ "solstice": 21359,
+ "solu": 2487,
+ "solution": 4575,
+ "solutions": 5140,
+ "solve": 8917,
+ "solved": 13451,
+ "solves": 42740,
+ "solving": 15581,
+ "som": 734,
+ "som": 10672,
+ "soma": 36170,
+ "somal": 40281,
+ "somali": 26231,
+ "somalia": 17051,
+ "somaliland": 43315,
+ "some": 1132,
+ "some": 836,
+ "somebody": 8305,
+ "someday": 17127,
+ "somehow": 11735,
+ "someone": 2100,
+ "somer": 9656,
+ "somerhalder": 33990,
+ "somerset": 14926,
+ "somerville": 41409,
+ "somes": 38124,
+ "somethin": 33541,
+ "something": 28316,
+ "something": 2006,
+ "sometime": 21464,
+ "sometimes": 4237,
+ "somewhat": 17864,
+ "somewhere": 8119,
+ "somm": 42726,
+ "somme": 30625,
+ "sommer": 44954,
+ "somos": 24951,
+ "son": 1176,
+ "son": 825,
+ "sona": 21249,
+ "sonam": 40096,
+ "sonar": 48235,
+ "sonata": 37009,
+ "sone": 29599,
+ "song": 6868,
+ "song": 2295,
+ "songs": 4641,
+ "songwriter": 13034,
+ "songwriters": 39583,
+ "songwriting": 33567,
+ "songz": 49302,
+ "soni": 34899,
+ "soni": 35911,
+ "sonia": 20409,
+ "sonic": 23785,
+ "sonic": 9132,
+ "sonics": 48511,
+ "sonja": 46102,
+ "sonline": 23412,
+ "sonny": 43000,
+ "sonny": 20880,
+ "sono": 44109,
+ "sonom": 48596,
+ "sonoma": 26269,
+ "sons": 5502,
+ "sonsof": 46676,
+ "sont": 31063,
+ "sonthe": 40923,
+ "sony": 16042,
+ "sony": 8748,
+ "sonya": 39172,
+ "soo": 5517,
+ "soo": 8602,
+ "soom": 39771,
+ "soon": 27559,
+ "soon": 1745,
+ "sooner": 18968,
+ "sooners": 30449,
+ "sooo": 11526,
+ "soooo": 13658,
+ "sooooo": 21199,
+ "soooooo": 34859,
+ "soor": 46698,
+ "soothe": 44424,
+ "soothing": 27730,
+ "sop": 3974,
+ "sop": 19194,
+ "soph": 34963,
+ "sophi": 6192,
+ "sophia": 16790,
+ "sophie": 38648,
+ "sophie": 12357,
+ "sophistic": 17646,
+ "sophisticated": 20833,
+ "sophom": 13696,
+ "sophomore": 15242,
+ "sophomores": 47645,
+ "soprano": 28880,
+ "soproud": 44479,
+ "sor": 1852,
+ "sor": 16872,
+ "sora": 38719,
+ "sorbet": 39994,
+ "sore": 43330,
+ "sore": 15454,
+ "sored": 6731,
+ "soren": 38907,
+ "sorg": 28152,
+ "sori": 38588,
+ "sorority": 30059,
+ "soros": 33248,
+ "sorren": 44012,
+ "sorrow": 28020,
+ "sorrows": 47924,
+ "sorry": 25745,
+ "sorry": 3675,
+ "sorrynotsorry": 37105,
+ "sort": 8450,
+ "sorta": 34700,
+ "sorted": 13221,
+ "sorting": 19198,
+ "sorts": 12577,
+ "sory": 16257,
+ "sos": 25145,
+ "sos": 5792,
+ "sosa": 45433,
+ "sosfam": 47709,
+ "sot": 41542,
+ "sot": 34116,
+ "sothe": 32145,
+ "sotho": 45496,
+ "soto": 27947,
+ "sotto": 26047,
+ "sotu": 32286,
+ "sou": 1101,
+ "sou": 24293,
+ "sought": 18874,
+ "soul": 8701,
+ "soul": 3755,
+ "soulful": 30196,
+ "soulmate": 38130,
+ "souls": 10951,
+ "soun": 19474,
+ "sound": 5236,
+ "sound": 3608,
+ "soundcheck": 31394,
+ "soundcloud": 15190,
+ "sounded": 28287,
+ "sounders": 44933,
+ "sounding": 21351,
+ "sounds": 5694,
+ "soundtrack": 11389,
+ "soup": 7077,
+ "soups": 45052,
+ "sour": 2235,
+ "sour": 12049,
+ "source": 23698,
+ "source": 3634,
+ "sourced": 23340,
+ "sources": 5124,
+ "sourcing": 19574,
+ "sourdough": 29921,
+ "souri": 11674,
+ "sous": 32093,
+ "sousa": 46296,
+ "sout": 38156,
+ "sout": 32732,
+ "south": 2938,
+ "south": 2045,
+ "southafrica": 15184,
+ "southampton": 15767,
+ "southbank": 44173,
+ "southbound": 22932,
+ "southeast": 13942,
+ "southeastern": 26813,
+ "southend": 25583,
+ "souther": 33330,
+ "southern": 17704,
+ "southern": 5036,
+ "southgate": 47262,
+ "southkorea": 43552,
+ "southport": 37446,
+ "southside": 36436,
+ "southsudan": 30419,
+ "southwark": 39098,
+ "southwe": 46443,
+ "southwest": 13320,
+ "southwestern": 30157,
+ "souven": 20210,
+ "souvenir": 24811,
+ "souvenirs": 48460,
+ "souza": 29424,
+ "sov": 29737,
+ "sover": 31876,
+ "sovere": 17736,
+ "sovereign": 29418,
+ "sovereign": 26337,
+ "sovereignty": 31701,
+ "soviet": 14274,
+ "sow": 33089,
+ "sowe": 36130,
+ "soweto": 47070,
+ "sown": 49369,
+ "sox": 39556,
+ "sox": 8657,
+ "soy": 16524,
+ "soy": 15010,
+ "soybean": 34606,
+ "soybeans": 40840,
+ "soyu": 39578,
+ "soyuz": 43842,
+ "sp": 588,
+ "sp": 4393,
+ "spa": 7852,
+ "spa": 6692,
+ "spac": 10336,
+ "space": 7857,
+ "space": 2138,
+ "spacecraft": 25940,
+ "spaces": 9006,
+ "spaceship": 34317,
+ "spacex": 22511,
+ "spacey": 48770,
+ "spacious": 24769,
+ "spad": 45362,
+ "spade": 32562,
+ "spades": 48368,
+ "spaghetti": 18440,
+ "spain": 5083,
+ "spal": 26018,
+ "spam": 29712,
+ "spam": 14624,
+ "span": 4270,
+ "span": 14537,
+ "spandex": 41686,
+ "spani": 16721,
+ "spaniel": 35435,
+ "spanish": 29966,
+ "spanish": 6013,
+ "spann": 25323,
+ "spanning": 38638,
+ "spans": 45407,
+ "spaper": 34548,
+ "spar": 3378,
+ "spar": 34576,
+ "spare": 12615,
+ "spares": 39505,
+ "spark": 9555,
+ "spark": 11047,
+ "sparked": 32647,
+ "sparkle": 18287,
+ "sparkles": 36410,
+ "sparkling": 17893,
+ "sparkly": 30542,
+ "sparks": 15046,
+ "sparky": 47198,
+ "sparring": 42161,
+ "sparrow": 22888,
+ "spart": 10143,
+ "sparta": 38401,
+ "spartan": 26582,
+ "spartan": 24225,
+ "spartans": 20457,
+ "sparty": 36477,
+ "spas": 31714,
+ "spati": 19200,
+ "spatial": 22022,
+ "spaw": 31605,
+ "spawn": 29166,
+ "spay": 40634,
+ "spc": 20492,
+ "spca": 37018,
+ "spd": 37717,
+ "spd": 28307,
+ "spdwy": 45981,
+ "spe": 876,
+ "spe": 36676,
+ "speak": 20599,
+ "speak": 4208,
+ "speake": 46077,
+ "speaker": 25764,
+ "speaker": 4914,
+ "speakers": 7675,
+ "speaking": 3714,
+ "speaks": 5661,
+ "spear": 23277,
+ "spear": 30420,
+ "speare": 43859,
+ "spears": 20242,
+ "spec": 1711,
+ "spec": 18596,
+ "speci": 1969,
+ "special": 11422,
+ "special": 1689,
+ "specialist": 10630,
+ "specialists": 21719,
+ "speciality": 46904,
+ "specialized": 23265,
+ "specializes": 48533,
+ "specially": 4513,
+ "specials": 11983,
+ "specialty": 18262,
+ "species": 6330,
+ "specific": 10528,
+ "specifically": 17174,
+ "specification": 46394,
+ "specifications": 39705,
+ "specified": 48114,
+ "specimen": 30263,
+ "specimens": 42715,
+ "specs": 24093,
+ "spect": 3416,
+ "spectac": 7242,
+ "spectacle": 34342,
+ "spectacular": 8404,
+ "spectator": 32372,
+ "spectators": 39306,
+ "spective": 6633,
+ "spector": 48676,
+ "spectral": 45441,
+ "spectre": 35998,
+ "spectro": 27646,
+ "spectrum": 13532,
+ "specul": 19209,
+ "speculation": 30898,
+ "sped": 38813,
+ "spee": 4050,
+ "speech": 19556,
+ "speech": 4902,
+ "speeches": 25208,
+ "speechless": 23152,
+ "speed": 6860,
+ "speed": 4163,
+ "speeding": 27264,
+ "speeds": 22017,
+ "speedway": 11480,
+ "speedy": 21603,
+ "spel": 41887,
+ "spell": 22784,
+ "spell": 11230,
+ "spelled": 24339,
+ "spelling": 15614,
+ "spells": 25335,
+ "spelt": 38316,
+ "spen": 5087,
+ "spence": 33324,
+ "spencer": 27509,
+ "spencer": 10678,
+ "spend": 4664,
+ "spending": 5961,
+ "spends": 22508,
+ "spent": 4429,
+ "speople": 33035,
+ "sper": 8213,
+ "sper": 15313,
+ "sperm": 35781,
+ "sperson": 22687,
+ "spf": 34973,
+ "spg": 34623,
+ "sph": 28909,
+ "sph": 24684,
+ "sphe": 33691,
+ "spher": 18349,
+ "sphere": 6987,
+ "spheres": 37478,
+ "spheric": 21744,
+ "sphin": 39237,
+ "sphinx": 46487,
+ "spho": 20442,
+ "sphoto": 38594,
+ "sphy": 43808,
+ "spi": 3174,
+ "spi": 37080,
+ "spic": 17264,
+ "spice": 29761,
+ "spice": 10141,
+ "spiced": 24267,
+ "spicer": 37627,
+ "spices": 21194,
+ "spicy": 10915,
+ "spide": 36801,
+ "spider": 11963,
+ "spider": 7622,
+ "spiderman": 39808,
+ "spiderman": 18427,
+ "spiders": 23141,
+ "spidey": 41706,
+ "spie": 28573,
+ "spie": 28746,
+ "spied": 43998,
+ "spiegel": 45351,
+ "spiel": 28435,
+ "spiel": 37690,
+ "spielberg": 37569,
+ "spies": 25374,
+ "spieth": 43254,
+ "spike": 35306,
+ "spike": 15310,
+ "spiked": 47014,
+ "spikes": 29582,
+ "spil": 47765,
+ "spill": 43933,
+ "spill": 18006,
+ "spilled": 33206,
+ "spilling": 49006,
+ "spills": 35796,
+ "spin": 6288,
+ "spin": 9226,
+ "spinach": 14747,
+ "spinal": 23925,
+ "spine": 48221,
+ "spine": 19646,
+ "sping": 47113,
+ "spinner": 29924,
+ "spinning": 13987,
+ "spino": 40848,
+ "spinoff": 42513,
+ "spinrilla": 46064,
+ "spins": 27243,
+ "spion": 39604,
+ "spionage": 41838,
+ "spir": 3745,
+ "spiral": 19873,
+ "spiration": 38126,
+ "spire": 27439,
+ "spired": 40650,
+ "spires": 46938,
+ "spiri": 4024,
+ "spirit": 18224,
+ "spirit": 4071,
+ "spirited": 34701,
+ "spirits": 13192,
+ "spiritu": 7237,
+ "spiritual": 46076,
+ "spiritual": 9473,
+ "spirituality": 22165,
+ "spiro": 40085,
+ "spit": 18115,
+ "spit": 23177,
+ "spite": 26060,
+ "spitfire": 31126,
+ "spitting": 40721,
+ "spl": 2470,
+ "spl": 33052,
+ "spla": 4809,
+ "splac": 16059,
+ "splace": 38743,
+ "splash": 43641,
+ "splash": 11879,
+ "splat": 15733,
+ "splatoon": 22565,
+ "splay": 3169,
+ "splen": 18552,
+ "splend": 29861,
+ "splendid": 21016,
+ "splendor": 46262,
+ "splin": 38090,
+ "split": 25443,
+ "split": 9109,
+ "splits": 34897,
+ "splitting": 37210,
+ "splus": 40866,
+ "spn": 35467,
+ "spn": 19414,
+ "spnfamily": 38566,
+ "spo": 1261,
+ "spo": 21085,
+ "spock": 43918,
+ "spoil": 25600,
+ "spoiled": 21399,
+ "spoiler": 16512,
+ "spoilers": 18326,
+ "spoils": 42436,
+ "spoilt": 35358,
+ "spokane": 24528,
+ "spoke": 13890,
+ "spoke": 6518,
+ "spoken": 12979,
+ "spokesman": 31632,
+ "spokesperson": 26234,
+ "spol": 22476,
+ "spol": 8132,
+ "spoli": 34301,
+ "spolice": 37406,
+ "spon": 1715,
+ "spon": 48216,
+ "sponge": 22861,
+ "sponge": 24345,
+ "spongebob": 25089,
+ "spons": 5597,
+ "sponsor": 10424,
+ "sponsor": 7574,
+ "sponsored": 7197,
+ "sponsoring": 16181,
+ "sponsors": 11005,
+ "sponsorship": 17632,
+ "spontaneous": 32465,
+ "spoo": 11248,
+ "spooky": 15369,
+ "spool": 49152,
+ "spoon": 27001,
+ "spoon": 14024,
+ "spoons": 29661,
+ "spor": 1475,
+ "spor": 33746,
+ "sport": 4379,
+ "sport": 2364,
+ "sporting": 32620,
+ "sporting": 8944,
+ "sports": 6436,
+ "sports": 2054,
+ "sportsc": 40114,
+ "sportscar": 46931,
+ "sportscenter": 39157,
+ "sportsman": 39020,
+ "sportsmanship": 34858,
+ "sportsnet": 34144,
+ "sportswear": 39747,
+ "sporty": 33346,
+ "spot": 3223,
+ "spot": 3049,
+ "spotify": 7193,
+ "spotlight": 7901,
+ "spots": 7670,
+ "spotted": 4533,
+ "spotter": 30742,
+ "spotting": 15885,
+ "spouse": 24724,
+ "spout": 48993,
+ "spp": 47567,
+ "spr": 1536,
+ "spr": 19417,
+ "spra": 12966,
+ "spraw": 46590,
+ "spray": 37885,
+ "spray": 10449,
+ "sprayed": 40022,
+ "spraying": 39224,
+ "spre": 18740,
+ "spread": 20620,
+ "spread": 5284,
+ "spreading": 11821,
+ "spreads": 27579,
+ "spree": 21851,
+ "spri": 35498,
+ "spride": 26685,
+ "spring": 5166,
+ "spring": 2420,
+ "springbreak": 37753,
+ "springer": 30117,
+ "springfield": 16599,
+ "springs": 7308,
+ "springst": 32132,
+ "springsteen": 28367,
+ "springtime": 28285,
+ "springtraining": 49364,
+ "springwatch": 29239,
+ "sprink": 15817,
+ "sprinkle": 42897,
+ "sprinkler": 48754,
+ "sprinkles": 37326,
+ "sprint": 29248,
+ "sprint": 10751,
+ "sprinter": 36947,
+ "sprints": 36404,
+ "sprite": 32544,
+ "spro": 13902,
+ "spro": 37403,
+ "sproject": 37802,
+ "sproud": 37686,
+ "sprout": 35863,
+ "sprouts": 25756,
+ "spru": 17041,
+ "spruce": 23812,
+ "sprung": 32968,
+ "sps": 13869,
+ "spu": 23566,
+ "spun": 47922,
+ "spun": 32852,
+ "spur": 15206,
+ "spur": 20361,
+ "spurs": 10916,
+ "spursofficial": 45290,
+ "sput": 47521,
+ "spx": 20584,
+ "spy": 13861,
+ "spy": 6656,
+ "spyder": 39952,
+ "spying": 36227,
+ "sq": 9370,
+ "sq": 11590,
+ "sqft": 41912,
+ "sql": 42759,
+ "sql": 18938,
+ "sqm": 47978,
+ "sqn": 41209,
+ "squ": 1653,
+ "squad": 13892,
+ "squad": 4234,
+ "squadron": 18579,
+ "squads": 36590,
+ "square": 19314,
+ "square": 3999,
+ "squared": 32967,
+ "squares": 26972,
+ "squash": 13312,
+ "squat": 44628,
+ "squat": 30680,
+ "squats": 40213,
+ "sque": 9721,
+ "sque": 8097,
+ "squee": 14420,
+ "squeeze": 21684,
+ "squeezed": 40413,
+ "squid": 42057,
+ "squid": 22553,
+ "squir": 9683,
+ "squire": 48090,
+ "squirrel": 14004,
+ "squirrels": 26623,
+ "squish": 42607,
+ "squishy": 47001,
+ "sr": 3437,
+ "sr": 5428,
+ "srbachchan": 32353,
+ "src": 23445,
+ "sre": 17748,
+ "sri": 11051,
+ "sri": 9276,
+ "sridevi": 46301,
+ "srilan": 15559,
+ "srilanka": 16922,
+ "srin": 26818,
+ "srinagar": 33671,
+ "srini": 41899,
+ "sriracha": 42743,
+ "sris": 27851,
+ "srisri": 32966,
+ "srk": 44982,
+ "srk": 11216,
+ "srl": 33808,
+ "srp": 43004,
+ "srs": 41764,
+ "srsly": 44179,
+ "srt": 28139,
+ "sru": 44152,
+ "srugby": 40526,
+ "ss": 690,
+ "ss": 632,
+ "ssa": 6088,
+ "ssal": 31330,
+ "ssal": 35936,
+ "ssb": 37511,
+ "ssc": 21692,
+ "ssc": 20364,
+ "ssd": 23107,
+ "sse": 9030,
+ "sse": 8938,
+ "ssed": 38755,
+ "ssed": 1804,
+ "ssel": 17402,
+ "ssel": 19373,
+ "sseldorf": 47792,
+ "ssell": 42388,
+ "ssels": 8355,
+ "ssen": 39408,
+ "ssen": 22645,
+ "sser": 20445,
+ "sses": 1802,
+ "ssett": 44103,
+ "ssf": 33239,
+ "ssg": 40707,
+ "ssh": 48866,
+ "ssi": 834,
+ "ssi": 14953,
+ "ssia": 22238,
+ "ssian": 31218,
+ "ssible": 47099,
+ "ssic": 27774,
+ "ssic": 17077,
+ "ssie": 7572,
+ "ssier": 26422,
+ "ssil": 15026,
+ "ssin": 42660,
+ "ssing": 2112,
+ "ssion": 16050,
+ "ssion": 1627,
+ "ssional": 13727,
+ "ssionism": 24787,
+ "ssionist": 27682,
+ "ssions": 4137,
+ "ssive": 2734,
+ "ssively": 28060,
+ "ssl": 32195,
+ "ssler": 30287,
+ "ssly": 24904,
+ "ssn": 39116,
+ "ssnhq": 47998,
+ "sso": 25900,
+ "sso": 7914,
+ "ssoccer": 32546,
+ "sson": 36124,
+ "sson": 7271,
+ "ssor": 35152,
+ "ssp": 31101,
+ "ssr": 39880,
+ "sss": 11176,
+ "ssss": 30676,
+ "ssss": 15880,
+ "sssss": 24298,
+ "sst": 40396,
+ "ssu": 35351,
+ "ssummit": 49301,
+ "ssus": 31286,
+ "ssw": 36937,
+ "ssy": 22519,
+ "ssy": 8661,
+ "st": 522,
+ "st": 545,
+ "sta": 1363,
+ "sta": 2745,
+ "stab": 7726,
+ "stab": 29974,
+ "stabbed": 24534,
+ "stabbing": 25474,
+ "stabil": 42576,
+ "stabili": 23903,
+ "stability": 16716,
+ "stable": 44427,
+ "stable": 10492,
+ "stables": 34218,
+ "stac": 10175,
+ "stacey": 41653,
+ "stacey": 24262,
+ "stache": 23616,
+ "stack": 24723,
+ "stack": 11257,
+ "stacked": 24990,
+ "stacking": 39836,
+ "stacks": 24734,
+ "stacy": 26628,
+ "stad": 15832,
+ "stad": 16485,
+ "stade": 38198,
+ "stadi": 26587,
+ "stadion": 48815,
+ "stadium": 3390,
+ "stadiums": 38852,
+ "stadt": 22713,
+ "staf": 2367,
+ "staff": 31188,
+ "staff": 2813,
+ "staffer": 38494,
+ "staffers": 44994,
+ "staffing": 32932,
+ "stafford": 25006,
+ "staffordshire": 29198,
+ "staffs": 36098,
+ "stag": 12088,
+ "stag": 20277,
+ "stage": 23182,
+ "stage": 2170,
+ "staged": 19906,
+ "stages": 12297,
+ "staggering": 37315,
+ "staging": 27026,
+ "stagram": 19503,
+ "stags": 45936,
+ "stain": 3933,
+ "stain": 14603,
+ "stained": 13751,
+ "staining": 32523,
+ "stainless": 12320,
+ "stains": 32008,
+ "stair": 7240,
+ "stair": 17662,
+ "staircase": 22777,
+ "stairs": 9577,
+ "stairway": 45559,
+ "stak": 39144,
+ "stake": 15955,
+ "stake": 7937,
+ "stakeholder": 39122,
+ "stakeholders": 22968,
+ "stakes": 7519,
+ "staking": 47082,
+ "stal": 3861,
+ "stal": 5535,
+ "stale": 42471,
+ "stalert": 25450,
+ "stalin": 28346,
+ "stalk": 40826,
+ "stalk": 14878,
+ "stalker": 26777,
+ "stalking": 24721,
+ "stalks": 45886,
+ "stall": 24636,
+ "stall": 12058,
+ "stalled": 40362,
+ "stallion": 28273,
+ "stallions": 44787,
+ "stallone": 40969,
+ "stalls": 25427,
+ "stam": 4663,
+ "stamatic": 30904,
+ "stamford": 27843,
+ "stamina": 48753,
+ "stamp": 28694,
+ "stamp": 12771,
+ "stampcollecting": 42852,
+ "stamped": 38356,
+ "stampede": 25384,
+ "stamps": 13827,
+ "stan": 2203,
+ "stan": 2434,
+ "stana": 33311,
+ "stanbul": 11231,
+ "stance": 48900,
+ "stance": 3542,
+ "stances": 15054,
+ "stand": 1819,
+ "stand": 2087,
+ "standalone": 44887,
+ "standard": 35780,
+ "standard": 5807,
+ "standardi": 30247,
+ "standards": 9022,
+ "standby": 36184,
+ "standing": 39934,
+ "standing": 2862,
+ "standings": 19835,
+ "standoff": 31821,
+ "standout": 23131,
+ "standre": 48309,
+ "stands": 6446,
+ "standup": 35108,
+ "standup": 24964,
+ "standwith": 19540,
+ "stanford": 36219,
+ "stanford": 15087,
+ "stang": 12536,
+ "stani": 38228,
+ "stanis": 37711,
+ "stanley": 19048,
+ "stanley": 10079,
+ "stanleycup": 28662,
+ "stans": 26564,
+ "stant": 41576,
+ "stant": 4906,
+ "stanton": 25400,
+ "stap": 10438,
+ "staple": 22695,
+ "staples": 23646,
+ "stapleton": 45228,
+ "star": 993,
+ "star": 1565,
+ "starbuck": 48519,
+ "starbucks": 9499,
+ "starch": 47837,
+ "starcraft": 48871,
+ "stardom": 44616,
+ "stardust": 34337,
+ "stare": 18094,
+ "stared": 47772,
+ "stares": 37916,
+ "starfish": 44283,
+ "stargate": 41099,
+ "stargazing": 49328,
+ "staring": 13800,
+ "stark": 40446,
+ "stark": 15353,
+ "starlight": 32197,
+ "starling": 46205,
+ "starmagic": 48023,
+ "starplus": 37815,
+ "starr": 19186,
+ "starred": 24180,
+ "starrer": 41311,
+ "starring": 6660,
+ "starry": 30963,
+ "stars": 2895,
+ "starship": 37166,
+ "start": 17466,
+ "start": 1572,
+ "started": 2760,
+ "starter": 7800,
+ "starters": 22222,
+ "starting": 2530,
+ "startrek": 30642,
+ "startrek": 15349,
+ "starts": 3105,
+ "startu": 6996,
+ "startup": 18049,
+ "startup": 5882,
+ "startups": 9056,
+ "starve": 46957,
+ "starving": 30473,
+ "starwar": 17287,
+ "starwars": 26239,
+ "starwars": 7887,
+ "starz": 25928,
+ "stas": 19866,
+ "stash": 27711,
+ "stasy": 45942,
+ "stat": 3004,
+ "stat": 15216,
+ "state": 3492,
+ "state": 1295,
+ "statec": 33931,
+ "stated": 19629,
+ "statedept": 41458,
+ "statefair": 40305,
+ "statement": 5401,
+ "statements": 19513,
+ "staten": 38263,
+ "stateof": 35195,
+ "states": 22125,
+ "states": 4218,
+ "statesman": 35301,
+ "stateu": 44248,
+ "statewide": 29561,
+ "stati": 9622,
+ "static": 16363,
+ "stating": 35147,
+ "station": 13498,
+ "station": 2631,
+ "stationary": 29493,
+ "stationed": 47618,
+ "stationery": 33851,
+ "stations": 10051,
+ "statistical": 29349,
+ "statistics": 14165,
+ "stats": 7294,
+ "statu": 32481,
+ "statue": 8222,
+ "statues": 24363,
+ "status": 6414,
+ "stau": 28550,
+ "staur": 3709,
+ "stav": 20285,
+ "stax": 32235,
+ "stay": 4714,
+ "stay": 2277,
+ "stayed": 13805,
+ "staying": 8993,
+ "stays": 13311,
+ "staytuned": 39285,
+ "stc": 29859,
+ "std": 30477,
+ "ste": 795,
+ "ste": 2686,
+ "stea": 46614,
+ "stead": 16101,
+ "stead": 11031,
+ "steadily": 35049,
+ "steady": 12937,
+ "steak": 26955,
+ "steak": 8913,
+ "steakhouse": 35031,
+ "steaks": 30655,
+ "steal": 37070,
+ "steal": 10181,
+ "stealing": 14242,
+ "steals": 20224,
+ "stealth": 25327,
+ "steam": 10962,
+ "steam": 6972,
+ "steamboat": 41121,
+ "steamed": 29007,
+ "steamer": 49075,
+ "steaming": 43746,
+ "steampunk": 24130,
+ "steamy": 43104,
+ "stec": 46713,
+ "stech": 48949,
+ "stech": 32455,
+ "sted": 20426,
+ "sted": 1356,
+ "stee": 31793,
+ "steed": 48293,
+ "steel": 6938,
+ "steel": 4726,
+ "steele": 19460,
+ "steelers": 14430,
+ "steen": 42851,
+ "steen": 18625,
+ "steep": 28648,
+ "steep": 20714,
+ "steer": 27612,
+ "steering": 19833,
+ "stef": 29158,
+ "stefan": 15004,
+ "stefan": 18829,
+ "stefani": 38319,
+ "stefano": 30719,
+ "steff": 30075,
+ "stein": 13653,
+ "stein": 5818,
+ "steiner": 36314,
+ "stel": 9102,
+ "stel": 10798,
+ "stell": 22355,
+ "stella": 46178,
+ "stella": 17869,
+ "stellar": 13810,
+ "stellen": 42754,
+ "stem": 24342,
+ "stem": 6761,
+ "stemc": 40486,
+ "stems": 31503,
+ "sten": 7652,
+ "sten": 7877,
+ "stencil": 47854,
+ "stennis": 45636,
+ "step": 15572,
+ "step": 3348,
+ "steph": 3522,
+ "steph": 16251,
+ "stephan": 37312,
+ "stephani": 48121,
+ "stephanie": 14361,
+ "stephen": 10421,
+ "stephen": 6078,
+ "stephenking": 46361,
+ "stephens": 22256,
+ "stephenson": 37280,
+ "stepped": 18384,
+ "stepping": 15906,
+ "steps": 5408,
+ "ster": 1022,
+ "ster": 881,
+ "stere": 9229,
+ "stered": 6935,
+ "stereo": 15992,
+ "stereo": 17400,
+ "stereotypes": 27890,
+ "steria": 38804,
+ "stering": 14175,
+ "sterling": 45790,
+ "sterling": 9378,
+ "stern": 36254,
+ "stern": 2945,
+ "steroids": 37670,
+ "sterone": 39418,
+ "sters": 2132,
+ "stery": 24232,
+ "stest": 8556,
+ "stev": 11640,
+ "steve": 7412,
+ "steve": 3803,
+ "steven": 10973,
+ "steven": 8016,
+ "stevens": 13877,
+ "stevenson": 25091,
+ "stevie": 42104,
+ "stevie": 18969,
+ "stew": 17906,
+ "stewar": 28453,
+ "steward": 34980,
+ "steward": 43355,
+ "stewards": 49294,
+ "stewardship": 36720,
+ "stewart": 8120,
+ "stfu": 47000,
+ "stg": 48387,
+ "stgeorge": 43698,
+ "sth": 13456,
+ "sth": 34004,
+ "sthe": 16491,
+ "sthel": 42863,
+ "sti": 860,
+ "sti": 12439,
+ "stia": 26492,
+ "stible": 25835,
+ "stic": 5868,
+ "stic": 1561,
+ "stical": 16660,
+ "stically": 19041,
+ "stick": 5483,
+ "stick": 4987,
+ "sticker": 11270,
+ "stickers": 11613,
+ "sticking": 21021,
+ "sticks": 10016,
+ "sticky": 18887,
+ "stics": 5449,
+ "stie": 38164,
+ "stie": 11000,
+ "stier": 42069,
+ "sties": 16428,
+ "stiff": 43471,
+ "stiff": 21441,
+ "stig": 4088,
+ "stig": 42551,
+ "stigate": 15390,
+ "stigma": 20619,
+ "stik": 42247,
+ "stil": 21790,
+ "stil": 37519,
+ "stiles": 33028,
+ "still": 13209,
+ "still": 1170,
+ "stills": 20259,
+ "stim": 18269,
+ "stime": 24711,
+ "stimul": 16434,
+ "stimulate": 42380,
+ "stimulating": 41237,
+ "stimulation": 39530,
+ "stimulus": 47283,
+ "stin": 2588,
+ "stin": 4025,
+ "stina": 22359,
+ "stine": 7098,
+ "sting": 19868,
+ "sting": 1271,
+ "stingly": 49332,
+ "stingray": 43229,
+ "stink": 38213,
+ "stinky": 44957,
+ "stino": 40658,
+ "stint": 33531,
+ "stion": 10812,
+ "stip": 39869,
+ "stips": 44756,
+ "stique": 43305,
+ "stir": 12416,
+ "stir": 19564,
+ "stirling": 23128,
+ "stirring": 39205,
+ "stis": 45224,
+ "stit": 14110,
+ "stitch": 30003,
+ "stitch": 14771,
+ "stitched": 36540,
+ "stitcher": 48204,
+ "stitches": 32360,
+ "stitching": 45208,
+ "stitu": 14585,
+ "stitutes": 40479,
+ "stive": 22426,
+ "stix": 48829,
+ "stjohn": 36153,
+ "stl": 14179,
+ "stl": 12527,
+ "stlblues": 44138,
+ "stlcards": 28644,
+ "stle": 7698,
+ "stles": 48638,
+ "stlouis": 40358,
+ "stlouis": 39516,
+ "stm": 28333,
+ "stn": 27175,
+ "sto": 928,
+ "sto": 5723,
+ "stock": 5899,
+ "stock": 3206,
+ "stocked": 23552,
+ "stockholm": 16024,
+ "stocki": 42944,
+ "stocking": 17335,
+ "stockings": 28040,
+ "stockmarket": 40359,
+ "stockport": 35569,
+ "stocks": 9321,
+ "stockton": 26130,
+ "stoday": 22392,
+ "stok": 43782,
+ "stoke": 31338,
+ "stoke": 13550,
+ "stoked": 13160,
+ "stokes": 27512,
+ "stol": 11401,
+ "stol": 6700,
+ "stole": 10995,
+ "stolen": 8704,
+ "stolic": 45020,
+ "stom": 2343,
+ "stom": 38068,
+ "stoma": 43545,
+ "stomach": 14722,
+ "stomp": 40165,
+ "stomping": 46144,
+ "ston": 4101,
+ "ston": 1839,
+ "stone": 7694,
+ "stone": 2441,
+ "stoned": 36248,
+ "stonehenge": 42417,
+ "stoner": 35131,
+ "stoner": 29115,
+ "stones": 42659,
+ "stones": 6885,
+ "stonewall": 39688,
+ "stoney": 44198,
+ "stony": 41717,
+ "stony": 35691,
+ "stoo": 24505,
+ "stood": 9151,
+ "stool": 34413,
+ "stool": 22314,
+ "stop": 6005,
+ "stop": 1691,
+ "stopbrexit": 48680,
+ "stopp": 15738,
+ "stopped": 6015,
+ "stopper": 32147,
+ "stoppers": 34457,
+ "stopping": 10735,
+ "stops": 9822,
+ "stopthe": 26463,
+ "stor": 809,
+ "stor": 17740,
+ "storage": 6824,
+ "store": 17769,
+ "store": 2183,
+ "stored": 28257,
+ "stores": 6370,
+ "storey": 24025,
+ "storians": 34628,
+ "stories": 3784,
+ "storing": 40087,
+ "stork": 46452,
+ "storm": 7434,
+ "storm": 2819,
+ "stormed": 45939,
+ "stormhour": 12161,
+ "storming": 24842,
+ "storms": 6464,
+ "stormtrooper": 49218,
+ "stormy": 20075,
+ "stors": 7178,
+ "story": 6512,
+ "story": 1134,
+ "storyline": 37079,
+ "storymonth": 23717,
+ "storyteller": 35882,
+ "storytelling": 14457,
+ "storytime": 44197,
+ "stos": 19281,
+ "stou": 37168,
+ "stour": 37361,
+ "stour": 21928,
+ "stout": 16550,
+ "stove": 21423,
+ "stow": 44284,
+ "stow": 17046,
+ "stowe": 34196,
+ "stown": 28071,
+ "stown": 7939,
+ "stp": 30576,
+ "stpatrick": 21343,
+ "stpatricksday": 22747,
+ "str": 807,
+ "str": 15913,
+ "stra": 1894,
+ "stra": 6253,
+ "strack": 46861,
+ "strada": 31134,
+ "strade": 48968,
+ "straigh": 31016,
+ "straight": 22114,
+ "straight": 4241,
+ "strain": 16887,
+ "strains": 38067,
+ "strait": 22946,
+ "straits": 41984,
+ "stral": 23289,
+ "stralia": 42510,
+ "stran": 18411,
+ "strand": 18214,
+ "strand": 17826,
+ "stranded": 22975,
+ "strang": 11138,
+ "strange": 33380,
+ "strange": 7288,
+ "strangely": 37566,
+ "stranger": 35541,
+ "stranger": 14149,
+ "strangers": 20684,
+ "strangerthings": 43271,
+ "strangest": 46740,
+ "strap": 13946,
+ "strapped": 40922,
+ "straps": 31213,
+ "stras": 36814,
+ "stras": 42125,
+ "strasbourg": 39576,
+ "strat": 11345,
+ "strat": 32925,
+ "strata": 47278,
+ "strate": 3532,
+ "strate": 28758,
+ "strategi": 49102,
+ "strategic": 10246,
+ "strategically": 45706,
+ "strategies": 9942,
+ "strategist": 37180,
+ "strategy": 5637,
+ "strates": 45724,
+ "stratford": 23955,
+ "strath": 21997,
+ "stration": 3156,
+ "strato": 28878,
+ "strauss": 32033,
+ "strava": 34625,
+ "stravel": 43494,
+ "straw": 7430,
+ "straw": 16438,
+ "strawberries": 17796,
+ "strawberry": 10233,
+ "straws": 33048,
+ "stray": 30784,
+ "stray": 15712,
+ "stre": 1079,
+ "stre": 19652,
+ "stread": 27797,
+ "streak": 11749,
+ "streaks": 42092,
+ "stream": 8659,
+ "stream": 3322,
+ "streamed": 26280,
+ "streamer": 25178,
+ "streamers": 19937,
+ "streaming": 6278,
+ "streamline": 44917,
+ "streams": 13545,
+ "stree": 35082,
+ "stree": 32438,
+ "streep": 38701,
+ "street": 4839,
+ "street": 2012,
+ "streetart": 12948,
+ "streetcar": 34268,
+ "streetfood": 44486,
+ "streetphotography": 20786,
+ "streets": 6058,
+ "streetstyle": 39118,
+ "streetwear": 37298,
+ "strel": 39685,
+ "stren": 4349,
+ "streng": 4472,
+ "strength": 15475,
+ "strength": 5959,
+ "strengthen": 16318,
+ "strengthened": 47131,
+ "strengthening": 23475,
+ "strengthens": 40280,
+ "strengths": 29268,
+ "stress": 17297,
+ "stress": 5843,
+ "stressed": 16497,
+ "stresses": 32112,
+ "stressful": 24268,
+ "stressing": 35917,
+ "stret": 12265,
+ "stretch": 10064,
+ "stretched": 29393,
+ "stretches": 32231,
+ "stretching": 24423,
+ "stri": 1493,
+ "stri": 27795,
+ "stria": 39620,
+ "strial": 30217,
+ "strian": 12924,
+ "stric": 2607,
+ "strick": 25181,
+ "strickland": 48939,
+ "strict": 21585,
+ "strictly": 16475,
+ "stride": 36024,
+ "strides": 37355,
+ "stries": 18171,
+ "strife": 46473,
+ "strike": 20774,
+ "strike": 5767,
+ "striker": 12448,
+ "strikers": 33465,
+ "strikes": 9280,
+ "striking": 13392,
+ "string": 25512,
+ "string": 9696,
+ "strings": 15699,
+ "strip": 9317,
+ "stripe": 19368,
+ "striped": 22192,
+ "stripes": 14239,
+ "stripped": 26602,
+ "stripper": 45759,
+ "stripping": 48588,
+ "strips": 19000,
+ "strive": 22140,
+ "striving": 37671,
+ "stro": 3121,
+ "stro": 6186,
+ "stroke": 44621,
+ "stroke": 10403,
+ "strokes": 26595,
+ "strol": 30123,
+ "stroll": 15924,
+ "stroller": 47076,
+ "strolling": 40911,
+ "strom": 14707,
+ "stron": 4165,
+ "strong": 10436,
+ "strong": 2389,
+ "stronger": 27760,
+ "stronger": 9245,
+ "strongertogether": 38532,
+ "strongest": 16171,
+ "strongh": 38678,
+ "strongly": 15507,
+ "strophy": 47912,
+ "strou": 48425,
+ "stroud": 39895,
+ "strous": 23752,
+ "stru": 1666,
+ "struc": 3311,
+ "struck": 10861,
+ "struction": 12497,
+ "structural": 16899,
+ "structure": 5285,
+ "structured": 27147,
+ "structures": 14171,
+ "structuring": 37496,
+ "strugg": 5176,
+ "struggle": 8443,
+ "struggled": 32921,
+ "struggles": 17446,
+ "struggling": 12135,
+ "struly": 34118,
+ "strum": 37632,
+ "strung": 46033,
+ "strust": 23920,
+ "strut": 48375,
+ "stry": 17325,
+ "stry": 2245,
+ "sts": 1088,
+ "stu": 858,
+ "stu": 23531,
+ "stuart": 32054,
+ "stuart": 11723,
+ "stub": 27066,
+ "stubborn": 38955,
+ "stuck": 6596,
+ "stud": 22368,
+ "stud": 13319,
+ "studded": 29153,
+ "studen": 44156,
+ "student": 14681,
+ "student": 2556,
+ "students": 1712,
+ "studi": 5691,
+ "studied": 21369,
+ "studies": 6426,
+ "studio": 17798,
+ "studio": 3155,
+ "studios": 6231,
+ "studs": 27571,
+ "study": 21051,
+ "study": 3123,
+ "studyabroad": 45425,
+ "studying": 8826,
+ "stuff": 46072,
+ "stuff": 3487,
+ "stuffed": 11781,
+ "stuffing": 31612,
+ "stuffs": 43455,
+ "stuk": 32424,
+ "stumb": 16784,
+ "stumble": 39045,
+ "stumbled": 21776,
+ "stump": 32064,
+ "stun": 3088,
+ "stun": 37959,
+ "stunned": 34034,
+ "stunner": 29965,
+ "stunning": 3769,
+ "stunningly": 47515,
+ "stuns": 43796,
+ "stunt": 19905,
+ "stunts": 40118,
+ "stupi": 18975,
+ "stupid": 42600,
+ "stupid": 8085,
+ "stupidity": 33766,
+ "stur": 10676,
+ "sturdy": 43780,
+ "stures": 27223,
+ "sturgeon": 31580,
+ "sturi": 21747,
+ "sturridge": 45331,
+ "stutt": 30444,
+ "stuttgart": 32219,
+ "stv": 27060,
+ "stv": 9708,
+ "stweet": 46832,
+ "stweets": 39174,
+ "stx": 42548,
+ "sty": 1421,
+ "sty": 2920,
+ "style": 12356,
+ "style": 1844,
+ "styled": 17974,
+ "styles": 6948,
+ "styli": 38577,
+ "styling": 14597,
+ "stylish": 10378,
+ "stylist": 15928,
+ "styn": 41394,
+ "su": 605,
+ "su": 2937,
+ "sua": 42448,
+ "suarez": 21437,
+ "suave": 47305,
+ "sub": 1783,
+ "sub": 7765,
+ "subaru": 21319,
+ "subjec": 16090,
+ "subject": 10300,
+ "subjects": 22099,
+ "subli": 16350,
+ "sublime": 22367,
+ "submarine": 19968,
+ "submer": 27156,
+ "submerged": 43171,
+ "submission": 16571,
+ "submissions": 21566,
+ "submit": 10423,
+ "submitted": 15189,
+ "submitting": 38788,
+ "subram": 49207,
+ "subs": 16398,
+ "subscri": 5838,
+ "subscribe": 9839,
+ "subscribed": 44867,
+ "subscriber": 36292,
+ "subscribers": 17337,
+ "subscription": 17979,
+ "subscriptions": 47162,
+ "subsequ": 33598,
+ "subsequent": 44323,
+ "subsi": 14856,
+ "subsidi": 45029,
+ "subsidiary": 45506,
+ "subsidies": 37685,
+ "subsidy": 47462,
+ "substan": 17487,
+ "substance": 19309,
+ "substances": 36834,
+ "substantial": 27171,
+ "substantially": 47577,
+ "substitu": 18529,
+ "substitute": 25340,
+ "subtitles": 39479,
+ "subtle": 16536,
+ "subur": 12517,
+ "suburb": 37664,
+ "suburban": 23570,
+ "suburbs": 25317,
+ "subway": 12196,
+ "suc": 1869,
+ "succe": 7981,
+ "succeed": 13556,
+ "succeeded": 41077,
+ "succes": 39019,
+ "success": 3695,
+ "success": 3034,
+ "successes": 29436,
+ "successful": 4670,
+ "successfully": 9934,
+ "succession": 38491,
+ "successive": 41319,
+ "successor": 34774,
+ "succu": 45253,
+ "succul": 25671,
+ "succulent": 35236,
+ "such": 2046,
+ "suction": 42786,
+ "sud": 8067,
+ "sud": 33714,
+ "sudan": 31149,
+ "sudan": 13474,
+ "sudanese": 42837,
+ "sudbury": 32488,
+ "sudden": 10833,
+ "sudden": 15433,
+ "suddenly": 11076,
+ "sue": 14045,
+ "sue": 6641,
+ "sued": 22225,
+ "suede": 21036,
+ "sues": 17105,
+ "suf": 21204,
+ "suf": 22579,
+ "sufc": 37091,
+ "suff": 4866,
+ "suffe": 13510,
+ "suffer": 13557,
+ "suffered": 14766,
+ "suffering": 10140,
+ "suffers": 22389,
+ "sufficient": 28410,
+ "suffol": 13775,
+ "suffolk": 46408,
+ "suffolk": 15685,
+ "suffra": 34596,
+ "suffrage": 39567,
+ "sufi": 39756,
+ "sug": 3189,
+ "suga": 28757,
+ "sugar": 12418,
+ "sugar": 5574,
+ "sugge": 6345,
+ "suggest": 13356,
+ "suggested": 18790,
+ "suggesti": 15033,
+ "suggesting": 29792,
+ "suggestion": 23741,
+ "suggestions": 16052,
+ "suggests": 13333,
+ "suho": 32744,
+ "sui": 24972,
+ "suici": 16372,
+ "suicidal": 37165,
+ "suicide": 31310,
+ "suicide": 8247,
+ "suing": 18309,
+ "suisse": 35964,
+ "suit": 11887,
+ "suit": 3940,
+ "suitable": 17476,
+ "suitcase": 27792,
+ "suite": 9346,
+ "suited": 25919,
+ "suites": 21523,
+ "suits": 9949,
+ "suk": 24820,
+ "suk": 6886,
+ "suka": 44017,
+ "suke": 25590,
+ "sukh": 46961,
+ "suki": 32704,
+ "sul": 1767,
+ "sul": 19879,
+ "sula": 34713,
+ "sula": 26143,
+ "sullivan": 14477,
+ "sully": 37752,
+ "sulph": 37234,
+ "sulphur": 47659,
+ "sultan": 35650,
+ "sultan": 17049,
+ "sum": 7054,
+ "sum": 8257,
+ "suma": 47938,
+ "sumat": 32640,
+ "sumatra": 47346,
+ "sume": 45457,
+ "sumi": 41248,
+ "summ": 1309,
+ "summar": 34657,
+ "summari": 31993,
+ "summary": 13435,
+ "summed": 34912,
+ "summer": 5500,
+ "summer": 1673,
+ "summers": 18254,
+ "summerslam": 40264,
+ "summertime": 19025,
+ "summit": 30011,
+ "summit": 3768,
+ "summon": 27622,
+ "summon": 39782,
+ "sumner": 46813,
+ "sumo": 33734,
+ "sump": 34252,
+ "sumptuous": 47354,
+ "sums": 13325,
+ "sun": 968,
+ "sun": 2176,
+ "sunbathing": 46994,
+ "sunburn": 45767,
+ "sund": 40735,
+ "sundae": 38078,
+ "sundance": 24128,
+ "sundar": 44936,
+ "sunday": 6649,
+ "sunday": 1706,
+ "sundayfunday": 21565,
+ "sundaymorning": 24809,
+ "sundaymotivation": 46227,
+ "sundays": 15827,
+ "sundaywith": 26469,
+ "sundaywithmarsha": 26662,
+ "sunder": 15097,
+ "sunderland": 45727,
+ "sunderland": 18851,
+ "sundown": 44438,
+ "sune": 41096,
+ "sunflower": 21559,
+ "sunflowers": 39809,
+ "sung": 16903,
+ "sung": 6047,
+ "sunglasses": 12906,
+ "suni": 17663,
+ "suni": 47010,
+ "sunil": 32861,
+ "sunite": 21382,
+ "sunited": 35276,
+ "sunk": 37534,
+ "sunken": 43473,
+ "sunlight": 17996,
+ "sunni": 44315,
+ "sunny": 15632,
+ "sunny": 5438,
+ "sunrise": 5610,
+ "suns": 18322,
+ "sunscreen": 29355,
+ "sunset": 37880,
+ "sunset": 3424,
+ "sunsets": 17721,
+ "sunshine": 32761,
+ "sunshine": 5385,
+ "suny": 41308,
+ "sup": 19078,
+ "sup": 8249,
+ "supdates": 24177,
+ "super": 1642,
+ "super": 1994,
+ "superb": 8930,
+ "superbike": 45709,
+ "superbowl": 47461,
+ "superbowl": 16467,
+ "supercar": 27021,
+ "supercars": 32185,
+ "supercell": 43227,
+ "supercharged": 47479,
+ "supere": 46831,
+ "superfood": 41715,
+ "supergirl": 25771,
+ "superhero": 14049,
+ "superheroes": 23334,
+ "superint": 17615,
+ "superintendent": 19020,
+ "superior": 13205,
+ "superjunior": 40475,
+ "superleague": 45539,
+ "superman": 11237,
+ "supermarket": 19897,
+ "supermarkets": 45106,
+ "supermodel": 41963,
+ "supermoon": 36571,
+ "supernatural": 15484,
+ "supernova": 39843,
+ "superrugby": 48717,
+ "supersonic": 42019,
+ "supersport": 46319,
+ "superst": 38202,
+ "superstar": 32551,
+ "superstar": 10472,
+ "superstars": 25797,
+ "supervis": 12709,
+ "supervised": 41316,
+ "supervision": 36234,
+ "supervisor": 20366,
+ "supervisors": 37958,
+ "superyacht": 42714,
+ "supp": 1023,
+ "supper": 15727,
+ "supple": 31431,
+ "supplement": 19924,
+ "supplements": 21265,
+ "supplied": 24106,
+ "supplier": 18043,
+ "suppliers": 24196,
+ "supplies": 9384,
+ "supply": 25074,
+ "supply": 6389,
+ "supplychain": 31224,
+ "supplying": 32739,
+ "suppo": 6941,
+ "suppor": 2104,
+ "support": 12062,
+ "support": 1425,
+ "supported": 8038,
+ "supporter": 12992,
+ "supporters": 7403,
+ "supportindiefilm": 43976,
+ "supporting": 3976,
+ "supportive": 18313,
+ "supportlocal": 43852,
+ "supports": 8336,
+ "supportsmall": 30941,
+ "supportsmallstreamers": 36097,
+ "suppose": 18924,
+ "supposed": 9119,
+ "supposedly": 32302,
+ "suppre": 20542,
+ "suppression": 36508,
+ "supra": 48485,
+ "supre": 5875,
+ "supremac": 28643,
+ "supremacist": 39005,
+ "supremacy": 28913,
+ "supreme": 35222,
+ "supreme": 7468,
+ "supt": 23625,
+ "sur": 1090,
+ "sur": 7123,
+ "sura": 33412,
+ "sura": 49125,
+ "surabaya": 45227,
+ "surance": 22184,
+ "surat": 30201,
+ "sure": 14320,
+ "sure": 1650,
+ "sured": 36869,
+ "surely": 11409,
+ "sures": 12725,
+ "suresh": 32118,
+ "suresh": 31464,
+ "sureshpp": 41924,
+ "sureshpprabhu": 42050,
+ "surf": 10176,
+ "surf": 10322,
+ "surface": 7744,
+ "surfaces": 20746,
+ "surfer": 24925,
+ "surfers": 34842,
+ "surfing": 15762,
+ "surg": 13045,
+ "surge": 17457,
+ "surgeon": 16039,
+ "surgeons": 26000,
+ "surger": 5122,
+ "surgeries": 34940,
+ "surgery": 5344,
+ "surgical": 16386,
+ "suri": 14130,
+ "suri": 33952,
+ "suring": 16817,
+ "suriya": 17832,
+ "surpass": 45494,
+ "surpassed": 25648,
+ "surplus": 29413,
+ "surpri": 3244,
+ "surprise": 5099,
+ "surprised": 8949,
+ "surprises": 16920,
+ "surprising": 14964,
+ "surprisingly": 17367,
+ "surreal": 18408,
+ "surrealism": 41773,
+ "surrender": 20964,
+ "surrendered": 44601,
+ "surrey": 26489,
+ "surrey": 14315,
+ "surro": 47499,
+ "surroun": 8250,
+ "surround": 26543,
+ "surround": 22999,
+ "surrounded": 13589,
+ "surrounding": 12544,
+ "surroundings": 26915,
+ "surrounds": 39012,
+ "suru": 49240,
+ "surve": 8952,
+ "surveill": 15408,
+ "surveillance": 15578,
+ "survey": 45914,
+ "survey": 6809,
+ "surveying": 33085,
+ "surveys": 25096,
+ "survi": 3440,
+ "surviv": 12922,
+ "survival": 10172,
+ "survive": 10431,
+ "survived": 13483,
+ "survives": 30927,
+ "surviving": 18609,
+ "survivor": 31934,
+ "survivor": 10944,
+ "survivors": 13711,
+ "surya": 37767,
+ "sus": 8091,
+ "sus": 3036,
+ "susa": 20546,
+ "susan": 19922,
+ "susan": 10168,
+ "suscep": 44270,
+ "sush": 22298,
+ "sushi": 11729,
+ "sushmaswar": 48200,
+ "susie": 32284,
+ "susp": 7971,
+ "suspec": 10298,
+ "suspect": 9065,
+ "suspected": 15579,
+ "suspects": 18265,
+ "suspen": 10578,
+ "suspend": 41007,
+ "suspended": 13126,
+ "suspends": 39535,
+ "suspense": 21556,
+ "suspension": 15417,
+ "suspici": 25714,
+ "suspicion": 34910,
+ "suspicious": 19862,
+ "sussex": 31244,
+ "sussex": 13266,
+ "sustain": 4644,
+ "sustain": 28156,
+ "sustainability": 9635,
+ "sustainable": 23645,
+ "sustainable": 7078,
+ "sustained": 22699,
+ "sustaining": 44418,
+ "sut": 23984,
+ "sut": 28956,
+ "sutherland": 27592,
+ "sutton": 39359,
+ "sutton": 18564,
+ "suv": 15985,
+ "suz": 9957,
+ "suzanne": 24617,
+ "suzu": 36289,
+ "suzuki": 16892,
+ "suzy": 26552,
+ "sv": 6508,
+ "sv": 17083,
+ "svc": 45065,
+ "sve": 47637,
+ "sven": 37786,
+ "sven": 45183,
+ "sver": 45923,
+ "sville": 44580,
+ "sville": 6741,
+ "svp": 28465,
+ "svt": 42014,
+ "svu": 32123,
+ "sw": 1220,
+ "sw": 4457,
+ "swa": 4707,
+ "swa": 31916,
+ "swach": 20862,
+ "swachhb": 31898,
+ "swachhbharat": 36927,
+ "swag": 8852,
+ "swag": 8177,
+ "swagg": 47702,
+ "swagger": 35797,
+ "swain": 43226,
+ "swal": 13433,
+ "swallow": 28979,
+ "swallowed": 46956,
+ "swallows": 45124,
+ "swam": 42539,
+ "swami": 25021,
+ "swamp": 41953,
+ "swamp": 16595,
+ "swamy": 28445,
+ "swan": 8215,
+ "swan": 12530,
+ "swana": 24699,
+ "swans": 19516,
+ "swansea": 16567,
+ "swanson": 34797,
+ "swap": 15234,
+ "swapped": 39077,
+ "swapping": 44702,
+ "swaps": 49242,
+ "swar": 11680,
+ "swarm": 31577,
+ "swarovski": 28515,
+ "swat": 32547,
+ "swat": 26482,
+ "swatch": 48053,
+ "sway": 26443,
+ "sway": 26617,
+ "swc": 42231,
+ "swe": 2350,
+ "swe": 38070,
+ "swear": 7406,
+ "swearing": 32627,
+ "sweat": 10282,
+ "sweat": 12663,
+ "sweater": 11455,
+ "sweaters": 31303,
+ "sweating": 33215,
+ "sweats": 39321,
+ "sweatshirt": 22442,
+ "sweaty": 28419,
+ "sweden": 8760,
+ "swedish": 11585,
+ "swee": 1812,
+ "sweek": 30017,
+ "sweeney": 27286,
+ "sweep": 23220,
+ "sweep": 13669,
+ "sweeping": 25719,
+ "sweeps": 26887,
+ "sweepstakes": 25992,
+ "sweet": 10957,
+ "sweet": 2418,
+ "sweetened": 45577,
+ "sweeter": 32873,
+ "sweetest": 15180,
+ "sweethe": 16316,
+ "sweetheart": 18079,
+ "sweetie": 24450,
+ "sweetness": 29713,
+ "sweets": 18045,
+ "swel": 48470,
+ "swell": 35538,
+ "swell": 21490,
+ "swelling": 46578,
+ "swept": 23311,
+ "swer": 30514,
+ "swfc": 30227,
+ "swfl": 46607,
+ "swi": 3881,
+ "swi": 45223,
+ "swick": 17159,
+ "swif": 28548,
+ "swift": 34843,
+ "swift": 8229,
+ "swild": 33909,
+ "swild": 38696,
+ "swildlife": 46818,
+ "swim": 4928,
+ "swim": 7681,
+ "swimmer": 25475,
+ "swimmers": 27776,
+ "swimming": 7411,
+ "swims": 46798,
+ "swimsuit": 25504,
+ "swimwear": 31889,
+ "swin": 14554,
+ "swin": 40798,
+ "swindon": 29540,
+ "swine": 31166,
+ "swing": 25292,
+ "swing": 7429,
+ "swinging": 26760,
+ "swings": 29141,
+ "swipe": 31828,
+ "swire": 42753,
+ "swirl": 35795,
+ "swis": 23611,
+ "swish": 38571,
+ "swiss": 37917,
+ "swiss": 9287,
+ "swit": 3726,
+ "switch": 22480,
+ "switch": 5893,
+ "switched": 22869,
+ "switches": 33569,
+ "switching": 21155,
+ "swith": 17299,
+ "switzer": 9835,
+ "switzerland": 9912,
+ "swivel": 48256,
+ "swo": 38673,
+ "swol": 29575,
+ "swollen": 36129,
+ "swoo": 29744,
+ "swood": 24158,
+ "swoon": 37028,
+ "swoop": 45661,
+ "sword": 33294,
+ "sword": 11356,
+ "swords": 27181,
+ "swork": 42722,
+ "sworld": 33305,
+ "sworn": 21130,
+ "sworth": 13322,
+ "swt": 38878,
+ "swx": 20597,
+ "sx": 9402,
+ "sx": 17806,
+ "sxsw": 13369,
+ "sy": 974,
+ "sy": 2126,
+ "sya": 35017,
+ "sycam": 34911,
+ "sycamore": 43086,
+ "syd": 4525,
+ "syd": 22504,
+ "sydney": 15878,
+ "sydney": 5278,
+ "syed": 27624,
+ "syfy": 32047,
+ "sykes": 27287,
+ "syl": 6452,
+ "sylla": 41708,
+ "sylvania": 12011,
+ "sylve": 28369,
+ "sylvester": 37214,
+ "sylvia": 25670,
+ "sym": 3645,
+ "sym": 40327,
+ "symb": 22987,
+ "symbol": 13085,
+ "symboli": 22019,
+ "symbolic": 33177,
+ "symbolism": 44679,
+ "symbols": 25476,
+ "symmetry": 31427,
+ "symp": 11468,
+ "sympathi": 47493,
+ "sympathy": 32477,
+ "symph": 9544,
+ "symphonic": 42639,
+ "symphony": 11180,
+ "sympo": 9730,
+ "symposium": 9971,
+ "symptom": 47799,
+ "symptoms": 12956,
+ "syn": 3758,
+ "syn": 36090,
+ "synago": 30945,
+ "synagogue": 33518,
+ "sync": 20081,
+ "synchron": 23943,
+ "syndic": 21098,
+ "syndicate": 28779,
+ "syndrome": 10927,
+ "syner": 22283,
+ "synergy": 32012,
+ "syno": 31533,
+ "synod": 47712,
+ "synopsis": 47018,
+ "synth": 33841,
+ "synth": 24462,
+ "synthe": 22604,
+ "synthesi": 33565,
+ "synthesis": 21602,
+ "synthesizer": 44077,
+ "synthetic": 19917,
+ "syou": 26742,
+ "syour": 21718,
+ "syrac": 17279,
+ "syracuse": 19640,
+ "syrah": 45364,
+ "syri": 18917,
+ "syria": 5563,
+ "syrian": 47562,
+ "syrian": 10041,
+ "syrians": 41392,
+ "syrup": 16611,
+ "sys": 26726,
+ "syste": 1933,
+ "system": 47813,
+ "system": 2422,
+ "systematic": 28586,
+ "systemic": 33807,
+ "systems": 4828,
+ "sz": 13438,
+ "sz": 15879,
+ "sze": 44507,
+ "szn": 48092,
+ "são": 45911,
+ "sé": 37879,
+ "t": 83,
+ "t": 339,
+ "ta": 648,
+ "ta": 1397,
+ "taa": 43874,
+ "tab": 2648,
+ "tab": 14724,
+ "tabby": 36145,
+ "tabern": 48991,
+ "tability": 15770,
+ "table": 12108,
+ "table": 2175,
+ "tableau": 39723,
+ "tables": 7822,
+ "tablet": 12494,
+ "tabletop": 46843,
+ "tabletop": 25773,
+ "tablets": 20436,
+ "tably": 24440,
+ "taboo": 38400,
+ "tabs": 29163,
+ "tac": 3145,
+ "tac": 22653,
+ "tache": 39239,
+ "tack": 6339,
+ "tack": 34446,
+ "tackle": 10294,
+ "tackled": 47218,
+ "tackles": 18021,
+ "tackling": 19628,
+ "taco": 31924,
+ "taco": 12436,
+ "tacoma": 25397,
+ "tacos": 14090,
+ "tactic": 40377,
+ "tactical": 17137,
+ "tactics": 16410,
+ "tacular": 48985,
+ "tad": 15890,
+ "tad": 19860,
+ "tado": 40846,
+ "tae": 15257,
+ "tae": 15580,
+ "taehyung": 24642,
+ "taek": 30753,
+ "taekwondo": 39963,
+ "taemin": 30600,
+ "taeyang": 45802,
+ "taeyeon": 27389,
+ "taf": 29660,
+ "taft": 42141,
+ "tag": 3456,
+ "tag": 3640,
+ "tage": 2669,
+ "tages": 39902,
+ "tagged": 12969,
+ "tagging": 25138,
+ "tagne": 47467,
+ "tags": 11606,
+ "tah": 14822,
+ "tah": 7090,
+ "tahit": 45385,
+ "tahoe": 26140,
+ "tai": 6511,
+ "tai": 13040,
+ "taiji": 30185,
+ "tail": 7156,
+ "tail": 4132,
+ "tailed": 20626,
+ "tailgate": 23168,
+ "tailgating": 42625,
+ "tailo": 27230,
+ "tailor": 29870,
+ "tailored": 28275,
+ "tailoring": 46357,
+ "tails": 16066,
+ "tain": 2841,
+ "tain": 1908,
+ "taine": 21214,
+ "taine": 32299,
+ "tained": 10212,
+ "taining": 7565,
+ "tainment": 30063,
+ "tains": 3952,
+ "tainted": 47211,
+ "taipei": 24356,
+ "tair": 29143,
+ "tairp": 43707,
+ "tait": 45325,
+ "taiwan": 36319,
+ "taiwan": 12626,
+ "taiwanese": 41416,
+ "taj": 28937,
+ "taj": 24805,
+ "taji": 46358,
+ "tak": 15070,
+ "tak": 14458,
+ "taka": 24070,
+ "taka": 40968,
+ "take": 5052,
+ "take": 1172,
+ "takeaway": 25737,
+ "takeaways": 32080,
+ "takeme": 41748,
+ "taken": 2807,
+ "takeoff": 32789,
+ "takeover": 11863,
+ "taker": 17939,
+ "takers": 30775,
+ "takes": 2633,
+ "takin": 30890,
+ "taking": 2019,
+ "taku": 48168,
+ "tal": 976,
+ "tal": 2066,
+ "tala": 29845,
+ "talaga": 35349,
+ "talbot": 30585,
+ "tale": 33971,
+ "tale": 7798,
+ "talent": 30435,
+ "talent": 5114,
+ "talented": 5331,
+ "talents": 16136,
+ "tales": 9469,
+ "tali": 12122,
+ "tali": 45406,
+ "taliban": 20788,
+ "talis": 36480,
+ "tality": 15631,
+ "talk": 12462,
+ "talk": 1841,
+ "talked": 10153,
+ "talkin": 26040,
+ "talking": 31463,
+ "talking": 2578,
+ "talks": 3237,
+ "tall": 11664,
+ "tall": 7771,
+ "talla": 21528,
+ "tallade": 44220,
+ "tallahassee": 37832,
+ "taller": 23470,
+ "tallest": 19774,
+ "tallinn": 45079,
+ "tally": 16323,
+ "talon": 47897,
+ "tam": 2661,
+ "tam": 12246,
+ "tama": 45424,
+ "tamanna": 48055,
+ "tamar": 22901,
+ "tamara": 35697,
+ "tame": 38557,
+ "tame": 32778,
+ "tamed": 40575,
+ "tami": 39429,
+ "tamil": 23046,
+ "tamil": 14033,
+ "tamilnadu": 32371,
+ "tamine": 42566,
+ "tammy": 28396,
+ "tampa": 10906,
+ "tampab": 37852,
+ "tamu": 34105,
+ "tan": 2123,
+ "tan": 5039,
+ "tana": 21396,
+ "tand": 20244,
+ "tandem": 33756,
+ "tane": 13344,
+ "tane": 24923,
+ "taneous": 22275,
+ "taneously": 24422,
+ "tang": 10425,
+ "tang": 20794,
+ "tanger": 31844,
+ "tangerine": 42045,
+ "tangible": 44823,
+ "tangle": 36568,
+ "tangled": 33587,
+ "tango": 24089,
+ "tani": 31374,
+ "tani": 32985,
+ "tania": 45369,
+ "tank": 29858,
+ "tank": 6172,
+ "tanker": 25020,
+ "tanks": 14223,
+ "tann": 19174,
+ "tanner": 22001,
+ "tanning": 27985,
+ "tans": 27332,
+ "tant": 41383,
+ "tant": 41695,
+ "tante": 48262,
+ "tanto": 45685,
+ "tany": 34410,
+ "tanya": 26800,
+ "tanz": 47399,
+ "tanzania": 15711,
+ "tao": 29084,
+ "tao": 18923,
+ "tap": 17923,
+ "tap": 7888,
+ "tapas": 27361,
+ "tape": 18332,
+ "tape": 5749,
+ "taped": 33219,
+ "tapes": 17903,
+ "tapestry": 33525,
+ "taping": 24355,
+ "tapp": 27644,
+ "tapp": 27764,
+ "tapped": 26649,
+ "tapping": 27882,
+ "tapro": 34415,
+ "taproom": 40266,
+ "taps": 23267,
+ "tar": 2002,
+ "tar": 6977,
+ "tara": 15264,
+ "tarak": 37813,
+ "taran": 32370,
+ "tarantino": 41180,
+ "tarde": 48670,
+ "tardis": 35410,
+ "tares": 34587,
+ "targe": 9620,
+ "target": 38556,
+ "target": 5400,
+ "targeted": 14968,
+ "targeting": 15818,
+ "targets": 12468,
+ "tari": 4238,
+ "tari": 38012,
+ "tarian": 11762,
+ "tarians": 42789,
+ "taries": 47291,
+ "tariff": 40220,
+ "tariffs": 28335,
+ "tariq": 42526,
+ "tarmac": 44294,
+ "taro": 26264,
+ "tarot": 23702,
+ "tart": 16707,
+ "tart": 14120,
+ "tartan": 35064,
+ "tarts": 29799,
+ "tary": 31729,
+ "tary": 5065,
+ "tarzan": 45463,
+ "tas": 6538,
+ "tas": 10163,
+ "tash": 35272,
+ "tasha": 44967,
+ "task": 39189,
+ "task": 10549,
+ "tasks": 19453,
+ "tasmania": 22429,
+ "tasmanian": 45102,
+ "tassel": 49276,
+ "tast": 10839,
+ "taste": 14314,
+ "taste": 5219,
+ "tasted": 22827,
+ "tasteof": 38097,
+ "taster": 29743,
+ "tastes": 13736,
+ "tastic": 21337,
+ "tasting": 7656,
+ "tastings": 49273,
+ "tasty": 43390,
+ "tasty": 8568,
+ "tat": 2652,
+ "tat": 21592,
+ "tata": 19300,
+ "tate": 44476,
+ "tate": 13295,
+ "tath": 27566,
+ "tati": 31433,
+ "tatiana": 48837,
+ "tation": 5280,
+ "tations": 32324,
+ "tator": 18791,
+ "tators": 37206,
+ "tats": 44557,
+ "tatt": 9232,
+ "tatted": 41605,
+ "tattoo": 15980,
+ "tattoo": 6325,
+ "tattooed": 28541,
+ "tattoos": 14900,
+ "tatum": 26103,
+ "tau": 6620,
+ "tau": 20510,
+ "taught": 9306,
+ "taun": 23910,
+ "taunton": 40681,
+ "taurus": 32881,
+ "taver": 37776,
+ "tavern": 18644,
+ "taw": 33868,
+ "taw": 40289,
+ "tawa": 29035,
+ "tawards": 14351,
+ "tax": 4581,
+ "tax": 3879,
+ "taxation": 36847,
+ "taxes": 11462,
+ "taxi": 25160,
+ "taxi": 11380,
+ "taxider": 47420,
+ "taxis": 34009,
+ "taxpay": 17986,
+ "taxpayer": 30978,
+ "taxpayers": 25503,
+ "tay": 6542,
+ "tay": 15073,
+ "taya": 38484,
+ "tayl": 3913,
+ "taylor": 9044,
+ "taylor": 3961,
+ "taylorswift": 18936,
+ "tayo": 33941,
+ "taz": 41475,
+ "taz": 31870,
+ "tb": 1990,
+ "tb": 7490,
+ "tba": 34363,
+ "tball": 8390,
+ "tball": 1467,
+ "tbc": 31807,
+ "tbd": 45548,
+ "tbh": 13238,
+ "tbi": 45868,
+ "tbl": 42962,
+ "tbli": 43664,
+ "tblightning": 44178,
+ "tbo": 34255,
+ "tbr": 46643,
+ "tbs": 37368,
+ "tbt": 2950,
+ "tc": 6820,
+ "tc": 5454,
+ "tca": 35116,
+ "tch": 10744,
+ "tch": 4048,
+ "tches": 42001,
+ "tcm": 21501,
+ "tcm": 26588,
+ "tcmparty": 24338,
+ "tcot": 8995,
+ "tcs": 39107,
+ "tcu": 26791,
+ "td": 20578,
+ "td": 3192,
+ "tdf": 21844,
+ "tdi": 45621,
+ "tdp": 47009,
+ "tds": 20238,
+ "tdsb": 29836,
+ "te": 600,
+ "te": 756,
+ "tea": 41053,
+ "tea": 3274,
+ "teach": 2043,
+ "teach": 6865,
+ "teacher": 18051,
+ "teacher": 4008,
+ "teachers": 5069,
+ "teaches": 17110,
+ "teaching": 5141,
+ "teachings": 32119,
+ "teal": 22821,
+ "team": 2085,
+ "team": 1027,
+ "teamcanada": 46636,
+ "teamed": 20590,
+ "teamgb": 40971,
+ "teaming": 24392,
+ "teammate": 17900,
+ "teammates": 13921,
+ "teams": 3891,
+ "teamsisd": 34703,
+ "teamusa": 28625,
+ "teamwork": 14657,
+ "teaparty": 33065,
+ "teapo": 35745,
+ "teapot": 40749,
+ "tear": 15802,
+ "tear": 11862,
+ "tearful": 46873,
+ "tearing": 24785,
+ "tears": 7688,
+ "teas": 23003,
+ "teas": 29314,
+ "tease": 25163,
+ "teased": 49122,
+ "teaser": 8982,
+ "teasers": 48990,
+ "teases": 28509,
+ "teasing": 36507,
+ "teat": 26376,
+ "teatime": 48948,
+ "teatro": 35756,
+ "teau": 24931,
+ "tebow": 37797,
+ "tec": 17381,
+ "tec": 11612,
+ "tech": 1782,
+ "tech": 2061,
+ "techcrunch": 42110,
+ "techn": 6252,
+ "technews": 31787,
+ "technic": 16639,
+ "technic": 37666,
+ "technical": 49231,
+ "technical": 7582,
+ "technically": 23180,
+ "technician": 22540,
+ "technicians": 35513,
+ "techno": 2599,
+ "techno": 17564,
+ "technological": 23068,
+ "technologies": 10040,
+ "technology": 3089,
+ "techs": 41353,
+ "ted": 4841,
+ "ted": 775,
+ "tedcruz": 27517,
+ "teddy": 25758,
+ "teddy": 11798,
+ "tedly": 8539,
+ "tedu": 42517,
+ "tedx": 17950,
+ "tedx": 41504,
+ "tee": 12676,
+ "tee": 3385,
+ "teed": 13692,
+ "teen": 5398,
+ "teen": 4697,
+ "teenage": 14069,
+ "teenager": 19338,
+ "teenagers": 25989,
+ "teenchoice": 28203,
+ "teens": 12375,
+ "teenth": 20249,
+ "teenwolf": 40067,
+ "teeny": 41622,
+ "teer": 48648,
+ "tees": 9641,
+ "teessi": 43295,
+ "teeth": 8225,
+ "tega": 29508,
+ "tegr": 39801,
+ "teh": 18720,
+ "teh": 29601,
+ "tehran": 26399,
+ "tein": 33223,
+ "tej": 46724,
+ "tek": 17489,
+ "tek": 18294,
+ "tekken": 29843,
+ "tel": 4978,
+ "tel": 2226,
+ "telang": 23469,
+ "telangana": 26386,
+ "tele": 3103,
+ "tele": 32851,
+ "telecom": 21057,
+ "telecommunications": 39900,
+ "telegram": 26780,
+ "telegraph": 14713,
+ "telephone": 17243,
+ "telescope": 19037,
+ "telethon": 49266,
+ "televised": 39470,
+ "television": 8608,
+ "telford": 38323,
+ "tell": 16069,
+ "tell": 2330,
+ "teller": 20415,
+ "tellers": 42707,
+ "telling": 5507,
+ "tells": 5217,
+ "tellu": 42511,
+ "telly": 31475,
+ "tels": 43607,
+ "telugu": 22927,
+ "tely": 5630,
+ "tem": 2404,
+ "tem": 17536,
+ "tema": 45881,
+ "teme": 43378,
+ "temp": 2684,
+ "temp": 11097,
+ "tempe": 36723,
+ "temper": 5981,
+ "temper": 35521,
+ "temperature": 9543,
+ "temperatures": 11575,
+ "tempered": 40521,
+ "tempest": 36053,
+ "templ": 16679,
+ "template": 18591,
+ "templates": 30498,
+ "temple": 21841,
+ "temple": 5620,
+ "temples": 24024,
+ "tempo": 19625,
+ "tempor": 4858,
+ "temporal": 43656,
+ "temporarily": 23189,
+ "temporary": 6513,
+ "temps": 11668,
+ "tempt": 28460,
+ "temptation": 30118,
+ "tempted": 26226,
+ "tempting": 34876,
+ "ten": 1149,
+ "ten": 2581,
+ "tenant": 16954,
+ "tenants": 26023,
+ "tenay": 45384,
+ "tenberg": 31329,
+ "tend": 17630,
+ "tend": 21252,
+ "tendency": 47277,
+ "tender": 23020,
+ "tender": 9838,
+ "tenderloin": 42750,
+ "tenders": 44741,
+ "tending": 35084,
+ "tendon": 48459,
+ "tends": 39962,
+ "tene": 24868,
+ "tened": 13682,
+ "tener": 29054,
+ "teneri": 28000,
+ "tenerife": 29401,
+ "teners": 41307,
+ "teness": 18018,
+ "teng": 34016,
+ "teng": 28474,
+ "tennant": 29310,
+ "tennes": 9514,
+ "tennessee": 10053,
+ "tennis": 31504,
+ "tennis": 5298,
+ "tenor": 30521,
+ "tens": 14062,
+ "tense": 23518,
+ "tension": 15221,
+ "tensions": 24224,
+ "tenstein": 49139,
+ "tent": 18505,
+ "tent": 10782,
+ "tentative": 48238,
+ "tenth": 27483,
+ "tention": 12191,
+ "tents": 30730,
+ "tenure": 30739,
+ "teo": 18665,
+ "tep": 31806,
+ "tequ": 17502,
+ "tequila": 18510,
+ "ter": 704,
+ "ter": 652,
+ "tera": 15155,
+ "teras": 44830,
+ "tere": 11329,
+ "tered": 49272,
+ "tered": 4389,
+ "terence": 33806,
+ "teresa": 19081,
+ "teri": 30917,
+ "teria": 22685,
+ "terie": 42276,
+ "tering": 7929,
+ "term": 40991,
+ "term": 4780,
+ "termin": 4766,
+ "terminal": 11816,
+ "terminals": 44091,
+ "terminator": 29609,
+ "terminology": 48896,
+ "terms": 8663,
+ "tern": 41572,
+ "tern": 12959,
+ "terns": 25251,
+ "tero": 20727,
+ "tero": 24697,
+ "terps": 41471,
+ "terr": 3921,
+ "terra": 22366,
+ "terra": 18816,
+ "terrac": 28549,
+ "terrace": 13820,
+ "terraces": 47508,
+ "terracotta": 45123,
+ "terrain": 20184,
+ "terran": 43726,
+ "terre": 33888,
+ "terre": 27537,
+ "terrell": 39494,
+ "terrence": 38746,
+ "terrestrial": 46299,
+ "terri": 4504,
+ "terri": 36722,
+ "terrible": 9741,
+ "terribly": 34558,
+ "terrier": 14455,
+ "terriers": 47047,
+ "terrific": 13837,
+ "terrified": 28204,
+ "terrifying": 18526,
+ "territ": 10720,
+ "territorial": 39163,
+ "territories": 32846,
+ "territory": 13936,
+ "terror": 9596,
+ "terror": 9327,
+ "terrori": 6836,
+ "terrorism": 10583,
+ "terrorist": 10575,
+ "terrorists": 12835,
+ "terry": 19378,
+ "terry": 8561,
+ "ters": 24102,
+ "ters": 1737,
+ "terti": 48386,
+ "tery": 4184,
+ "tes": 8019,
+ "tes": 3609,
+ "tesco": 15434,
+ "tese": 33320,
+ "tesla": 12254,
+ "tess": 21807,
+ "tess": 20840,
+ "tessa": 32063,
+ "test": 7738,
+ "test": 1628,
+ "testam": 23477,
+ "testament": 24609,
+ "tested": 10576,
+ "tester": 32707,
+ "testi": 18373,
+ "testic": 42364,
+ "testify": 33088,
+ "testifying": 46347,
+ "testim": 12553,
+ "testimonial": 28834,
+ "testimony": 18672,
+ "testing": 4967,
+ "testo": 42428,
+ "testosterone": 45168,
+ "tests": 8715,
+ "tet": 40468,
+ "tet": 13275,
+ "tetra": 40902,
+ "tetris": 45934,
+ "teu": 47152,
+ "teuk": 39979,
+ "teur": 27120,
+ "tex": 2056,
+ "tex": 11728,
+ "texan": 35287,
+ "texan": 38386,
+ "texans": 17580,
+ "texanscheer": 43717,
+ "texas": 15713,
+ "texas": 3403,
+ "texaste": 46469,
+ "text": 18169,
+ "text": 4160,
+ "textbook": 25952,
+ "textbooks": 44041,
+ "texted": 29004,
+ "textile": 19789,
+ "textiles": 24326,
+ "texting": 18600,
+ "texts": 12767,
+ "texture": 16505,
+ "textured": 32168,
+ "textures": 28063,
+ "tey": 32395,
+ "tez": 22664,
+ "tf": 18828,
+ "tf": 5001,
+ "tfc": 30186,
+ "tfl": 29918,
+ "tford": 22493,
+ "tful": 17108,
+ "tfw": 16741,
+ "tg": 7665,
+ "tg": 11981,
+ "tgif": 14483,
+ "th": 513,
+ "th": 640,
+ "tha": 18470,
+ "tha": 4715,
+ "thab": 38219,
+ "thad": 48339,
+ "thai": 28054,
+ "thai": 8825,
+ "thail": 7258,
+ "thailand": 7469,
+ "thak": 22801,
+ "thakur": 38427,
+ "thal": 7967,
+ "thal": 12323,
+ "thala": 17784,
+ "thalai": 25206,
+ "thalaivar": 44918,
+ "thalap": 39789,
+ "thalapathy": 45405,
+ "thalapathy": 23324,
+ "thall": 36007,
+ "tham": 11761,
+ "tham": 8896,
+ "thames": 43472,
+ "thames": 15321,
+ "than": 792,
+ "than": 1126,
+ "thand": 44465,
+ "thane": 21463,
+ "thang": 24870,
+ "thani": 31322,
+ "thank": 2790,
+ "thank": 1144,
+ "thanked": 32079,
+ "thankful": 38839,
+ "thankful": 6217,
+ "thankfully": 22089,
+ "thanking": 21989,
+ "thanks": 5672,
+ "thanks": 1085,
+ "thanksgiving": 45732,
+ "thanksgiving": 6167,
+ "thanku": 45710,
+ "thankyou": 18050,
+ "thankyou": 9911,
+ "thanniversary": 35564,
+ "thanos": 36709,
+ "thanx": 25095,
+ "thar": 14396,
+ "thar": 38843,
+ "thard": 43474,
+ "that": 6303,
+ "that": 682,
+ "thatcher": 32496,
+ "thats": 44636,
+ "thats": 9254,
+ "thaw": 26081,
+ "thaw": 47229,
+ "thbewithyou": 41067,
+ "thc": 20091,
+ "thcentury": 49111,
+ "thd": 28219,
+ "thday": 37801,
+ "the": 599,
+ "the": 518,
+ "thea": 15935,
+ "thea": 25429,
+ "thead": 25259,
+ "theal": 45728,
+ "thealth": 31398,
+ "thear": 43283,
+ "theart": 44678,
+ "theast": 8378,
+ "theastern": 17877,
+ "theat": 2263,
+ "theater": 39438,
+ "theater": 6128,
+ "theaters": 14689,
+ "theatre": 19857,
+ "theatre": 3292,
+ "theatres": 21680,
+ "theatrical": 26833,
+ "theband": 27695,
+ "thebeatles": 35645,
+ "thebest": 40883,
+ "thebest": 25856,
+ "thebig": 24732,
+ "theblack": 47718,
+ "thec": 48659,
+ "thed": 31405,
+ "thedaily": 33550,
+ "theday": 4408,
+ "thedream": 39417,
+ "thee": 44475,
+ "thee": 15108,
+ "theeconomist": 44518,
+ "theellenshow": 35342,
+ "thefilm": 31665,
+ "theflash": 25434,
+ "theforce": 40002,
+ "theforceawakens": 48033,
+ "theft": 13286,
+ "thefuture": 34287,
+ "thegame": 24428,
+ "thegood": 28594,
+ "thegreat": 28721,
+ "thei": 44522,
+ "their": 911,
+ "theirs": 29297,
+ "thel": 5403,
+ "thelast": 23495,
+ "thelastjedi": 47992,
+ "theless": 27712,
+ "theli": 15277,
+ "thelittle": 46872,
+ "thelo": 47036,
+ "thelove": 40668,
+ "thelove": 43200,
+ "them": 5435,
+ "them": 1180,
+ "themasters": 48378,
+ "theme": 38524,
+ "theme": 5849,
+ "themed": 10126,
+ "themes": 17849,
+ "themet": 48183,
+ "themovie": 27062,
+ "themselves": 6503,
+ "then": 5929,
+ "then": 1594,
+ "thenburg": 45209,
+ "thene": 17012,
+ "thenew": 24212,
+ "thenext": 47881,
+ "thenight": 43336,
+ "theno": 37172,
+ "thenorth": 34338,
+ "theo": 17043,
+ "theo": 18084,
+ "theod": 26653,
+ "theodore": 30743,
+ "theological": 41162,
+ "theology": 24095,
+ "theon": 34653,
+ "theone": 46231,
+ "theopen": 41438,
+ "theore": 22690,
+ "theoretical": 35585,
+ "theori": 34804,
+ "theories": 23937,
+ "theory": 7143,
+ "thepeople": 33597,
+ "thepersonal": 29981,
+ "thepersonalnetwork": 30016,
+ "thephoto": 18303,
+ "thephotohour": 18607,
+ "ther": 1160,
+ "ther": 743,
+ "therap": 4499,
+ "therapeu": 19332,
+ "therapeutic": 23240,
+ "therapeutics": 49101,
+ "therapies": 30179,
+ "therapist": 20608,
+ "therapists": 34763,
+ "therapper": 49340,
+ "therapy": 5257,
+ "there": 5283,
+ "there": 997,
+ "thereal": 8074,
+ "thereal": 41140,
+ "thereby": 43308,
+ "thered": 10208,
+ "therefore": 16865,
+ "theres": 18494,
+ "theresa": 14126,
+ "therese": 47996,
+ "theresistance": 22845,
+ "theri": 28967,
+ "theri": 45297,
+ "therine": 26807,
+ "therine": 9239,
+ "thering": 7891,
+ "therland": 25351,
+ "thermal": 13689,
+ "thermo": 22303,
+ "thermom": 31138,
+ "thermometer": 38172,
+ "thermost": 42391,
+ "thern": 10919,
+ "thern": 3137,
+ "thero": 13165,
+ "theroad": 29807,
+ "therock": 30036,
+ "theroy": 38146,
+ "thers": 1959,
+ "thes": 40556,
+ "thes": 6460,
+ "thescript": 47061,
+ "these": 40366,
+ "these": 1071,
+ "theses": 39388,
+ "thesimpsons": 45513,
+ "thesims": 34192,
+ "thesis": 10673,
+ "thessal": 41491,
+ "thessaloni": 41753,
+ "thest": 35343,
+ "thesun": 45617,
+ "theta": 27694,
+ "thetic": 7954,
+ "thetimes": 36039,
+ "thevamp": 33701,
+ "thevoice": 47206,
+ "thevoice": 30258,
+ "thewalkingdead": 18087,
+ "thewanted": 43008,
+ "theworld": 44988,
+ "theworld": 17475,
+ "thex": 35990,
+ "they": 15174,
+ "they": 889,
+ "theyre": 28266,
+ "thfc": 17729,
+ "thi": 2362,
+ "thi": 9111,
+ "thia": 17943,
+ "thiago": 44537,
+ "thian": 23214,
+ "thians": 28187,
+ "thibau": 48351,
+ "thic": 26107,
+ "thic": 11794,
+ "thick": 18417,
+ "thick": 11006,
+ "thicker": 43302,
+ "thickness": 40754,
+ "thief": 18508,
+ "thier": 25595,
+ "thierry": 32929,
+ "thieves": 17899,
+ "thigh": 47124,
+ "thigh": 22877,
+ "thighs": 30847,
+ "thik": 20512,
+ "thika": 44619,
+ "thill": 31266,
+ "thim": 42331,
+ "thin": 2178,
+ "thin": 7847,
+ "thine": 47192,
+ "thing": 7499,
+ "thing": 946,
+ "things": 30670,
+ "things": 1739,
+ "thingsto": 43924,
+ "thingy": 36888,
+ "think": 9820,
+ "think": 1331,
+ "thinkbig": 26015,
+ "thinkbigsundaywithmarsha": 26666,
+ "thinker": 34577,
+ "thinkers": 32779,
+ "thinkin": 34443,
+ "thinking": 3291,
+ "thinks": 6109,
+ "thinner": 47247,
+ "thir": 6030,
+ "third": 32102,
+ "third": 3981,
+ "thirds": 42582,
+ "thirst": 23563,
+ "thirsty": 39731,
+ "thirsty": 17521,
+ "thirteen": 34209,
+ "thirty": 20813,
+ "thiru": 43292,
+ "this": 4340,
+ "this": 589,
+ "thisday": 6532,
+ "thisdayin": 33641,
+ "thisdayinhistory": 46913,
+ "thisi": 7299,
+ "thisis": 14887,
+ "thismorning": 36245,
+ "thistle": 29039,
+ "thistory": 28904,
+ "thium": 21804,
+ "thletics": 17765,
+ "thm": 10407,
+ "thman": 30079,
+ "thms": 19874,
+ "thn": 44155,
+ "thn": 45587,
+ "thnx": 25480,
+ "tho": 1325,
+ "tho": 5025,
+ "thof": 18943,
+ "thofjuly": 21613,
+ "thol": 29319,
+ "thole": 31029,
+ "tholes": 42465,
+ "thology": 9881,
+ "thom": 2585,
+ "thom": 24094,
+ "thomas": 12574,
+ "thomas": 3888,
+ "thome": 21289,
+ "thomp": 37274,
+ "thompson": 42181,
+ "thompson": 8535,
+ "thomson": 24151,
+ "thon": 38776,
+ "thon": 8924,
+ "thong": 37058,
+ "thood": 15623,
+ "thor": 4130,
+ "thor": 13691,
+ "thora": 46866,
+ "thorn": 12957,
+ "thorn": 18466,
+ "thorne": 18025,
+ "thorns": 33650,
+ "thornton": 23592,
+ "thorough": 15294,
+ "thorough": 34788,
+ "thoroughbred": 43248,
+ "thoroughly": 19750,
+ "thorpe": 18099,
+ "thos": 41965,
+ "those": 1753,
+ "thot": 33736,
+ "thou": 1513,
+ "thou": 17781,
+ "though": 2846,
+ "thought": 23948,
+ "thought": 2449,
+ "thoughtful": 19592,
+ "thoughts": 3618,
+ "thour": 27125,
+ "thousand": 9344,
+ "thousands": 7089,
+ "thouse": 40318,
+ "thouse": 7819,
+ "thoven": 23078,
+ "thr": 1111,
+ "thr": 19138,
+ "thra": 17761,
+ "thra": 32797,
+ "thrash": 38262,
+ "thre": 1607,
+ "thread": 31108,
+ "thread": 8815,
+ "threads": 24957,
+ "threat": 7527,
+ "threat": 7212,
+ "threaten": 26097,
+ "threatened": 16391,
+ "threatening": 16400,
+ "threatens": 20555,
+ "threats": 12766,
+ "three": 21615,
+ "three": 2097,
+ "thren": 41776,
+ "thresh": 29779,
+ "threshold": 33791,
+ "threw": 12746,
+ "thri": 8713,
+ "thrift": 27779,
+ "thrill": 21023,
+ "thrilled": 7879,
+ "thriller": 9653,
+ "thrilling": 20101,
+ "thrills": 39829,
+ "thrive": 17669,
+ "thriving": 22677,
+ "thro": 2101,
+ "thro": 28624,
+ "throat": 16371,
+ "thrombo": 47585,
+ "throne": 15999,
+ "thrones": 8072,
+ "throp": 34939,
+ "throttle": 37139,
+ "through": 6091,
+ "through": 1417,
+ "throughout": 6721,
+ "throughs": 48278,
+ "throw": 3315,
+ "throw": 6293,
+ "throwback": 6001,
+ "throwback": 5058,
+ "throwbackthursday": 6326,
+ "thrower": 40199,
+ "throwing": 9734,
+ "thrown": 15079,
+ "throws": 14723,
+ "thru": 23856,
+ "thru": 6162,
+ "thrush": 46133,
+ "thrust": 40202,
+ "ths": 2079,
+ "tht": 23554,
+ "thu": 3837,
+ "thu": 14153,
+ "thub": 25660,
+ "thug": 37212,
+ "thug": 18137,
+ "thugs": 27686,
+ "thul": 28368,
+ "thulhu": 37560,
+ "thum": 14679,
+ "thumb": 19514,
+ "thumb": 18674,
+ "thumbnail": 32365,
+ "thumbs": 17599,
+ "thun": 32267,
+ "thunder": 6161,
+ "thunder": 8951,
+ "thunderbird": 45131,
+ "thunderbirds": 44286,
+ "thunderbolt": 43596,
+ "thunderstorm": 12005,
+ "thunderstorms": 19525,
+ "thunt": 46763,
+ "thur": 1837,
+ "thur": 21704,
+ "thurman": 41291,
+ "thurs": 9908,
+ "thursday": 11218,
+ "thursday": 2221,
+ "thursdaymotivation": 39375,
+ "thursdays": 21444,
+ "thursdaythoughts": 14866,
+ "thurst": 33970,
+ "thus": 12457,
+ "thusi": 9488,
+ "thwaite": 48469,
+ "thweeksary": 30871,
+ "thx": 5913,
+ "thy": 7804,
+ "thy": 3362,
+ "thyme": 29805,
+ "thyro": 25174,
+ "thyroid": 32558,
+ "ti": 555,
+ "ti": 2605,
+ "tia": 6709,
+ "tial": 2826,
+ "tially": 14503,
+ "tian": 23011,
+ "tian": 8125,
+ "tians": 35182,
+ "tiara": 38322,
+ "tib": 47868,
+ "tibet": 19927,
+ "tibet": 22234,
+ "tibetan": 24057,
+ "tible": 11453,
+ "tic": 890,
+ "tic": 1550,
+ "tica": 9669,
+ "tical": 34191,
+ "tical": 4342,
+ "tically": 13375,
+ "ticals": 30861,
+ "tice": 3122,
+ "tich": 48769,
+ "tician": 43358,
+ "ticism": 26491,
+ "tick": 24640,
+ "tick": 15617,
+ "ticket": 25740,
+ "ticket": 4500,
+ "ticketing": 44432,
+ "tickets": 2015,
+ "ticking": 35842,
+ "tickle": 42999,
+ "ticks": 40269,
+ "tico": 17670,
+ "ticon": 45996,
+ "tics": 2419,
+ "ticul": 15538,
+ "ticus": 44277,
+ "tid": 26002,
+ "tid": 23727,
+ "tidal": 21949,
+ "tide": 15698,
+ "tide": 9105,
+ "tides": 25524,
+ "tidy": 23858,
+ "tie": 14072,
+ "tie": 3422,
+ "tied": 9889,
+ "tiem": 34762,
+ "tien": 47538,
+ "tiene": 43438,
+ "tier": 14390,
+ "tier": 6598,
+ "tierney": 45693,
+ "tiers": 24604,
+ "ties": 25556,
+ "ties": 2499,
+ "tiest": 18300,
+ "tiesto": 46367,
+ "tif": 23216,
+ "tiff": 11112,
+ "tiff": 20699,
+ "tiffany": 30467,
+ "tiffany": 14446,
+ "tification": 43923,
+ "tified": 40854,
+ "tiful": 29123,
+ "tify": 6677,
+ "tig": 31999,
+ "tiger": 11954,
+ "tiger": 6531,
+ "tigers": 6934,
+ "tigh": 31365,
+ "tight": 25763,
+ "tight": 9123,
+ "tighten": 46653,
+ "tighter": 48193,
+ "tightly": 37568,
+ "tights": 29581,
+ "tijuana": 45273,
+ "tik": 24986,
+ "tik": 32403,
+ "tiki": 30107,
+ "til": 6124,
+ "til": 1763,
+ "tile": 26217,
+ "tile": 8227,
+ "tiles": 10607,
+ "tility": 38180,
+ "till": 17462,
+ "till": 4267,
+ "tilla": 26063,
+ "tillerson": 47738,
+ "tilly": 41199,
+ "tilt": 23601,
+ "tim": 1292,
+ "tim": 3863,
+ "timate": 4754,
+ "timb": 26627,
+ "timber": 14441,
+ "timber": 16246,
+ "timberlake": 28274,
+ "timbers": 39911,
+ "timberwolves": 41190,
+ "time": 3764,
+ "time": 788,
+ "timed": 32727,
+ "timehop": 19944,
+ "timel": 23549,
+ "timelapse": 48154,
+ "timeless": 15558,
+ "timeline": 11492,
+ "timely": 19250,
+ "timeout": 41536,
+ "timer": 19725,
+ "timers": 44574,
+ "times": 26445,
+ "times": 1661,
+ "timesnow": 45487,
+ "timesof": 32522,
+ "timesofindia": 44182,
+ "timetable": 31971,
+ "timeto": 29187,
+ "timing": 13624,
+ "timm": 22444,
+ "timmy": 33252,
+ "timo": 13390,
+ "timo": 33777,
+ "timothy": 42087,
+ "timothy": 18560,
+ "timp": 42166,
+ "tin": 1310,
+ "tin": 5420,
+ "tina": 9257,
+ "tinder": 24287,
+ "tine": 22341,
+ "ting": 7451,
+ "ting": 694,
+ "tinged": 44829,
+ "tings": 35332,
+ "tini": 26839,
+ "tink": 39278,
+ "tinker": 45272,
+ "tinker": 40910,
+ "tino": 20538,
+ "tins": 37359,
+ "tint": 40497,
+ "tinted": 42618,
+ "tiny": 21716,
+ "tiny": 5591,
+ "tio": 27562,
+ "tion": 2274,
+ "tion": 740,
+ "tional": 22460,
+ "tional": 2986,
+ "tionality": 24514,
+ "tionally": 12409,
+ "tionary": 8381,
+ "tione": 44318,
+ "tioned": 9083,
+ "tioning": 15528,
+ "tionist": 25732,
+ "tions": 1371,
+ "tious": 14255,
+ "tip": 15383,
+ "tip": 4623,
+ "tipoff": 44521,
+ "tipp": 32294,
+ "tipped": 31878,
+ "tipper": 38095,
+ "tipperary": 45612,
+ "tipping": 27827,
+ "tips": 3173,
+ "tipton": 48809,
+ "tiptuesday": 42112,
+ "tique": 37772,
+ "tir": 25467,
+ "tir": 38462,
+ "tire": 29128,
+ "tire": 9362,
+ "tired": 6533,
+ "tireless": 39835,
+ "tirelessly": 41548,
+ "tires": 15533,
+ "tiring": 42630,
+ "tiru": 36033,
+ "tis": 7839,
+ "tis": 7394,
+ "tise": 13745,
+ "tisgarh": 40538,
+ "tish": 45148,
+ "tish": 28784,
+ "tism": 27113,
+ "tiss": 28155,
+ "tissue": 15368,
+ "tissues": 32172,
+ "tist": 7902,
+ "tista": 25580,
+ "tists": 25944,
+ "tit": 1991,
+ "tit": 13202,
+ "tita": 40936,
+ "titan": 13496,
+ "titan": 15516,
+ "titanic": 20729,
+ "titanium": 24409,
+ "titans": 13066,
+ "titi": 17434,
+ "titi": 48504,
+ "title": 28033,
+ "title": 3644,
+ "titled": 9939,
+ "titles": 9780,
+ "tito": 26838,
+ "titus": 36102,
+ "tium": 21975,
+ "tiv": 1835,
+ "tiva": 41886,
+ "tive": 14640,
+ "tive": 1420,
+ "tively": 9883,
+ "tiveness": 20955,
+ "tives": 7570,
+ "tivity": 9859,
+ "tivo": 32162,
+ "tix": 5835,
+ "tiz": 19376,
+ "tj": 18890,
+ "tj": 18988,
+ "tk": 22344,
+ "tk": 20676,
+ "tko": 37347,
+ "tks": 38739,
+ "tl": 14325,
+ "tl": 8190,
+ "tland": 30697,
+ "tlap": 41976,
+ "tlc": 22047,
+ "tle": 39141,
+ "tle": 5825,
+ "tles": 39363,
+ "tless": 17427,
+ "tlot": 41080,
+ "tls": 47367,
+ "tly": 37483,
+ "tly": 1646,
+ "tm": 9430,
+ "tm": 7789,
+ "tman": 20796,
+ "tmc": 35263,
+ "tment": 26485,
+ "tml": 39445,
+ "tmltalk": 42260,
+ "tmnt": 32444,
+ "tmobile": 34901,
+ "tmr": 35906,
+ "tmrw": 16496,
+ "tms": 44496,
+ "tmund": 23801,
+ "tmw": 45827,
+ "tmz": 37248,
+ "tn": 3827,
+ "tn": 7248,
+ "tna": 21150,
+ "tnam": 8079,
+ "tner": 34922,
+ "tness": 35212,
+ "tney": 9523,
+ "tng": 35898,
+ "tnt": 20659,
+ "tnx": 38220,
+ "to": 580,
+ "to": 531,
+ "toa": 17916,
+ "toad": 26096,
+ "toast": 24654,
+ "toast": 10920,
+ "toasted": 23533,
+ "toaster": 39061,
+ "toasty": 44726,
+ "tob": 24260,
+ "tobac": 12611,
+ "tobacco": 13905,
+ "tobago": 39482,
+ "tobe": 17534,
+ "tobe": 28740,
+ "tober": 18162,
+ "tober": 2925,
+ "toberfest": 26249,
+ "tobi": 40335,
+ "tobi": 48374,
+ "tobias": 32464,
+ "tobin": 42466,
+ "toby": 29659,
+ "toby": 18333,
+ "toc": 41907,
+ "toc": 30643,
+ "tock": 25274,
+ "tod": 38239,
+ "tod": 33568,
+ "toda": 47141,
+ "todas": 36150,
+ "today": 11800,
+ "today": 721,
+ "todayin": 32957,
+ "todays": 13513,
+ "todayshow": 29739,
+ "todd": 10398,
+ "todd": 9951,
+ "toddler": 17772,
+ "toddlers": 36719,
+ "toddy": 38926,
+ "todo": 48857,
+ "todo": 23087,
+ "todos": 33355,
+ "toe": 47756,
+ "toe": 11344,
+ "toes": 16511,
+ "tof": 6659,
+ "toff": 27319,
+ "toffee": 34880,
+ "tofficial": 47953,
+ "tofthe": 23678,
+ "toftheday": 20566,
+ "tofu": 24692,
+ "tog": 45715,
+ "toge": 1903,
+ "together": 17858,
+ "together": 1952,
+ "togo": 26729,
+ "tography": 33968,
+ "toh": 26851,
+ "toi": 7472,
+ "toi": 26941,
+ "toid": 49124,
+ "toile": 43148,
+ "toilet": 11071,
+ "toilets": 24027,
+ "toire": 39534,
+ "tok": 16690,
+ "tok": 27010,
+ "token": 32634,
+ "token": 17134,
+ "tokens": 23562,
+ "tokyo": 35038,
+ "tokyo": 6667,
+ "tol": 4678,
+ "tol": 32962,
+ "told": 3527,
+ "tole": 15677,
+ "toledo": 19812,
+ "toler": 12150,
+ "tolerance": 20377,
+ "tolerant": 38536,
+ "tolerate": 35556,
+ "tolkien": 32989,
+ "toll": 44090,
+ "toll": 14155,
+ "tollywood": 42016,
+ "tology": 34799,
+ "tom": 999,
+ "tom": 2435,
+ "toma": 42360,
+ "toma": 44710,
+ "tomas": 35944,
+ "tomas": 27178,
+ "tomat": 12041,
+ "tomato": 9867,
+ "tomatoes": 13004,
+ "tomb": 37187,
+ "tomb": 15582,
+ "tombs": 48613,
+ "tombstone": 45729,
+ "tome": 24137,
+ "tome": 24283,
+ "tomi": 46290,
+ "tomlin": 46649,
+ "tomlinson": 17484,
+ "tommorow": 42871,
+ "tommy": 16573,
+ "tommy": 8876,
+ "tomo": 31223,
+ "tomo": 34434,
+ "tomor": 1277,
+ "tomorrow": 19728,
+ "tomorrow": 1293,
+ "tomorrowland": 34951,
+ "tomorrows": 32258,
+ "tomorrowspaper": 35005,
+ "tomorrowspaperstoday": 35190,
+ "tomp": 43544,
+ "tompkins": 49068,
+ "toms": 10545,
+ "tomy": 18730,
+ "ton": 838,
+ "ton": 917,
+ "tona": 13459,
+ "tone": 32366,
+ "tone": 8408,
+ "toned": 29426,
+ "toner": 40614,
+ "tones": 14744,
+ "tong": 21510,
+ "tonga": 37882,
+ "tongue": 44820,
+ "tongue": 13626,
+ "tongues": 39837,
+ "toni": 17766,
+ "toni": 17171,
+ "tonic": 17808,
+ "tonics": 34647,
+ "tonight": 1009,
+ "tonights": 23312,
+ "tonite": 13449,
+ "tonka": 42781,
+ "tonline": 45867,
+ "tonne": 42450,
+ "tonnes": 24813,
+ "tons": 7555,
+ "tony": 9150,
+ "tony": 4767,
+ "tonyawards": 46068,
+ "too": 1843,
+ "too": 1256,
+ "took": 2280,
+ "tool": 13718,
+ "tool": 5999,
+ "toolbox": 46599,
+ "toolkit": 29849,
+ "tools": 5771,
+ "toom": 27550,
+ "toon": 24664,
+ "toon": 19701,
+ "toonami": 48336,
+ "toons": 35345,
+ "toor": 42590,
+ "tooth": 15316,
+ "tooth": 12030,
+ "toothbrush": 36841,
+ "toothpaste": 37322,
+ "tooting": 42969,
+ "top": 5534,
+ "top": 1253,
+ "topaz": 46125,
+ "tope": 32149,
+ "tope": 42239,
+ "topeka": 46884,
+ "topia": 29618,
+ "topic": 8720,
+ "topical": 37464,
+ "topics": 11916,
+ "topless": 37415,
+ "topo": 23008,
+ "topoli": 30152,
+ "topp": 19529,
+ "topped": 12588,
+ "topper": 31780,
+ "toppers": 41651,
+ "topping": 21071,
+ "toppings": 47554,
+ "topps": 20201,
+ "tops": 8154,
+ "topshop": 40953,
+ "topus": 21495,
+ "tor": 937,
+ "tor": 1208,
+ "tora": 45147,
+ "torah": 37945,
+ "toral": 45282,
+ "torch": 31921,
+ "torch": 15820,
+ "tore": 38066,
+ "tore": 19385,
+ "tored": 38046,
+ "torg": 33214,
+ "tori": 17689,
+ "tori": 17539,
+ "toria": 23732,
+ "torial": 28029,
+ "torian": 48399,
+ "tories": 14193,
+ "torino": 29178,
+ "torio": 34235,
+ "torn": 8572,
+ "torn": 18023,
+ "tornad": 24676,
+ "tornado": 9062,
+ "tornadoes": 28254,
+ "toro": 17892,
+ "toron": 37407,
+ "toronto": 16866,
+ "toronto": 4514,
+ "torpe": 34093,
+ "torpedo": 46582,
+ "torquay": 45738,
+ "torque": 31940,
+ "torre": 39563,
+ "torre": 38009,
+ "torrent": 42317,
+ "torrential": 41158,
+ "torres": 16049,
+ "tors": 2546,
+ "tortilla": 32683,
+ "torto": 24170,
+ "tortoise": 30178,
+ "torture": 16013,
+ "tortured": 29900,
+ "tory": 29390,
+ "tory": 4214,
+ "tos": 6094,
+ "tosc": 37719,
+ "tose": 38154,
+ "tosh": 17109,
+ "toshi": 31744,
+ "toss": 19656,
+ "tossed": 31296,
+ "tot": 4618,
+ "tot": 23659,
+ "total": 13507,
+ "total": 4445,
+ "totally": 5440,
+ "totals": 25772,
+ "tote": 48145,
+ "tote": 19031,
+ "totem": 45376,
+ "totes": 37199,
+ "tothe": 12222,
+ "toto": 39823,
+ "tots": 24978,
+ "totten": 14360,
+ "tottenham": 14889,
+ "tou": 1879,
+ "tou": 29261,
+ "touch": 9480,
+ "touch": 4526,
+ "touchdown": 18664,
+ "touchdowns": 37905,
+ "touched": 13190,
+ "touches": 14832,
+ "touching": 14088,
+ "touchscreen": 39095,
+ "tough": 12063,
+ "tough": 5499,
+ "tougher": 33722,
+ "toughest": 23773,
+ "toughness": 45522,
+ "toulou": 27145,
+ "toulouse": 30267,
+ "tour": 2710,
+ "tour": 1760,
+ "tourde": 39247,
+ "toured": 27654,
+ "touri": 4224,
+ "touring": 11853,
+ "tourism": 23661,
+ "tourism": 6556,
+ "tourist": 12123,
+ "tourists": 15546,
+ "tournament": 4097,
+ "tournaments": 23058,
+ "tourney": 12603,
+ "tours": 8948,
+ "tous": 37424,
+ "tout": 22300,
+ "touts": 41274,
+ "tov": 28970,
+ "tow": 11557,
+ "tow": 18653,
+ "toward": 8508,
+ "towards": 4447,
+ "towed": 45419,
+ "towel": 15953,
+ "towels": 26578,
+ "tower": 26669,
+ "tower": 4730,
+ "towering": 39444,
+ "towers": 12701,
+ "towie": 44613,
+ "towin": 45819,
+ "towing": 36963,
+ "town": 4068,
+ "town": 1605,
+ "townfc": 33981,
+ "townhall": 33408,
+ "townhouse": 40178,
+ "towns": 14173,
+ "townsend": 26826,
+ "township": 14622,
+ "townsville": 47330,
+ "towork": 48233,
+ "tox": 7742,
+ "tox": 16145,
+ "toxic": 27436,
+ "toxic": 12348,
+ "toxicity": 41234,
+ "toxin": 48899,
+ "toxins": 36618,
+ "toy": 14387,
+ "toy": 5988,
+ "toya": 37602,
+ "toyo": 7644,
+ "toyota": 8908,
+ "toys": 39508,
+ "toys": 7162,
+ "tp": 23760,
+ "tp": 15188,
+ "tpp": 29411,
+ "tps": 35246,
+ "tq": 43066,
+ "tr": 635,
+ "tr": 6337,
+ "tra": 752,
+ "tra": 2483,
+ "trac": 2266,
+ "trace": 48611,
+ "trace": 14767,
+ "traced": 47956,
+ "traces": 30913,
+ "tracey": 25558,
+ "tracing": 27897,
+ "track": 10887,
+ "track": 2700,
+ "tracked": 27049,
+ "tracker": 18123,
+ "tracking": 10428,
+ "tracklist": 39777,
+ "tracks": 7579,
+ "tract": 4690,
+ "traction": 10644,
+ "tractor": 14607,
+ "tractors": 37854,
+ "tracy": 32984,
+ "tracy": 15508,
+ "trad": 48716,
+ "trad": 38037,
+ "trade": 10457,
+ "trade": 3629,
+ "traded": 18860,
+ "trademark": 25011,
+ "trader": 17700,
+ "traders": 19112,
+ "trades": 18519,
+ "trading": 40083,
+ "trading": 6520,
+ "tradio": 20689,
+ "tradition": 20838,
+ "tradition": 8784,
+ "traditional": 41113,
+ "traditional": 5604,
+ "traditionally": 35532,
+ "traditions": 18016,
+ "traf": 3227,
+ "trafal": 32461,
+ "trafalgar": 36969,
+ "traff": 31571,
+ "traffic": 12080,
+ "traffic": 3399,
+ "trafficking": 15983,
+ "trafford": 22912,
+ "trage": 12430,
+ "tragedy": 14082,
+ "tragic": 14828,
+ "tragically": 39599,
+ "trail": 11523,
+ "trail": 4921,
+ "trailblazer": 41015,
+ "trailblazers": 35954,
+ "trailer": 4700,
+ "trailers": 24862,
+ "trailing": 37427,
+ "trails": 10633,
+ "train": 9122,
+ "train": 3231,
+ "trained": 10874,
+ "trainee": 25795,
+ "trainees": 30382,
+ "trainer": 9767,
+ "trainers": 18871,
+ "training": 34508,
+ "training": 2199,
+ "trains": 9541,
+ "trait": 35160,
+ "traitor": 31760,
+ "traitors": 42633,
+ "traits": 25748,
+ "trajec": 42042,
+ "trak": 24065,
+ "tral": 14609,
+ "tram": 9800,
+ "tram": 17500,
+ "tramp": 46289,
+ "trampol": 32905,
+ "trampoline": 42800,
+ "tramrahim": 35220,
+ "tran": 1357,
+ "tran": 22031,
+ "trance": 30584,
+ "trance": 18671,
+ "trancefamily": 39630,
+ "trane": 35779,
+ "tranqu": 18912,
+ "tranquil": 35764,
+ "tranquility": 36688,
+ "trans": 1826,
+ "trans": 8126,
+ "transaction": 24881,
+ "transactions": 21653,
+ "transat": 37872,
+ "transatlantic": 40703,
+ "transc": 21073,
+ "transcend": 47087,
+ "transcript": 39008,
+ "transcription": 48765,
+ "transfer": 22659,
+ "transfer": 7134,
+ "transferred": 29700,
+ "transferring": 40924,
+ "transfers": 21621,
+ "transform": 8142,
+ "transform": 12288,
+ "transformation": 34204,
+ "transformation": 7832,
+ "transformational": 47135,
+ "transformationtuesday": 36511,
+ "transformative": 38106,
+ "transformed": 17453,
+ "transformer": 38235,
+ "transformers": 17843,
+ "transforming": 44470,
+ "transforming": 19251,
+ "transforms": 30312,
+ "transgender": 17732,
+ "transi": 32236,
+ "transit": 10174,
+ "transiti": 22939,
+ "transition": 11391,
+ "transitional": 41519,
+ "transitioning": 43586,
+ "transitions": 39374,
+ "transl": 12243,
+ "translate": 22655,
+ "translated": 20752,
+ "translates": 36334,
+ "translating": 42156,
+ "translation": 12153,
+ "translations": 41367,
+ "translator": 36230,
+ "translucent": 49052,
+ "transm": 18861,
+ "transmission": 16103,
+ "transmitted": 48605,
+ "transmitter": 40457,
+ "transp": 11726,
+ "transpa": 18524,
+ "transparen": 16108,
+ "transparency": 16828,
+ "transparent": 19017,
+ "transpl": 16038,
+ "transplant": 41871,
+ "transplant": 18771,
+ "transplantation": 45207,
+ "transpor": 19406,
+ "transport": 10231,
+ "transport": 7362,
+ "transportation": 10911,
+ "transported": 29089,
+ "transporter": 43568,
+ "transporting": 42259,
+ "trap": 36224,
+ "trap": 9677,
+ "trape": 42435,
+ "trapped": 15592,
+ "traps": 28517,
+ "tras": 30638,
+ "trash": 39215,
+ "trash": 9798,
+ "traum": 22263,
+ "trauma": 13846,
+ "traumati": 46613,
+ "traumatic": 29958,
+ "trav": 7586,
+ "trav": 46955,
+ "trave": 35357,
+ "travel": 2824,
+ "travel": 1949,
+ "travelblog": 35957,
+ "travelblogger": 25494,
+ "travelchat": 46455,
+ "traveled": 20384,
+ "traveler": 17794,
+ "travelers": 20644,
+ "travelgram": 40069,
+ "traveling": 9365,
+ "travelled": 23428,
+ "traveller": 22546,
+ "travellers": 29583,
+ "travelling": 11190,
+ "travelphotography": 22808,
+ "travelpics": 32293,
+ "travels": 11472,
+ "traveltips": 36260,
+ "traveltuesday": 16713,
+ "traverse": 35058,
+ "travi": 46971,
+ "travis": 27441,
+ "travis": 12287,
+ "traw": 42288,
+ "trax": 34421,
+ "tray": 38470,
+ "tray": 14621,
+ "trays": 39798,
+ "trc": 41803,
+ "tre": 975,
+ "tre": 6033,
+ "treach": 46005,
+ "tread": 26182,
+ "tread": 35658,
+ "treadmill": 37780,
+ "treas": 8591,
+ "treason": 28103,
+ "treasure": 9922,
+ "treasured": 48068,
+ "treasurer": 26985,
+ "treasures": 16500,
+ "treasury": 20956,
+ "treat": 3968,
+ "treat": 3901,
+ "treated": 9772,
+ "treating": 13842,
+ "treatment": 4869,
+ "treatments": 15839,
+ "treats": 8878,
+ "treaty": 19967,
+ "treble": 33194,
+ "trecht": 33812,
+ "tree": 13354,
+ "tree": 2677,
+ "treehouse": 42387,
+ "trees": 4682,
+ "trek": 13236,
+ "trek": 8136,
+ "trekking": 25293,
+ "trell": 35159,
+ "tremb": 44043,
+ "tremend": 14659,
+ "tremendous": 15988,
+ "tren": 2579,
+ "trench": 23846,
+ "trenches": 38723,
+ "trend": 19986,
+ "trend": 6643,
+ "trending": 6087,
+ "trends": 7015,
+ "trendsetter": 46666,
+ "trendy": 23072,
+ "trent": 45885,
+ "trent": 15548,
+ "trenton": 37470,
+ "tres": 23569,
+ "tress": 4733,
+ "tresses": 24273,
+ "trevor": 23437,
+ "trevor": 13219,
+ "trex": 42114,
+ "trey": 36670,
+ "trey": 16939,
+ "tri": 924,
+ "tri": 9618,
+ "triad": 45602,
+ "trial": 5991,
+ "trials": 10992,
+ "triangle": 14615,
+ "triathlon": 18080,
+ "trib": 45151,
+ "tribal": 16629,
+ "tribe": 19943,
+ "tribe": 11365,
+ "tribeca": 35184,
+ "tribes": 26546,
+ "tribu": 3028,
+ "tribun": 14311,
+ "tribunal": 32911,
+ "tribune": 18556,
+ "tribute": 5493,
+ "tributes": 15537,
+ "tric": 9511,
+ "tric": 4081,
+ "trich": 39519,
+ "trick": 17177,
+ "trick": 8172,
+ "tricks": 13177,
+ "tricky": 22319,
+ "trics": 31437,
+ "trident": 35491,
+ "tridge": 18722,
+ "tried": 4554,
+ "tries": 4315,
+ "trife": 48962,
+ "trigge": 30509,
+ "trigger": 16158,
+ "triggered": 30924,
+ "triggers": 37319,
+ "tright": 29915,
+ "tril": 40626,
+ "trill": 39297,
+ "trilli": 39350,
+ "trillion": 20160,
+ "trilo": 15183,
+ "trilogy": 16862,
+ "trim": 14182,
+ "trimmed": 40657,
+ "trin": 6628,
+ "trinidad": 26244,
+ "trinity": 30744,
+ "trinity": 12267,
+ "trio": 10263,
+ "trip": 23421,
+ "trip": 2529,
+ "tripad": 37189,
+ "tripadvisor": 38708,
+ "triple": 16519,
+ "triple": 7673,
+ "triplets": 48601,
+ "tripod": 36141,
+ "tripoli": 40095,
+ "trippin": 43073,
+ "tripping": 35229,
+ "trippy": 35137,
+ "trips": 12292,
+ "tris": 29690,
+ "trish": 40511,
+ "trish": 37179,
+ "trisha": 39152,
+ "tristan": 25497,
+ "trit": 37087,
+ "triton": 45437,
+ "triu": 14782,
+ "trium": 21065,
+ "triumph": 26507,
+ "triumph": 15307,
+ "triumphant": 41918,
+ "trivi": 21228,
+ "trivia": 10642,
+ "triviatuesday": 45499,
+ "trix": 41017,
+ "tro": 1046,
+ "tro": 3332,
+ "trock": 44368,
+ "trojan": 30653,
+ "trojans": 25310,
+ "trol": 10306,
+ "troll": 39737,
+ "troll": 17103,
+ "trolley": 25124,
+ "trolling": 28552,
+ "trolls": 20890,
+ "tromb": 32390,
+ "trombone": 44423,
+ "tron": 19057,
+ "tron": 10684,
+ "tronic": 34258,
+ "tronics": 34397,
+ "troom": 23691,
+ "troop": 12492,
+ "troop": 24054,
+ "trooper": 18327,
+ "troopers": 23576,
+ "troops": 10109,
+ "trop": 31585,
+ "trope": 41150,
+ "trophies": 20998,
+ "trophy": 42676,
+ "trophy": 6502,
+ "tropic": 21794,
+ "tropic": 36736,
+ "tropical": 41699,
+ "tropical": 8686,
+ "tropics": 36940,
+ "tros": 40456,
+ "trose": 36022,
+ "trot": 30453,
+ "trotter": 38287,
+ "trou": 5181,
+ "troubad": 49037,
+ "trouble": 25669,
+ "trouble": 7848,
+ "troubled": 25568,
+ "troubles": 27254,
+ "trough": 39761,
+ "troupe": 34803,
+ "trous": 19727,
+ "trousers": 23172,
+ "trout": 14853,
+ "trove": 45350,
+ "trow": 46914,
+ "troy": 26283,
+ "troy": 12819,
+ "trs": 24770,
+ "tru": 931,
+ "tru": 25326,
+ "truck": 14781,
+ "truck": 4629,
+ "trucker": 45918,
+ "truckers": 43404,
+ "trucking": 26208,
+ "trucks": 9569,
+ "trude": 39017,
+ "trudeau": 15752,
+ "true": 13096,
+ "true": 2328,
+ "truec": 37583,
+ "truelove": 45711,
+ "truffle": 23064,
+ "truffles": 37057,
+ "truly": 4545,
+ "trum": 11766,
+ "trum": 11399,
+ "truman": 29414,
+ "trump": 9124,
+ "trump": 1797,
+ "trumpet": 23681,
+ "trumpp": 45550,
+ "trumprussia": 39135,
+ "trumps": 29793,
+ "trumptrain": 43595,
+ "trun": 16163,
+ "trun": 46661,
+ "trunk": 18347,
+ "trunks": 38531,
+ "truro": 43507,
+ "truss": 46080,
+ "trust": 17691,
+ "trust": 3876,
+ "truste": 17356,
+ "trusted": 16538,
+ "trustee": 30803,
+ "trustees": 28853,
+ "trusting": 33221,
+ "trusts": 27507,
+ "trustworthy": 46840,
+ "trusty": 37955,
+ "truth": 21335,
+ "truth": 4319,
+ "truths": 27179,
+ "trx": 31620,
+ "try": 4487,
+ "try": 1209,
+ "tryin": 31085,
+ "trying": 2551,
+ "tryna": 15702,
+ "tryout": 43832,
+ "tryouts": 28053,
+ "ts": 2290,
+ "ts": 590,
+ "tsa": 25977,
+ "tsal": 20438,
+ "tsb": 45015,
+ "tsc": 37437,
+ "tsch": 38778,
+ "tsd": 20611,
+ "tse": 49144,
+ "tsfor": 42654,
+ "tsford": 32823,
+ "tsh": 42872,
+ "tshirt": 14907,
+ "tshirts": 29377,
+ "tsi": 40048,
+ "tsi": 37867,
+ "tsk": 43600,
+ "tsla": 35681,
+ "tsm": 43452,
+ "tsman": 20046,
+ "tsn": 44921,
+ "tsn": 26896,
+ "tson": 42353,
+ "tson": 47140,
+ "tsp": 34230,
+ "tsu": 13950,
+ "tsu": 20175,
+ "tsun": 19155,
+ "tsunami": 24286,
+ "tsville": 29080,
+ "tt": 971,
+ "tt": 1402,
+ "tta": 2646,
+ "ttc": 27668,
+ "tte": 23105,
+ "tte": 3070,
+ "tted": 15163,
+ "tten": 11351,
+ "tten": 17479,
+ "tter": 18691,
+ "tter": 5165,
+ "tters": 6318,
+ "ttes": 9293,
+ "tti": 5237,
+ "ttin": 36589,
+ "tting": 1188,
+ "ttino": 47389,
+ "ttip": 46993,
+ "ttle": 9253,
+ "ttm": 46838,
+ "tto": 8759,
+ "tto": 8105,
+ "tton": 10562,
+ "ttot": 12480,
+ "ttp": 30828,
+ "ttr": 47589,
+ "tts": 11570,
+ "ttt": 17256,
+ "tttt": 33119,
+ "ttu": 44006,
+ "ttv": 24281,
+ "tty": 11457,
+ "tty": 1856,
+ "tu": 764,
+ "tu": 5760,
+ "tua": 41344,
+ "tual": 4799,
+ "tuan": 37297,
+ "tub": 34907,
+ "tub": 15450,
+ "tube": 38229,
+ "tube": 3308,
+ "tuber": 30371,
+ "tuberculo": 42606,
+ "tuberculosis": 43129,
+ "tubes": 22870,
+ "tubing": 40794,
+ "tubs": 41705,
+ "tubular": 48786,
+ "tuc": 14456,
+ "tuc": 43871,
+ "tuck": 22398,
+ "tucked": 26923,
+ "tucker": 39703,
+ "tucker": 15726,
+ "tucket": 32677,
+ "tucson": 17250,
+ "tudor": 24547,
+ "tue": 17515,
+ "tues": 2283,
+ "tues": 12113,
+ "tuesday": 10209,
+ "tuesday": 2519,
+ "tuesdaymotivation": 25432,
+ "tuesdays": 23195,
+ "tuesdaythoughts": 17988,
+ "tuf": 44510,
+ "tuff": 38868,
+ "tug": 47032,
+ "tug": 27902,
+ "tuition": 21129,
+ "tuk": 39271,
+ "tuk": 14993,
+ "tul": 9069,
+ "tul": 40837,
+ "tula": 36332,
+ "tulane": 44893,
+ "tulip": 28389,
+ "tulips": 30886,
+ "tulsa": 18850,
+ "tum": 12932,
+ "tum": 8843,
+ "tumb": 8831,
+ "tumble": 38284,
+ "tumbler": 48790,
+ "tumbling": 46226,
+ "tumblr": 11841,
+ "tummy": 26053,
+ "tumor": 22616,
+ "tumors": 39894,
+ "tumour": 45129,
+ "tun": 1415,
+ "tun": 21349,
+ "tuna": 15037,
+ "tundra": 39899,
+ "tune": 11427,
+ "tune": 3300,
+ "tuned": 5898,
+ "tunein": 16809,
+ "tuner": 42905,
+ "tunes": 31688,
+ "tunes": 10810,
+ "tunesapp": 32550,
+ "tung": 47940,
+ "tung": 31092,
+ "tuni": 16270,
+ "tunic": 43495,
+ "tuning": 19585,
+ "tunisia": 23346,
+ "tunnel": 11096,
+ "tunnels": 29814,
+ "tuous": 28738,
+ "tup": 37956,
+ "tup": 4507,
+ "tupac": 31506,
+ "tups": 44855,
+ "tur": 985,
+ "tur": 17182,
+ "tura": 16127,
+ "tural": 45143,
+ "tural": 4261,
+ "turb": 18973,
+ "turban": 48515,
+ "turbine": 26880,
+ "turbines": 38863,
+ "turbo": 23578,
+ "turbo": 13668,
+ "turbul": 31100,
+ "turbulent": 47871,
+ "ture": 4321,
+ "ture": 941,
+ "tured": 3987,
+ "turer": 11993,
+ "turers": 16956,
+ "tures": 2400,
+ "turf": 36762,
+ "turf": 12510,
+ "turi": 11896,
+ "turin": 36251,
+ "turing": 5812,
+ "turismo": 30202,
+ "turk": 8254,
+ "turk": 32507,
+ "turkey": 35977,
+ "turkey": 4790,
+ "turkeys": 37991,
+ "turkish": 48199,
+ "turkish": 9278,
+ "turks": 34344,
+ "turmeric": 34044,
+ "turmoil": 37751,
+ "turn": 5522,
+ "turn": 2105,
+ "turnaround": 32719,
+ "turnbull": 27863,
+ "turned": 3771,
+ "turner": 42867,
+ "turner": 8777,
+ "turning": 4976,
+ "turno": 21377,
+ "turnout": 11654,
+ "turnover": 30794,
+ "turnpike": 38301,
+ "turns": 3185,
+ "turnt": 28887,
+ "turntable": 37953,
+ "turnup": 30591,
+ "turo": 29224,
+ "turquo": 19390,
+ "turquoise": 19899,
+ "turt": 13716,
+ "turtle": 35943,
+ "turtle": 10912,
+ "turtles": 17862,
+ "tus": 24828,
+ "tus": 7079,
+ "tusc": 17909,
+ "tuscal": 42638,
+ "tuscaloosa": 44375,
+ "tuscan": 42865,
+ "tuscany": 20885,
+ "tuss": 31741,
+ "tut": 35121,
+ "tutor": 10054,
+ "tutor": 27858,
+ "tutorial": 12857,
+ "tutorials": 30973,
+ "tutoring": 37532,
+ "tutti": 46880,
+ "tutu": 35845,
+ "tux": 28720,
+ "tux": 49186,
+ "tuxedo": 40173,
+ "tv": 3197,
+ "tv": 1583,
+ "tvc": 49190,
+ "tvd": 25889,
+ "tvmiaw": 38554,
+ "tvn": 44232,
+ "tvs": 27114,
+ "tvtime": 19947,
+ "tvxq": 43968,
+ "tw": 966,
+ "tw": 12842,
+ "twa": 46954,
+ "twain": 30689,
+ "twal": 48126,
+ "tware": 5707,
+ "twc": 41217,
+ "twd": 29440,
+ "twd": 19343,
+ "twdfamily": 38218,
+ "twe": 18365,
+ "tweak": 48870,
+ "tweaks": 42661,
+ "twee": 1330,
+ "tweed": 26904,
+ "tweeps": 14928,
+ "tweet": 11826,
+ "tweet": 1842,
+ "tweeta": 32024,
+ "tweetapicture": 40596,
+ "tweeted": 7841,
+ "tweeter": 32876,
+ "tweeters": 31713,
+ "tweeting": 8901,
+ "tweets": 3560,
+ "tweetyour": 45033,
+ "twel": 14476,
+ "twelf": 39443,
+ "twelfth": 44072,
+ "twell": 38722,
+ "twell": 30162,
+ "twelve": 19694,
+ "twent": 27027,
+ "twenti": 35167,
+ "twenty": 13016,
+ "twentyon": 39609,
+ "twentyonepilots": 40007,
+ "twer": 13923,
+ "twerk": 28506,
+ "twi": 5537,
+ "twice": 6970,
+ "twick": 34326,
+ "twickenham": 39619,
+ "twil": 12804,
+ "twili": 35754,
+ "twilight": 46366,
+ "twilight": 14512,
+ "twill": 43703,
+ "twin": 9342,
+ "twin": 6769,
+ "twine": 42775,
+ "twinkle": 36545,
+ "twinning": 30156,
+ "twinpeaks": 32042,
+ "twins": 8040,
+ "twist": 10589,
+ "twisted": 18233,
+ "twister": 45933,
+ "twists": 34149,
+ "twit": 1643,
+ "twit": 18704,
+ "twitart": 27709,
+ "twitch": 13251,
+ "twitch": 9153,
+ "twitter": 7546,
+ "twitter": 1989,
+ "twitterkurds": 32722,
+ "twitterstorians": 35389,
+ "two": 17211,
+ "two": 1237,
+ "twol": 31964,
+ "twood": 40404,
+ "twood": 13245,
+ "twp": 33283,
+ "twright": 46778,
+ "twt": 6825,
+ "twx": 26830,
+ "twy": 45861,
+ "tx": 6636,
+ "tx": 5200,
+ "txhsfb": 34757,
+ "txlege": 26995,
+ "txst": 40761,
+ "txt": 24595,
+ "txwx": 22995,
+ "ty": 1260,
+ "ty": 744,
+ "tya": 41273,
+ "tycoon": 36803,
+ "tye": 43097,
+ "tyfree": 41215,
+ "tyga": 41952,
+ "tying": 22559,
+ "tyl": 47537,
+ "tyler": 14787,
+ "tyler": 7058,
+ "tym": 45772,
+ "tyne": 27000,
+ "tyne": 29729,
+ "tyour": 16823,
+ "type": 15673,
+ "type": 3877,
+ "typed": 40753,
+ "typeface": 44969,
+ "types": 7543,
+ "typewriter": 42180,
+ "typho": 17486,
+ "typhoon": 21110,
+ "typic": 21648,
+ "typical": 9854,
+ "typically": 23175,
+ "typing": 20102,
+ "typo": 18831,
+ "typo": 29076,
+ "typography": 24332,
+ "tyr": 15590,
+ "tyran": 46921,
+ "tyranny": 35402,
+ "tyre": 38330,
+ "tyre": 16864,
+ "tyres": 21376,
+ "tyrone": 30226,
+ "tyson": 16616,
+ "tz": 7710,
+ "tz": 4983,
+ "tzer": 45267,
+ "tzky": 47127,
+ "tzman": 46032,
+ "tzu": 34354,
+ "té": 27208,
+ "té": 39694,
+ "u": 84,
+ "u": 340,
+ "ua": 34075,
+ "ua": 8441,
+ "uaap": 46753,
+ "uaap": 43774,
+ "uab": 35587,
+ "uae": 9752,
+ "ual": 1921,
+ "ually": 10767,
+ "uan": 33062,
+ "uas": 38339,
+ "uav": 30303,
+ "ub": 18430,
+ "ub": 13494,
+ "uba": 29768,
+ "ubc": 42479,
+ "ubc": 29455,
+ "ube": 30892,
+ "uber": 25896,
+ "uber": 10668,
+ "ubi": 26758,
+ "ubio": 32867,
+ "ubiquit": 48129,
+ "ubis": 28248,
+ "ubisoft": 32051,
+ "ubs": 43851,
+ "ubun": 28184,
+ "ubuntu": 30791,
+ "uc": 4903,
+ "uc": 12438,
+ "uca": 30942,
+ "ucc": 44844,
+ "ucc": 29138,
+ "ucci": 30746,
+ "uccino": 30409,
+ "ucd": 44746,
+ "ucd": 43514,
+ "ucf": 24414,
+ "uch": 19465,
+ "uch": 22394,
+ "uchi": 37473,
+ "uci": 46354,
+ "uci": 28925,
+ "uck": 34189,
+ "ucl": 12013,
+ "ucl": 13647,
+ "ucla": 37667,
+ "ucla": 17259,
+ "ucn": 49036,
+ "uconn": 30549,
+ "ud": 6560,
+ "ud": 5765,
+ "uda": 22800,
+ "udaipur": 49385,
+ "uddin": 43035,
+ "ude": 37016,
+ "ude": 35194,
+ "ue": 16696,
+ "ue": 1190,
+ "uefa": 19189,
+ "uel": 24231,
+ "uer": 45951,
+ "ues": 2526,
+ "uf": 17777,
+ "uf": 19230,
+ "ufc": 20396,
+ "ufc": 6490,
+ "uff": 45701,
+ "ufo": 19443,
+ "ufos": 48234,
+ "ug": 3754,
+ "ug": 16061,
+ "uga": 16056,
+ "ugand": 25965,
+ "uganda": 11125,
+ "ugandan": 44206,
+ "ugby": 30658,
+ "ugh": 39736,
+ "ugh": 12755,
+ "ugliest": 43543,
+ "ugly": 36070,
+ "ugly": 8159,
+ "ugu": 18144,
+ "uh": 17661,
+ "uh": 9219,
+ "uhc": 44974,
+ "uhh": 35938,
+ "uhhh": 45270,
+ "uhm": 35614,
+ "uhur": 29434,
+ "uhuru": 35690,
+ "ui": 17326,
+ "ui": 11458,
+ "uil": 29395,
+ "uit": 30696,
+ "uit": 47584,
+ "uj": 33266,
+ "uji": 39672,
+ "uk": 2294,
+ "uk": 1432,
+ "uka": 23294,
+ "uke": 48836,
+ "uke": 28577,
+ "uked": 48987,
+ "uki": 37435,
+ "uki": 9009,
+ "ukin": 34996,
+ "ukip": 20360,
+ "uklabour": 36902,
+ "ukmfg": 38764,
+ "uko": 33562,
+ "ukone": 24682,
+ "ukrain": 15468,
+ "ukraine": 7768,
+ "ukrainian": 16927,
+ "ukrunchat": 34481,
+ "uku": 29541,
+ "uku": 36082,
+ "ukulele": 39094,
+ "ul": 914,
+ "ul": 6625,
+ "ula": 34104,
+ "ula": 9506,
+ "ular": 4927,
+ "ulary": 21701,
+ "ulate": 20467,
+ "ulation": 32896,
+ "ule": 35616,
+ "ules": 26274,
+ "ulf": 49331,
+ "uli": 41841,
+ "uli": 22174,
+ "ull": 33254,
+ "ulla": 30577,
+ "ullah": 45310,
+ "ullivan": 45252,
+ "ulls": 37418,
+ "ulo": 46084,
+ "ulo": 36738,
+ "ulous": 42490,
+ "ulous": 4281,
+ "ulously": 20167,
+ "ulster": 29709,
+ "ulster": 24639,
+ "ult": 4380,
+ "ulti": 11925,
+ "ulties": 21884,
+ "ultimat": 16522,
+ "ultimate": 34684,
+ "ultimate": 5377,
+ "ultimatefan": 48372,
+ "ultimatefanlive": 48644,
+ "ultimately": 23023,
+ "ultr": 25636,
+ "ultra": 11398,
+ "ultra": 8118,
+ "ultram": 44519,
+ "ultrasound": 29717,
+ "ulture": 22272,
+ "ulty": 8036,
+ "ulu": 41815,
+ "ulu": 15659,
+ "ulum": 17235,
+ "uly": 33220,
+ "ulysses": 46114,
+ "um": 1622,
+ "um": 1008,
+ "uma": 29982,
+ "uma": 9256,
+ "uman": 27112,
+ "umar": 25656,
+ "umass": 39390,
+ "umatic": 45006,
+ "umb": 7493,
+ "umber": 19195,
+ "umbrel": 34773,
+ "umbrella": 17143,
+ "umbrellas": 42782,
+ "umbria": 39287,
+ "umc": 39491,
+ "umd": 42067,
+ "ume": 38480,
+ "umen": 42832,
+ "uments": 25924,
+ "umer": 23539,
+ "umes": 21403,
+ "umi": 48772,
+ "umi": 15458,
+ "umich": 41294,
+ "umin": 31542,
+ "umm": 26129,
+ "umm": 21215,
+ "ummer": 47628,
+ "ummm": 33665,
+ "umni": 31739,
+ "ump": 22224,
+ "umpire": 36214,
+ "ums": 8643,
+ "umu": 39788,
+ "un": 569,
+ "un": 2271,
+ "una": 6385,
+ "unable": 17793,
+ "unacceptable": 25234,
+ "unanim": 20800,
+ "unanimous": 33520,
+ "unanimously": 31798,
+ "unanswered": 43611,
+ "unarmed": 41541,
+ "unas": 41366,
+ "unavailable": 48430,
+ "unaware": 33347,
+ "unbeat": 37056,
+ "unbeatable": 40267,
+ "unbeaten": 19228,
+ "unbeliev": 11383,
+ "unbelievable": 13306,
+ "unbelievably": 33781,
+ "unborn": 37257,
+ "unboxing": 32866,
+ "unbreakable": 32956,
+ "unbroken": 49271,
+ "unc": 24921,
+ "unc": 15322,
+ "uncanny": 32556,
+ "uncertain": 30384,
+ "uncertainty": 23956,
+ "unch": 1527,
+ "unchanged": 34272,
+ "uncharted": 34560,
+ "unci": 25521,
+ "unciation": 34117,
+ "uncle": 31537,
+ "uncle": 8002,
+ "unclear": 32955,
+ "uncles": 45335,
+ "uncomfortable": 22470,
+ "uncommon": 34888,
+ "uncondition": 46561,
+ "unconditional": 31112,
+ "unconscious": 34791,
+ "unconstitutional": 43585,
+ "unconventional": 39440,
+ "uncover": 33031,
+ "uncovered": 28234,
+ "uncture": 38736,
+ "uncut": 41056,
+ "und": 9762,
+ "und": 9732,
+ "unda": 39932,
+ "undant": 25377,
+ "unday": 29338,
+ "unde": 45226,
+ "undead": 40105,
+ "undecided": 49368,
+ "undefeated": 15326,
+ "undeni": 38424,
+ "under": 1473,
+ "under": 1798,
+ "underage": 45669,
+ "underattack": 35075,
+ "undercover": 21595,
+ "underdog": 44266,
+ "undere": 21675,
+ "underestim": 23348,
+ "underestimate": 31794,
+ "undergo": 31545,
+ "undergoing": 26419,
+ "undergrad": 38331,
+ "undergraduate": 24320,
+ "underground": 9396,
+ "undering": 30826,
+ "underlying": 31812,
+ "undermine": 42839,
+ "underneath": 20857,
+ "underrated": 19494,
+ "unders": 20376,
+ "understand": 47582,
+ "understand": 4600,
+ "understanding": 7522,
+ "understands": 21607,
+ "understatement": 38296,
+ "understood": 17303,
+ "undertaker": 40144,
+ "undertaking": 49067,
+ "undertale": 48283,
+ "underthe": 41161,
+ "underwater": 14760,
+ "underway": 6273,
+ "underwear": 21154,
+ "underwood": 21474,
+ "underworld": 34760,
+ "undi": 23845,
+ "undisclosed": 39334,
+ "undo": 35454,
+ "undocumented": 35414,
+ "undoub": 38836,
+ "undoubtedly": 42204,
+ "undp": 26691,
+ "une": 4522,
+ "une": 10966,
+ "unearth": 32716,
+ "unearthed": 36632,
+ "unemp": 15139,
+ "unemployed": 32721,
+ "unemployment": 19350,
+ "unes": 6394,
+ "unesco": 16216,
+ "uneven": 43204,
+ "unex": 9484,
+ "unexpe": 10802,
+ "unexpec": 31829,
+ "unexpected": 12293,
+ "unexpectedly": 35622,
+ "unf": 29285,
+ "unfair": 22193,
+ "unfinished": 26526,
+ "unfit": 45367,
+ "unfold": 38681,
+ "unfollow": 38797,
+ "unfor": 14010,
+ "unforgettable": 16173,
+ "unfortun": 10194,
+ "unfortunate": 22361,
+ "unfortunately": 12863,
+ "unfpa": 45048,
+ "ung": 10439,
+ "ung": 4334,
+ "unga": 19151,
+ "ungsoo": 25582,
+ "unh": 25365,
+ "unhappy": 26528,
+ "unhcr": 43451,
+ "unhealthy": 30994,
+ "uni": 1107,
+ "uni": 5926,
+ "unic": 7648,
+ "unicef": 38286,
+ "unicef": 19259,
+ "unicorn": 15660,
+ "unicorns": 35183,
+ "unidenti": 33707,
+ "unidentified": 35563,
+ "unification": 45036,
+ "unified": 20876,
+ "uniform": 11075,
+ "uniforms": 17838,
+ "unil": 32388,
+ "unilever": 48654,
+ "uniof": 21218,
+ "union": 14210,
+ "union": 3503,
+ "unions": 18353,
+ "unis": 30482,
+ "unis": 39266,
+ "unisex": 27609,
+ "unison": 46694,
+ "unit": 28522,
+ "unit": 5695,
+ "unite": 15078,
+ "unite": 11305,
+ "uniteblue": 20935,
+ "united": 10898,
+ "united": 2690,
+ "unitedstates": 39636,
+ "unitedway": 47486,
+ "unites": 32061,
+ "uniting": 31318,
+ "units": 10394,
+ "unity": 38300,
+ "unity": 8581,
+ "univ": 36680,
+ "univ": 14896,
+ "univer": 15574,
+ "univers": 5855,
+ "universal": 19148,
+ "universal": 8754,
+ "universe": 6104,
+ "universi": 41692,
+ "universit": 26019,
+ "universities": 16408,
+ "university": 40728,
+ "university": 2182,
+ "universityof": 46158,
+ "unk": 5542,
+ "unknown": 8685,
+ "unl": 43807,
+ "unlawful": 42305,
+ "unle": 19677,
+ "unlea": 23893,
+ "unleash": 26706,
+ "unleashed": 27955,
+ "unless": 10602,
+ "unlike": 16694,
+ "unlikely": 18904,
+ "unlimited": 11015,
+ "unlock": 18649,
+ "unlocked": 16770,
+ "unlocking": 40810,
+ "unlucky": 35029,
+ "unlv": 42283,
+ "unmanned": 36751,
+ "unmatched": 46054,
+ "unn": 38364,
+ "unnamed": 44985,
+ "unnecessary": 24100,
+ "unner": 31481,
+ "unning": 43282,
+ "unnoticed": 42807,
+ "uno": 32446,
+ "uno": 17078,
+ "unofficial": 22506,
+ "unpacking": 43589,
+ "unpaid": 32811,
+ "unparalleled": 44396,
+ "unplugged": 31724,
+ "unpopular": 40232,
+ "unprece": 23054,
+ "unprecedented": 23344,
+ "unpredictable": 38684,
+ "unra": 45150,
+ "unreal": 46980,
+ "unreal": 15636,
+ "unrelated": 38644,
+ "unreleased": 29654,
+ "unrest": 36452,
+ "uns": 25908,
+ "unsafe": 32071,
+ "unsc": 36395,
+ "unseen": 19069,
+ "unsigned": 39346,
+ "unsolved": 40836,
+ "unsplash": 46196,
+ "unstable": 34730,
+ "unstopp": 22105,
+ "unstoppable": 23484,
+ "unsuccessful": 47478,
+ "unsung": 33015,
+ "unsure": 26396,
+ "unt": 19654,
+ "unt": 6537,
+ "until": 1942,
+ "untitled": 21309,
+ "unto": 19801,
+ "untold": 32206,
+ "untouch": 44509,
+ "untouched": 42764,
+ "unused": 29636,
+ "unusual": 12613,
+ "unusually": 36465,
+ "unve": 6685,
+ "unveil": 20483,
+ "unveiled": 13572,
+ "unveiling": 20327,
+ "unveils": 15057,
+ "unwanted": 25285,
+ "unwind": 34064,
+ "unya": 37142,
+ "uo": 30874,
+ "uo": 36162,
+ "uof": 11155,
+ "uoft": 37329,
+ "uon": 48144,
+ "uous": 40185,
+ "up": 1083,
+ "up": 705,
+ "upa": 31727,
+ "upbeat": 39201,
+ "upcoming": 4196,
+ "upcycled": 46552,
+ "upd": 3226,
+ "update": 2491,
+ "updated": 5974,
+ "updates": 4904,
+ "updating": 22792,
+ "uper": 38082,
+ "uper": 33056,
+ "upfront": 42064,
+ "upgrade": 10365,
+ "upgraded": 18577,
+ "upgrades": 21253,
+ "upgrading": 34368,
+ "uph": 14128,
+ "uphill": 42767,
+ "uphol": 26195,
+ "uphold": 43897,
+ "upholstery": 44556,
+ "upl": 41939,
+ "uplift": 45389,
+ "uplifting": 29546,
+ "upload": 13968,
+ "uploaded": 16793,
+ "uploading": 30145,
+ "upon": 23524,
+ "upon": 5067,
+ "upp": 19549,
+ "upp": 45946,
+ "upper": 22465,
+ "upper": 7067,
+ "upri": 15982,
+ "upright": 29818,
+ "uprising": 26006,
+ "upro": 28922,
+ "ups": 6926,
+ "upscale": 47501,
+ "upset": 11214,
+ "upsets": 42637,
+ "upside": 15362,
+ "upstairs": 21387,
+ "upstate": 33335,
+ "upstream": 45517,
+ "upthe": 31510,
+ "upto": 26575,
+ "upton": 31910,
+ "uptown": 23807,
+ "upward": 32526,
+ "upwards": 34915,
+ "uq": 39591,
+ "ur": 565,
+ "ur": 1775,
+ "ura": 29337,
+ "ura": 3544,
+ "urable": 40194,
+ "ural": 23547,
+ "ural": 33948,
+ "uran": 16197,
+ "uranium": 29850,
+ "urban": 7931,
+ "urban": 5800,
+ "urbanart": 40834,
+ "urd": 47880,
+ "urday": 19742,
+ "urdu": 29976,
+ "ure": 5514,
+ "ure": 726,
+ "ured": 4210,
+ "urer": 20864,
+ "ures": 2288,
+ "urg": 35995,
+ "urge": 14852,
+ "urged": 23790,
+ "urgency": 47612,
+ "urgent": 13693,
+ "urgently": 34534,
+ "urges": 16692,
+ "urging": 27748,
+ "uri": 11052,
+ "uri": 8699,
+ "urie": 46429,
+ "urin": 45245,
+ "urine": 28864,
+ "uring": 1351,
+ "url": 23464,
+ "urn": 38075,
+ "uro": 17343,
+ "uro": 5925,
+ "urology": 48585,
+ "urope": 14918,
+ "urs": 4794,
+ "urself": 31942,
+ "urst": 19181,
+ "urstruly": 34751,
+ "urstrulymahesh": 35314,
+ "ursula": 38390,
+ "urt": 24309,
+ "uru": 16322,
+ "uru": 11768,
+ "uruguay": 27931,
+ "urus": 14246,
+ "urve": 24583,
+ "ury": 8642,
+ "ury": 2106,
+ "us": 904,
+ "us": 718,
+ "usa": 9491,
+ "usa": 2547,
+ "usability": 46736,
+ "usable": 22890,
+ "usaf": 25017,
+ "usage": 19137,
+ "usaid": 34507,
+ "usair": 36742,
+ "usairforce": 42179,
+ "usarmy": 19132,
+ "usatoday": 40263,
+ "usav": 36056,
+ "usb": 10281,
+ "usc": 13346,
+ "usc": 14995,
+ "uscg": 43932,
+ "usd": 7485,
+ "usda": 25829,
+ "use": 4419,
+ "use": 1483,
+ "used": 32289,
+ "used": 2026,
+ "useful": 9784,
+ "useless": 20154,
+ "usemb": 39700,
+ "user": 21248,
+ "user": 7031,
+ "username": 28162,
+ "users": 7433,
+ "uses": 5282,
+ "useum": 45189,
+ "usf": 32385,
+ "usf": 28942,
+ "usgs": 35103,
+ "ush": 12001,
+ "ush": 18335,
+ "usher": 27411,
+ "ushi": 47734,
+ "usi": 25540,
+ "usic": 34909,
+ "usic": 16753,
+ "using": 1996,
+ "usky": 45778,
+ "usl": 42113,
+ "usm": 40041,
+ "usmc": 21678,
+ "usmnt": 30662,
+ "usn": 40579,
+ "usnavy": 24500,
+ "usnews": 43752,
+ "uso": 21539,
+ "usopen": 21782,
+ "usp": 26651,
+ "usps": 39980,
+ "usrc": 33274,
+ "uss": 11545,
+ "uss": 9260,
+ "ussia": 29553,
+ "ussoccer": 42828,
+ "ussr": 32697,
+ "ust": 35501,
+ "ust": 24725,
+ "usu": 4254,
+ "usu": 40434,
+ "usual": 6129,
+ "usually": 8296,
+ "usur": 45582,
+ "uswnt": 35255,
+ "ut": 1419,
+ "ut": 3641,
+ "uta": 42706,
+ "uta": 25925,
+ "utah": 27474,
+ "utah": 9312,
+ "utc": 18196,
+ "utd": 10493,
+ "ute": 16856,
+ "ute": 3130,
+ "uten": 32089,
+ "uter": 39197,
+ "utes": 2850,
+ "uth": 48819,
+ "uth": 44750,
+ "uti": 24568,
+ "util": 28824,
+ "utili": 17015,
+ "utilities": 27210,
+ "utility": 14941,
+ "utilize": 36861,
+ "utilized": 47604,
+ "utilizing": 40212,
+ "utm": 47853,
+ "utmost": 42352,
+ "uto": 18866,
+ "uto": 13683,
+ "utopia": 34433,
+ "utpol": 42605,
+ "utr": 48726,
+ "utrecht": 37216,
+ "uts": 11740,
+ "utsa": 37528,
+ "utt": 17096,
+ "uttar": 40168,
+ "uttarak": 33755,
+ "uttarakhand": 35655,
+ "utter": 18769,
+ "utter": 24558,
+ "utterly": 21353,
+ "utto": 42183,
+ "utv": 36351,
+ "utz": 45320,
+ "uu": 5702,
+ "uu": 14553,
+ "uuu": 44355,
+ "uuu": 27656,
+ "uuuu": 16720,
+ "uuuu": 40797,
+ "uv": 23777,
+ "uv": 15977,
+ "uva": 23908,
+ "uw": 13933,
+ "uw": 19166,
+ "uwe": 48785,
+ "uwu": 35544,
+ "ux": 9251,
+ "ux": 6213,
+ "uy": 31929,
+ "uy": 48113,
+ "uz": 19398,
+ "uz": 36991,
+ "uzbe": 43007,
+ "uzbekistan": 45024,
+ "uzzi": 48210,
+ "v": 85,
+ "v": 341,
+ "va": 4648,
+ "va": 1892,
+ "vaa": 37488,
+ "vable": 23088,
+ "vac": 3125,
+ "vac": 34085,
+ "vaca": 48215,
+ "vacancies": 26333,
+ "vacancy": 21247,
+ "vacant": 25262,
+ "vacation": 28336,
+ "vacation": 6561,
+ "vacations": 29002,
+ "vacay": 44716,
+ "vacc": 13342,
+ "vaccin": 19164,
+ "vaccinated": 48134,
+ "vaccination": 32518,
+ "vaccine": 47780,
+ "vaccine": 17493,
+ "vaccines": 25860,
+ "vach": 46211,
+ "vacu": 16058,
+ "vacuum": 18420,
+ "vad": 11880,
+ "vada": 46759,
+ "vader": 21908,
+ "vae": 39384,
+ "vag": 13015,
+ "vague": 42154,
+ "vah": 26921,
+ "vai": 26893,
+ "vai": 36802,
+ "vail": 21189,
+ "vain": 25538,
+ "vais": 28719,
+ "vaj": 34206,
+ "vak": 16288,
+ "vak": 41597,
+ "val": 1214,
+ "val": 1560,
+ "vala": 48525,
+ "valdez": 40617,
+ "vale": 35554,
+ "vale": 10820,
+ "valedic": 43525,
+ "valen": 12630,
+ "valence": 30225,
+ "valenci": 34183,
+ "valencia": 16559,
+ "valent": 3655,
+ "valent": 15300,
+ "valentin": 48631,
+ "valentina": 43741,
+ "valentine": 11208,
+ "valentine": 5876,
+ "valentines": 10259,
+ "valentinesday": 12369,
+ "valentino": 29624,
+ "valeri": 31951,
+ "valerie": 25592,
+ "valet": 45749,
+ "vali": 8230,
+ "valiant": 33804,
+ "valid": 15126,
+ "validation": 32536,
+ "valkyrie": 42326,
+ "vall": 23523,
+ "vall": 35295,
+ "vallarta": 47874,
+ "valle": 24857,
+ "valle": 29105,
+ "valley": 18354,
+ "valley": 3136,
+ "valleys": 28649,
+ "valor": 30930,
+ "vals": 7431,
+ "valu": 6291,
+ "valuable": 10056,
+ "valuation": 25894,
+ "value": 41358,
+ "value": 4602,
+ "valued": 17801,
+ "values": 8857,
+ "valve": 17001,
+ "valves": 33517,
+ "vam": 9983,
+ "vamo": 46718,
+ "vamos": 30346,
+ "vamp": 10680,
+ "vampi": 47017,
+ "vampire": 47576,
+ "vampire": 13220,
+ "vampires": 30868,
+ "vamps": 44810,
+ "van": 2446,
+ "van": 2451,
+ "vana": 20543,
+ "vanc": 6320,
+ "vance": 31447,
+ "vancou": 6750,
+ "vancouver": 31904,
+ "vancouver": 7208,
+ "vand": 11691,
+ "vandalism": 45664,
+ "vander": 16264,
+ "vanderbilt": 33524,
+ "vandy": 39268,
+ "vane": 43828,
+ "vaness": 13328,
+ "vanessa": 16836,
+ "vangogh": 47849,
+ "vanguard": 27916,
+ "vani": 15396,
+ "vani": 26459,
+ "vania": 10998,
+ "vanilla": 11974,
+ "vanished": 43783,
+ "vanishing": 48296,
+ "vanity": 48353,
+ "vanity": 22938,
+ "vans": 11711,
+ "vant": 26298,
+ "vantage": 31749,
+ "vanu": 42892,
+ "vanuatu": 48766,
+ "vap": 10462,
+ "vape": 25423,
+ "vape": 20219,
+ "vaping": 29403,
+ "vapor": 37167,
+ "vapor": 30729,
+ "vapori": 46183,
+ "var": 3187,
+ "var": 12998,
+ "vara": 47492,
+ "varan": 36585,
+ "varanasi": 39364,
+ "vard": 21866,
+ "vard": 8773,
+ "vardy": 47371,
+ "vare": 38159,
+ "vares": 42895,
+ "vargas": 32752,
+ "vari": 3354,
+ "variable": 26416,
+ "varian": 34334,
+ "variant": 20293,
+ "variants": 38312,
+ "variation": 26420,
+ "variations": 29025,
+ "varied": 32334,
+ "varies": 32543,
+ "varieties": 23805,
+ "variety": 8396,
+ "various": 7395,
+ "varsity": 43716,
+ "varsity": 8574,
+ "varun": 48120,
+ "varun": 22069,
+ "vary": 18855,
+ "varying": 36456,
+ "vas": 5669,
+ "vas": 5995,
+ "vasc": 40995,
+ "vascular": 19218,
+ "vase": 20431,
+ "vasi": 49092,
+ "vast": 24413,
+ "vast": 16414,
+ "vastly": 48257,
+ "vat": 11588,
+ "vat": 18363,
+ "vatican": 21030,
+ "vation": 37884,
+ "vau": 6391,
+ "vaugh": 25158,
+ "vaughan": 21392,
+ "vaughn": 29013,
+ "vaul": 27469,
+ "vault": 15240,
+ "vaus": 40217,
+ "vaux": 27403,
+ "vauxhall": 29173,
+ "vaw": 47952,
+ "vay": 48000,
+ "vaz": 38142,
+ "vb": 29365,
+ "vb": 8778,
+ "vball": 38329,
+ "vc": 28670,
+ "vc": 7952,
+ "vcs": 43528,
+ "vcu": 40102,
+ "vd": 9515,
+ "vday": 42055,
+ "ve": 673,
+ "ve": 563,
+ "vea": 43798,
+ "veal": 36616,
+ "veau": 24419,
+ "vec": 19912,
+ "vector": 40453,
+ "vector": 21533,
+ "ved": 19515,
+ "ved": 1102,
+ "veda": 44401,
+ "vedere": 45660,
+ "vedi": 47971,
+ "vee": 35708,
+ "vee": 17073,
+ "veen": 22432,
+ "veer": 21243,
+ "veer": 22058,
+ "veg": 9048,
+ "veg": 16460,
+ "vega": 22930,
+ "vegan": 15705,
+ "vegan": 5615,
+ "vegans": 48514,
+ "vegas": 20288,
+ "vegas": 4413,
+ "vege": 6219,
+ "vegetable": 15725,
+ "vegetables": 14119,
+ "vegetarian": 14600,
+ "vegetation": 33947,
+ "veggie": 19401,
+ "veggies": 16767,
+ "vehic": 3973,
+ "vehicle": 5299,
+ "vehicles": 8361,
+ "veil": 23516,
+ "vein": 29169,
+ "veins": 28867,
+ "veit": 30620,
+ "vel": 942,
+ "vel": 1287,
+ "vela": 34898,
+ "veld": 34011,
+ "veled": 15370,
+ "veli": 49166,
+ "veling": 37970,
+ "vell": 21173,
+ "vell": 32997,
+ "velo": 14357,
+ "velo": 33850,
+ "velocity": 23811,
+ "vels": 5109,
+ "velve": 37849,
+ "velvet": 11063,
+ "vely": 1708,
+ "vember": 3477,
+ "vement": 3129,
+ "vements": 11104,
+ "ven": 1240,
+ "ven": 1638,
+ "vena": 47442,
+ "vend": 10851,
+ "vending": 29202,
+ "vendor": 21261,
+ "vendors": 20353,
+ "vene": 5365,
+ "veness": 10516,
+ "venetian": 34336,
+ "venezia": 34139,
+ "venezu": 10939,
+ "venezuela": 12839,
+ "venezuelan": 34699,
+ "veng": 31526,
+ "venge": 27757,
+ "vengeance": 32057,
+ "veni": 31142,
+ "venice": 11010,
+ "vening": 47532,
+ "venison": 40037,
+ "venom": 42491,
+ "venom": 21588,
+ "vens": 20884,
+ "vent": 4373,
+ "vent": 5687,
+ "ventil": 39522,
+ "ventilation": 35066,
+ "venting": 15731,
+ "vention": 4122,
+ "vents": 12833,
+ "ventu": 48217,
+ "ventura": 20921,
+ "venture": 37046,
+ "venture": 12543,
+ "ventures": 20829,
+ "venue": 5097,
+ "venues": 18120,
+ "venus": 14691,
+ "ver": 624,
+ "ver": 667,
+ "vera": 13350,
+ "verage": 3725,
+ "verb": 34952,
+ "verbal": 26522,
+ "verbally": 39985,
+ "verbs": 45687,
+ "verde": 16935,
+ "verdi": 42306,
+ "verdict": 18030,
+ "vere": 11135,
+ "vere": 34707,
+ "vered": 2868,
+ "verge": 23913,
+ "veri": 11638,
+ "verification": 33521,
+ "verified": 22555,
+ "verify": 34722,
+ "vering": 4630,
+ "veriz": 19707,
+ "verizon": 21532,
+ "verma": 41261,
+ "vermont": 19241,
+ "vern": 2214,
+ "vern": 12586,
+ "verne": 45553,
+ "vernon": 18348,
+ "vero": 45217,
+ "vero": 38208,
+ "verona": 31819,
+ "veronic": 39551,
+ "veronica": 24039,
+ "vers": 1219,
+ "vers": 2094,
+ "versa": 35765,
+ "versace": 25422,
+ "versail": 29857,
+ "versailles": 32129,
+ "versary": 2940,
+ "versatile": 18110,
+ "versatility": 41340,
+ "verse": 39466,
+ "verse": 3131,
+ "verses": 30769,
+ "versi": 8934,
+ "version": 3273,
+ "versions": 16190,
+ "versity": 1906,
+ "verst": 42484,
+ "verstappen": 45064,
+ "versus": 14548,
+ "versy": 18522,
+ "vert": 11742,
+ "verte": 35158,
+ "verted": 48173,
+ "verti": 30459,
+ "vertical": 14293,
+ "vertigo": 42477,
+ "verton": 40632,
+ "verts": 37265,
+ "very": 11698,
+ "very": 1070,
+ "veryday": 37944,
+ "verything": 45174,
+ "ves": 9616,
+ "ves": 1003,
+ "vesmatter": 47636,
+ "vespa": 46029,
+ "vessel": 16387,
+ "vessels": 22822,
+ "vest": 31657,
+ "vest": 12473,
+ "vesti": 40349,
+ "vests": 41906,
+ "vet": 12294,
+ "vet": 5951,
+ "veter": 4330,
+ "veteran": 20797,
+ "veteran": 8814,
+ "veterans": 7092,
+ "veteransday": 26409,
+ "veterin": 43959,
+ "veterinary": 25458,
+ "veto": 36570,
+ "vets": 13113,
+ "vette": 17045,
+ "vettel": 28700,
+ "vevo": 35141,
+ "vex": 36187,
+ "vex": 43978,
+ "vey": 34792,
+ "vey": 3884,
+ "vez": 35987,
+ "vez": 17226,
+ "vf": 25966,
+ "vfl": 33726,
+ "vfx": 30149,
+ "vg": 40591,
+ "vg": 22346,
+ "vh": 46953,
+ "vh": 23847,
+ "vhs": 21932,
+ "vi": 603,
+ "vi": 4259,
+ "via": 1048,
+ "viable": 25752,
+ "viadu": 37012,
+ "viaduct": 39113,
+ "vial": 39951,
+ "vian": 40487,
+ "vian": 16124,
+ "vibe": 37974,
+ "vibe": 12813,
+ "vibes": 7764,
+ "vibr": 9527,
+ "vibrant": 14270,
+ "vibration": 37456,
+ "vibrations": 43660,
+ "vic": 1555,
+ "vic": 4412,
+ "vica": 46168,
+ "vicar": 43899,
+ "vice": 43572,
+ "vice": 6931,
+ "vicente": 39411,
+ "vices": 8332,
+ "vich": 24143,
+ "vici": 46670,
+ "vicious": 25177,
+ "vick": 15116,
+ "vick": 29704,
+ "vickers": 48452,
+ "vicki": 34927,
+ "vicky": 37176,
+ "vicky": 25788,
+ "victi": 6861,
+ "victim": 9133,
+ "victims": 7131,
+ "victor": 2423,
+ "victor": 10690,
+ "victori": 17555,
+ "victoria": 39286,
+ "victoria": 6127,
+ "victorian": 12350,
+ "victorias": 47791,
+ "victories": 24577,
+ "victorious": 24033,
+ "victory": 36668,
+ "victory": 4127,
+ "vid": 17233,
+ "vid": 9284,
+ "vida": 19015,
+ "vidal": 36678,
+ "vide": 1334,
+ "vide": 45244,
+ "video": 9478,
+ "video": 1455,
+ "videogame": 35097,
+ "videogames": 21149,
+ "videos": 6081,
+ "vids": 23035,
+ "vidy": 29639,
+ "vidya": 45264,
+ "vie": 922,
+ "vie": 8538,
+ "vien": 36493,
+ "vienna": 12670,
+ "vier": 15352,
+ "vier": 11987,
+ "viera": 21114,
+ "viernes": 33826,
+ "vies": 22458,
+ "viest": 31979,
+ "viet": 17558,
+ "viet": 13128,
+ "vietnam": 19558,
+ "vietnam": 8623,
+ "vietnamese": 22382,
+ "view": 12004,
+ "view": 1093,
+ "viewed": 7226,
+ "viewer": 15061,
+ "viewers": 14275,
+ "viewing": 7124,
+ "viewpoint": 41604,
+ "views": 2758,
+ "vig": 8549,
+ "vig": 45083,
+ "vigil": 21538,
+ "vigil": 19896,
+ "vigilant": 43026,
+ "vigne": 40447,
+ "vigne": 34581,
+ "vigo": 44097,
+ "vigor": 26781,
+ "vii": 17759,
+ "viii": 20414,
+ "vijay": 12014,
+ "vijay": 10823,
+ "vijaysethu": 47966,
+ "vik": 10764,
+ "vik": 17181,
+ "vika": 39562,
+ "vikas": 37116,
+ "viking": 26663,
+ "viking": 15897,
+ "vikings": 11713,
+ "vikram": 41136,
+ "vikram": 24314,
+ "viktor": 36101,
+ "vil": 1338,
+ "vil": 3000,
+ "vila": 37505,
+ "vile": 27247,
+ "vill": 10481,
+ "vill": 45698,
+ "villa": 3203,
+ "villa": 7754,
+ "village": 34584,
+ "village": 4331,
+ "villagers": 34283,
+ "villages": 17621,
+ "villain": 15425,
+ "villains": 25271,
+ "villanova": 44025,
+ "villar": 35164,
+ "villas": 28907,
+ "ville": 11110,
+ "ville": 1930,
+ "villen": 46177,
+ "villi": 36907,
+ "vimeo": 48720,
+ "vin": 1379,
+ "vin": 2558,
+ "vina": 35682,
+ "vinai": 37396,
+ "vinaigrette": 39876,
+ "vinay": 43952,
+ "vince": 32429,
+ "vince": 6236,
+ "vincen": 33402,
+ "vincent": 29069,
+ "vincent": 10357,
+ "vinci": 30199,
+ "vind": 20275,
+ "vindic": 39582,
+ "vine": 8471,
+ "vine": 7721,
+ "vinegar": 23834,
+ "vines": 21268,
+ "vineyard": 16527,
+ "vineyards": 23082,
+ "ving": 5375,
+ "ving": 903,
+ "vingne": 42579,
+ "vings": 22510,
+ "vini": 48119,
+ "vinnie": 40885,
+ "vinny": 36794,
+ "vino": 14509,
+ "vinod": 43348,
+ "vins": 34820,
+ "vinson": 45945,
+ "vintag": 10936,
+ "vintage": 13654,
+ "vintage": 3266,
+ "viny": 40990,
+ "vinyl": 22835,
+ "vinyl": 5754,
+ "vio": 11913,
+ "vio": 20324,
+ "viol": 3164,
+ "viola": 27438,
+ "violate": 44875,
+ "violated": 38192,
+ "violating": 37554,
+ "violation": 22919,
+ "violations": 21969,
+ "violence": 5450,
+ "violent": 11565,
+ "violently": 47758,
+ "violet": 16118,
+ "violets": 42861,
+ "violin": 17058,
+ "violinist": 36299,
+ "vion": 35496,
+ "vious": 6418,
+ "viously": 7149,
+ "vip": 45714,
+ "vip": 7111,
+ "viper": 27401,
+ "vips": 41149,
+ "vir": 1790,
+ "vir": 25319,
+ "vira": 35910,
+ "viral": 11653,
+ "virat": 32473,
+ "virgil": 39076,
+ "virgin": 5651,
+ "virgin": 12103,
+ "virgini": 43426,
+ "virginia": 6728,
+ "virgo": 39978,
+ "viro": 32301,
+ "viron": 38309,
+ "virtu": 7977,
+ "virtual": 18059,
+ "virtual": 7790,
+ "virtually": 22475,
+ "virtualreality": 32608,
+ "virtue": 26860,
+ "virtues": 42167,
+ "virtuoso": 47027,
+ "virus": 11808,
+ "viruses": 34830,
+ "vis": 1301,
+ "vis": 5337,
+ "visa": 12802,
+ "visas": 41228,
+ "vise": 24977,
+ "vised": 14810,
+ "vish": 12024,
+ "vish": 29124,
+ "vishal": 33648,
+ "vishnu": 37816,
+ "visi": 1409,
+ "visibility": 15921,
+ "visible": 36658,
+ "visible": 8626,
+ "vising": 37439,
+ "vision": 11147,
+ "vision": 2515,
+ "visional": 24627,
+ "visionary": 22959,
+ "visions": 13804,
+ "visit": 3388,
+ "visit": 1600,
+ "visitation": 44370,
+ "visited": 5580,
+ "visiting": 4680,
+ "visitor": 13881,
+ "visitors": 9160,
+ "visits": 8489,
+ "visitscotland": 28760,
+ "visitspain": 48860,
+ "vism": 15514,
+ "viso": 46732,
+ "visor": 24217,
+ "vist": 21436,
+ "vista": 13865,
+ "visu": 7739,
+ "visual": 17004,
+ "visual": 7195,
+ "visualization": 28500,
+ "visualize": 45057,
+ "visually": 25743,
+ "visuals": 21315,
+ "viswas": 36513,
+ "viswasam": 47664,
+ "vit": 4056,
+ "vit": 35580,
+ "vita": 15700,
+ "vital": 32525,
+ "vital": 10585,
+ "vitality": 36385,
+ "vitam": 9856,
+ "vitamin": 13675,
+ "vitamins": 22582,
+ "vito": 36725,
+ "vity": 4893,
+ "vitz": 26188,
+ "vius": 41571,
+ "viv": 21827,
+ "viv": 35363,
+ "viva": 17399,
+ "vival": 35920,
+ "vive": 18980,
+ "vive": 24004,
+ "vivek": 36243,
+ "vivi": 11625,
+ "vivian": 30129,
+ "vivid": 22984,
+ "vivo": 28091,
+ "vivo": 25888,
+ "vix": 28976,
+ "vix": 34811,
+ "vixen": 38757,
+ "vixx": 32106,
+ "viz": 28251,
+ "viz": 31786,
+ "vj": 45439,
+ "vj": 30827,
+ "vk": 41893,
+ "vl": 37580,
+ "vl": 36442,
+ "vla": 23686,
+ "vlad": 41089,
+ "vladi": 19320,
+ "vladimir": 21702,
+ "vlive": 46797,
+ "vlog": 18894,
+ "vm": 16204,
+ "vm": 20269,
+ "vma": 35666,
+ "vmas": 30236,
+ "vmware": 29615,
+ "vn": 47098,
+ "vn": 25076,
+ "vo": 947,
+ "vo": 3951,
+ "voc": 4105,
+ "voc": 20855,
+ "vocab": 21346,
+ "vocabulary": 23804,
+ "vocal": 34037,
+ "vocal": 13147,
+ "vocali": 19134,
+ "vocalist": 22102,
+ "vocals": 17666,
+ "vocation": 20521,
+ "vocational": 33751,
+ "vod": 11820,
+ "vod": 35854,
+ "vodaf": 28436,
+ "vodafone": 38695,
+ "vodka": 13646,
+ "vogel": 44960,
+ "vogue": 24418,
+ "vogue": 13178,
+ "voic": 29185,
+ "voice": 13179,
+ "voice": 3386,
+ "voiced": 34352,
+ "voiceof": 44966,
+ "voiceover": 41979,
+ "voices": 9144,
+ "void": 21561,
+ "voip": 42762,
+ "voir": 16036,
+ "vol": 1343,
+ "vol": 7945,
+ "volatile": 41022,
+ "volatility": 32355,
+ "volcan": 9916,
+ "volcanic": 24072,
+ "volcano": 14581,
+ "volcanoes": 38055,
+ "voli": 40138,
+ "volk": 13432,
+ "volkswag": 14407,
+ "volkswagen": 15342,
+ "volley": 7130,
+ "volley": 34656,
+ "volleyball": 7458,
+ "volo": 44791,
+ "vols": 20404,
+ "volt": 26430,
+ "volta": 29879,
+ "volta": 33480,
+ "voltage": 23118,
+ "voltron": 39314,
+ "volu": 3563,
+ "volume": 8284,
+ "volumes": 22651,
+ "volun": 3356,
+ "voluntar": 48823,
+ "voluntary": 23815,
+ "volunte": 3556,
+ "volunteer": 32331,
+ "volunteer": 7114,
+ "volunteered": 34000,
+ "volunteering": 14902,
+ "volunteers": 5939,
+ "volution": 24043,
+ "volved": 42888,
+ "volvo": 39991,
+ "volvo": 16906,
+ "vom": 24198,
+ "vomit": 46485,
+ "von": 11269,
+ "von": 8497,
+ "voo": 19497,
+ "voodoo": 26869,
+ "voor": 34291,
+ "voor": 34464,
+ "vor": 8338,
+ "vor": 5308,
+ "vore": 18215,
+ "vortex": 30071,
+ "vos": 16863,
+ "vot": 48558,
+ "vote": 6830,
+ "vote": 2187,
+ "voted": 6454,
+ "votel": 41379,
+ "voter": 44474,
+ "voter": 14065,
+ "voters": 8925,
+ "votes": 6693,
+ "voting": 5756,
+ "vou": 11045,
+ "voucher": 18190,
+ "vouchers": 23384,
+ "vous": 10636,
+ "vow": 34787,
+ "vows": 21677,
+ "vox": 29215,
+ "vox": 22692,
+ "voy": 10622,
+ "voy": 15021,
+ "voyage": 16299,
+ "voyager": 29669,
+ "vp": 32758,
+ "vp": 3896,
+ "vpn": 38212,
+ "vr": 16840,
+ "vr": 5921,
+ "vre": 44500,
+ "vre": 17501,
+ "vs": 11385,
+ "vs": 1547,
+ "vsco": 26752,
+ "vsco": 32822,
+ "vscocam": 34694,
+ "vsky": 37791,
+ "vss": 31919,
+ "vt": 31732,
+ "vt": 10291,
+ "vu": 8664,
+ "vu": 13230,
+ "vue": 43915,
+ "vue": 19313,
+ "vuel": 31312,
+ "vuelta": 43856,
+ "vuitton": 26705,
+ "vul": 6856,
+ "vulcan": 34767,
+ "vulner": 11213,
+ "vulnerability": 28797,
+ "vulnerable": 14332,
+ "vulture": 34593,
+ "vultures": 47197,
+ "vv": 19264,
+ "vv": 35686,
+ "vw": 28650,
+ "vw": 13250,
+ "vx": 47644,
+ "vy": 11566,
+ "vy": 5157,
+ "w": 86,
+ "w": 342,
+ "wa": 869,
+ "wa": 2663,
+ "waa": 35874,
+ "wab": 19893,
+ "wab": 36852,
+ "wac": 27445,
+ "wac": 37947,
+ "wack": 22880,
+ "wack": 38270,
+ "wacky": 34318,
+ "waco": 36035,
+ "wad": 11133,
+ "wad": 30451,
+ "wada": 40006,
+ "wade": 40237,
+ "wade": 14180,
+ "wadi": 37253,
+ "waf": 17638,
+ "wafc": 49086,
+ "waff": 13940,
+ "waffle": 20375,
+ "waffles": 24205,
+ "wag": 5764,
+ "wag": 19177,
+ "wage": 10716,
+ "wager": 43430,
+ "wages": 19114,
+ "wagner": 18081,
+ "wagon": 13260,
+ "wagons": 47944,
+ "wags": 48580,
+ "wah": 24812,
+ "wah": 18014,
+ "wahl": 27500,
+ "wahlberg": 35151,
+ "wahoo": 47995,
+ "wai": 11469,
+ "wai": 21569,
+ "waifu": 46551,
+ "waikiki": 44907,
+ "wain": 28358,
+ "wain": 20120,
+ "wainwright": 45878,
+ "waist": 36946,
+ "waist": 18459,
+ "wait": 10021,
+ "wait": 1885,
+ "waite": 24272,
+ "waited": 18492,
+ "waiter": 32946,
+ "waitin": 44482,
+ "waiting": 2680,
+ "waitress": 39760,
+ "waitrose": 37164,
+ "waits": 21361,
+ "waiver": 42866,
+ "waj": 49367,
+ "wak": 11172,
+ "wak": 36015,
+ "waka": 42696,
+ "wake": 10501,
+ "wake": 5731,
+ "wakefield": 26358,
+ "wakes": 29108,
+ "wakeup": 26328,
+ "wakeup": 35380,
+ "wakeupamerica": 37474,
+ "waking": 13025,
+ "wal": 1056,
+ "wal": 6903,
+ "wala": 16468,
+ "walang": 49180,
+ "walcott": 45744,
+ "wald": 46930,
+ "wald": 15724,
+ "walden": 39311,
+ "waldo": 32440,
+ "waldorf": 38227,
+ "wale": 41247,
+ "wale": 20336,
+ "wales": 25383,
+ "wales": 5110,
+ "walgreens": 38490,
+ "wali": 37576,
+ "wali": 14768,
+ "walia": 44455,
+ "walk": 8588,
+ "walk": 2374,
+ "walkaway": 48255,
+ "walked": 8667,
+ "walker": 24735,
+ "walker": 6150,
+ "walkers": 23366,
+ "walkin": 45792,
+ "walking": 12644,
+ "walking": 3941,
+ "walkingdead": 14948,
+ "walkout": 47470,
+ "walks": 8192,
+ "walkway": 36614,
+ "wall": 4316,
+ "wall": 2569,
+ "walla": 26007,
+ "walla": 39982,
+ "wallabies": 48926,
+ "wallace": 12535,
+ "wallart": 36223,
+ "walled": 36567,
+ "waller": 45340,
+ "wallet": 12154,
+ "wallets": 38550,
+ "walleye": 49099,
+ "wallis": 42206,
+ "wallpaper": 10560,
+ "wallpapers": 29841,
+ "walls": 8258,
+ "wallstreet": 45341,
+ "wally": 26024,
+ "walmart": 11972,
+ "walnut": 16310,
+ "walnuts": 38294,
+ "walsall": 42935,
+ "walsh": 12856,
+ "walt": 23535,
+ "walt": 14312,
+ "waltdisneyworld": 36505,
+ "walter": 31156,
+ "walter": 10645,
+ "walters": 25532,
+ "waltham": 42742,
+ "waltham": 45581,
+ "walton": 19485,
+ "waltz": 35982,
+ "wam": 20503,
+ "wamy": 46970,
+ "wan": 2060,
+ "wan": 4557,
+ "wana": 30830,
+ "wand": 14636,
+ "wand": 28559,
+ "wanda": 25070,
+ "wander": 12985,
+ "wander": 24473,
+ "wandered": 46593,
+ "wanderers": 27540,
+ "wandering": 22597,
+ "wanderlust": 16129,
+ "wane": 27459,
+ "wang": 19731,
+ "wang": 11900,
+ "wani": 21674,
+ "wankers": 42189,
+ "wann": 23622,
+ "wanna": 35940,
+ "wanna": 3836,
+ "wannabe": 40730,
+ "wannaone": 44832,
+ "want": 18356,
+ "want": 1280,
+ "wanted": 3146,
+ "wanting": 12801,
+ "wants": 3107,
+ "wap": 27393,
+ "wap": 30368,
+ "waq": 47512,
+ "war": 984,
+ "war": 2238,
+ "wara": 21631,
+ "warbler": 33891,
+ "warcraft": 13660,
+ "ward": 7728,
+ "ward": 1460,
+ "warden": 27798,
+ "wardly": 30780,
+ "wardro": 14247,
+ "wardrobe": 15020,
+ "wards": 2593,
+ "ware": 7416,
+ "ware": 4476,
+ "wareagle": 35716,
+ "warehouse": 13054,
+ "wareness": 41601,
+ "wareness": 35870,
+ "wares": 30692,
+ "warfare": 15739,
+ "warhammer": 26832,
+ "warhol": 27554,
+ "wari": 20977,
+ "wark": 46346,
+ "wark": 15164,
+ "warlock": 42455,
+ "warm": 14725,
+ "warm": 3616,
+ "warmed": 36695,
+ "warmer": 14328,
+ "warmest": 30910,
+ "warming": 8606,
+ "warmly": 45322,
+ "warmongers": 33205,
+ "warms": 32917,
+ "warmth": 19636,
+ "warmup": 29904,
+ "warmups": 44094,
+ "warn": 19360,
+ "warned": 16409,
+ "warner": 28564,
+ "warner": 13402,
+ "warning": 4994,
+ "warnings": 18098,
+ "warns": 14086,
+ "waron": 38947,
+ "warp": 32411,
+ "warped": 32125,
+ "warran": 17392,
+ "warrant": 22554,
+ "warrants": 45677,
+ "warranty": 23999,
+ "warren": 23143,
+ "warren": 9234,
+ "warri": 4109,
+ "warrington": 31203,
+ "warrior": 18998,
+ "warrior": 8148,
+ "warriors": 6421,
+ "wars": 3931,
+ "warsaw": 21072,
+ "warship": 47846,
+ "wart": 43535,
+ "wart": 7346,
+ "wartime": 42998,
+ "warts": 21781,
+ "warwick": 23081,
+ "warwick": 22215,
+ "warwickshire": 36766,
+ "wary": 36213,
+ "was": 3398,
+ "was": 739,
+ "wasabi": 47334,
+ "wash": 3363,
+ "wash": 7810,
+ "washed": 14092,
+ "washer": 24085,
+ "washes": 38950,
+ "washing": 13029,
+ "washington": 16774,
+ "washington": 4365,
+ "washingtondc": 40225,
+ "washingtonpost": 28426,
+ "wasn": 5044,
+ "wasnt": 29607,
+ "wasp": 24889,
+ "wasps": 35300,
+ "wassup": 45708,
+ "wast": 28886,
+ "waste": 18157,
+ "waste": 6065,
+ "wasted": 18278,
+ "wasteland": 44035,
+ "wastewater": 34463,
+ "wasting": 25577,
+ "wat": 800,
+ "wat": 10621,
+ "wata": 42509,
+ "watch": 7046,
+ "watch": 1239,
+ "watchdog": 35303,
+ "watched": 5775,
+ "watcher": 35971,
+ "watchers": 28443,
+ "watches": 9521,
+ "watchin": 32432,
+ "watching": 2113,
+ "water": 2505,
+ "water": 1573,
+ "watercolor": 14211,
+ "watercolour": 18377,
+ "waterfall": 16403,
+ "waterfalls": 26692,
+ "waterford": 24448,
+ "waterfront": 16605,
+ "waterhouse": 45072,
+ "watering": 19871,
+ "waterloo": 17465,
+ "watermelon": 19889,
+ "waterproof": 17613,
+ "waters": 7753,
+ "watershed": 33204,
+ "waterstones": 45014,
+ "waterways": 37395,
+ "watford": 23162,
+ "watfordfc": 37328,
+ "wati": 27966,
+ "watkins": 22539,
+ "watson": 35490,
+ "watson": 9294,
+ "watt": 22899,
+ "watt": 15805,
+ "wattpad": 32351,
+ "watts": 14750,
+ "wau": 9479,
+ "wav": 6054,
+ "wave": 17530,
+ "wave": 4535,
+ "waved": 44657,
+ "waver": 25997,
+ "waves": 7882,
+ "waving": 26545,
+ "wavy": 31941,
+ "waw": 22039,
+ "wawrinka": 48414,
+ "wawx": 47387,
+ "wax": 18789,
+ "wax": 11910,
+ "waxing": 38781,
+ "way": 3079,
+ "way": 923,
+ "wayback": 47822,
+ "wayne": 23632,
+ "wayne": 7003,
+ "ways": 1248,
+ "waz": 20889,
+ "waz": 48835,
+ "wb": 10726,
+ "wb": 12377,
+ "wba": 22675,
+ "wbb": 14482,
+ "wbc": 26745,
+ "wbo": 49053,
+ "wbz": 35471,
+ "wc": 4842,
+ "wc": 5755,
+ "wcc": 47166,
+ "wcc": 34926,
+ "wcpo": 46624,
+ "wcs": 39916,
+ "wcvb": 32709,
+ "wcw": 9041,
+ "wd": 15998,
+ "wd": 7494,
+ "wdw": 40334,
+ "we": 598,
+ "we": 649,
+ "wea": 37146,
+ "wea": 47301,
+ "weak": 12128,
+ "weak": 10128,
+ "weaker": 39735,
+ "weakness": 21448,
+ "weaknesses": 43487,
+ "weal": 14759,
+ "wealth": 33150,
+ "wealth": 7904,
+ "wealthy": 22617,
+ "weap": 6156,
+ "weapon": 42612,
+ "weapon": 10537,
+ "weapons": 10007,
+ "wear": 12206,
+ "wear": 2839,
+ "wearab": 22983,
+ "wearable": 44943,
+ "wearable": 24973,
+ "wearables": 30319,
+ "weare": 4264,
+ "weare": 27867,
+ "weareall": 45980,
+ "wearec": 43620,
+ "wearen": 45635,
+ "weareone": 16149,
+ "weareoneexo": 16448,
+ "wearethe": 40242,
+ "wearing": 3309,
+ "wears": 11869,
+ "weary": 38766,
+ "weasel": 44308,
+ "weather": 8808,
+ "weather": 2237,
+ "weathercee": 44980,
+ "weatherchannel": 42138,
+ "weav": 22260,
+ "weave": 22450,
+ "weaver": 20297,
+ "weaving": 27131,
+ "web": 2055,
+ "web": 4601,
+ "webb": 15708,
+ "webber": 34248,
+ "webcam": 24211,
+ "webcam": 22589,
+ "webcamtoy": 27719,
+ "webcast": 28256,
+ "webcomic": 34286,
+ "webcomics": 39811,
+ "webdesign": 20470,
+ "webdev": 37000,
+ "webdevelopment": 47553,
+ "weber": 20179,
+ "webin": 8460,
+ "webinar": 8921,
+ "webinars": 47755,
+ "webpage": 46964,
+ "webs": 32829,
+ "webseries": 44819,
+ "website": 3364,
+ "websites": 19278,
+ "webster": 19471,
+ "websummit": 48069,
+ "wec": 33152,
+ "wechat": 46124,
+ "wed": 1687,
+ "wed": 3478,
+ "wedd": 7576,
+ "wedding": 11204,
+ "wedding": 3101,
+ "weddings": 15964,
+ "wedge": 21446,
+ "wedges": 33179,
+ "wedne": 2380,
+ "wednesday": 9311,
+ "wednesday": 2689,
+ "wednesdaymotivation": 37860,
+ "wednesdays": 24943,
+ "wednesdaywisdom": 11445,
+ "wedo": 43432,
+ "weds": 19107,
+ "wee": 716,
+ "wee": 8288,
+ "weed": 36935,
+ "weed": 8015,
+ "weeds": 26326,
+ "week": 1286,
+ "week": 994,
+ "weekday": 29244,
+ "weekdays": 44330,
+ "weekend": 17205,
+ "weekend": 1456,
+ "weekender": 36547,
+ "weekends": 14564,
+ "weekly": 34652,
+ "weekly": 5885,
+ "weeknd": 29925,
+ "weeks": 2898,
+ "weeksary": 24628,
+ "ween": 17517,
+ "ween": 1599,
+ "weep": 39270,
+ "weeping": 36629,
+ "weer": 32491,
+ "weet": 17742,
+ "weets": 13454,
+ "wef": 23313,
+ "weg": 47867,
+ "weg": 47561,
+ "wego": 44784,
+ "wego": 28220,
+ "weh": 48458,
+ "weh": 40313,
+ "weho": 47798,
+ "wei": 6958,
+ "wei": 20952,
+ "weibo": 20613,
+ "weigh": 10565,
+ "weigh": 17346,
+ "weighed": 33210,
+ "weighing": 24455,
+ "weighs": 20481,
+ "weight": 12723,
+ "weight": 3868,
+ "weighted": 43179,
+ "weightlifting": 36164,
+ "weightloss": 20359,
+ "weights": 21374,
+ "weil": 43720,
+ "weiler": 42203,
+ "wein": 29134,
+ "wein": 37684,
+ "weiner": 38822,
+ "weinstein": 34367,
+ "weir": 11299,
+ "weir": 25517,
+ "weird": 27981,
+ "weird": 5613,
+ "weirdest": 29482,
+ "weirdo": 32476,
+ "weis": 26251,
+ "weiser": 34833,
+ "weiss": 24794,
+ "wel": 1267,
+ "wel": 8042,
+ "welch": 25820,
+ "welcom": 11578,
+ "welcome": 18318,
+ "welcome": 1881,
+ "welcomed": 12590,
+ "welcomes": 9304,
+ "welcometo": 47511,
+ "welcoming": 8775,
+ "weld": 39776,
+ "welding": 24956,
+ "welfare": 12129,
+ "well": 3277,
+ "well": 1123,
+ "wellbeing": 14273,
+ "weller": 40921,
+ "welling": 49165,
+ "wellington": 15389,
+ "wellness": 40574,
+ "wellness": 9904,
+ "wells": 42705,
+ "wells": 9804,
+ "welove": 13573,
+ "welp": 28391,
+ "wels": 20852,
+ "welsh": 19173,
+ "welsh": 10977,
+ "welt": 38595,
+ "welter": 37115,
+ "welterweight": 39617,
+ "wemb": 15213,
+ "wembley": 16579,
+ "wen": 6590,
+ "wen": 11278,
+ "wend": 15166,
+ "wendell": 42091,
+ "wendy": 31616,
+ "wendy": 14074,
+ "wenger": 21105,
+ "went": 18633,
+ "went": 2437,
+ "wentworth": 36423,
+ "wentz": 39179,
+ "wer": 6316,
+ "wer": 2980,
+ "were": 15461,
+ "were": 1365,
+ "wered": 6605,
+ "weren": 13611,
+ "werewolf": 32001,
+ "werk": 30176,
+ "werner": 29917,
+ "wers": 7110,
+ "wes": 18620,
+ "wes": 14738,
+ "wesle": 29606,
+ "wesley": 17332,
+ "wesleyan": 32509,
+ "wesome": 33292,
+ "wess": 44431,
+ "west": 2973,
+ "west": 1593,
+ "westbound": 29208,
+ "westbrook": 26948,
+ "westchester": 36675,
+ "westcoast": 44610,
+ "westend": 44815,
+ "wester": 9846,
+ "western": 17079,
+ "western": 4463,
+ "westfield": 32309,
+ "westh": 36798,
+ "westin": 43232,
+ "westlake": 41535,
+ "westminster": 15158,
+ "weston": 22771,
+ "westside": 33762,
+ "westwood": 26371,
+ "westworld": 42287,
+ "wet": 12406,
+ "wet": 6682,
+ "weta": 40946,
+ "wethenorth": 45281,
+ "wethepeople": 48030,
+ "wether": 33794,
+ "wether": 48405,
+ "wetland": 37357,
+ "wetlands": 26547,
+ "wett": 41971,
+ "wetter": 43957,
+ "wewant": 39280,
+ "wewill": 37241,
+ "wex": 17234,
+ "wexford": 29876,
+ "wexmondays": 49042,
+ "wey": 30376,
+ "wey": 19781,
+ "weymouth": 41433,
+ "wf": 14576,
+ "wf": 22313,
+ "wfa": 44606,
+ "wfc": 36431,
+ "wfp": 35193,
+ "wftv": 47075,
+ "wg": 21091,
+ "wg": 25857,
+ "wga": 32354,
+ "wgn": 48828,
+ "wh": 573,
+ "wh": 13844,
+ "wha": 18994,
+ "wha": 25884,
+ "whal": 38967,
+ "whale": 37083,
+ "whale": 11650,
+ "whales": 17722,
+ "wham": 42506,
+ "whar": 15517,
+ "wharf": 22452,
+ "wharton": 43320,
+ "what": 4268,
+ "what": 768,
+ "whatcha": 37160,
+ "whate": 6695,
+ "whatever": 6743,
+ "whati": 23500,
+ "whats": 9263,
+ "whats": 13084,
+ "whatsapp": 10119,
+ "whatsoever": 39928,
+ "whatson": 35632,
+ "whatyou": 30508,
+ "whe": 2009,
+ "whead": 34583,
+ "wheat": 20505,
+ "wheat": 10303,
+ "wheaton": 46933,
+ "wheel": 7360,
+ "wheel": 6744,
+ "wheelchair": 17713,
+ "wheeler": 18405,
+ "wheeling": 34839,
+ "wheels": 8025,
+ "whel": 9792,
+ "whelan": 40715,
+ "when": 8753,
+ "when": 827,
+ "whenever": 10500,
+ "where": 7052,
+ "where": 1234,
+ "whereabouts": 47808,
+ "whereas": 42234,
+ "wheres": 46345,
+ "wherever": 14103,
+ "whereyou": 46837,
+ "whether": 5903,
+ "whew": 39016,
+ "whey": 34556,
+ "whi": 4295,
+ "whi": 33129,
+ "which": 1448,
+ "whiche": 48719,
+ "whichever": 49138,
+ "whil": 8499,
+ "while": 1519,
+ "whilst": 8596,
+ "whim": 27766,
+ "whimsical": 42282,
+ "whip": 14412,
+ "whipped": 22323,
+ "whipping": 41567,
+ "whir": 20873,
+ "whirl": 30962,
+ "whirlwind": 47771,
+ "whis": 6024,
+ "whiskey": 41381,
+ "whiskey": 11610,
+ "whisky": 37567,
+ "whisky": 12599,
+ "whisp": 21986,
+ "whispe": 30356,
+ "whisper": 27616,
+ "whisperer": 41368,
+ "whispering": 42599,
+ "whispers": 29133,
+ "whist": 13640,
+ "whistle": 23972,
+ "whistle": 19746,
+ "whistleblower": 40410,
+ "whistler": 29633,
+ "whit": 4398,
+ "whit": 31498,
+ "whitaker": 35851,
+ "whitby": 30858,
+ "white": 4699,
+ "white": 1579,
+ "whiteboard": 40839,
+ "whitec": 24575,
+ "whitehall": 42827,
+ "whitehead": 43560,
+ "whitehouse": 20776,
+ "whitening": 35540,
+ "whitepaper": 42713,
+ "whites": 35886,
+ "whites": 18835,
+ "whitesox": 28816,
+ "whitewater": 49350,
+ "whitfield": 48404,
+ "whitley": 40564,
+ "whitman": 32394,
+ "whitney": 43021,
+ "whitney": 18048,
+ "whitt": 33784,
+ "whittaker": 47595,
+ "whl": 25801,
+ "who": 2969,
+ "who": 822,
+ "whoa": 16943,
+ "whoever": 11137,
+ "whois": 41884,
+ "whole": 10360,
+ "whole": 2954,
+ "wholefoods": 42840,
+ "wholesale": 18306,
+ "wholesome": 35959,
+ "whom": 38158,
+ "whom": 12873,
+ "whoo": 20003,
+ "whoo": 49290,
+ "whoop": 22060,
+ "whoops": 28433,
+ "whopping": 34384,
+ "whore": 31690,
+ "whos": 41460,
+ "whos": 27130,
+ "whose": 6933,
+ "whouse": 45927,
+ "whs": 26292,
+ "wht": 32470,
+ "whufc": 31695,
+ "whun": 18272,
+ "why": 11040,
+ "why": 1182,
+ "whyte": 42386,
+ "wi": 820,
+ "wi": 5585,
+ "wib": 45303,
+ "wic": 7834,
+ "wich": 9759,
+ "wich": 5238,
+ "wichita": 22566,
+ "wick": 6798,
+ "wick": 6479,
+ "wicked": 32579,
+ "wicked": 12825,
+ "wicker": 38096,
+ "wicket": 19180,
+ "wickets": 22110,
+ "wicklow": 39039,
+ "wicz": 30121,
+ "wid": 11886,
+ "wid": 20886,
+ "wide": 19341,
+ "wide": 3184,
+ "widely": 16195,
+ "widening": 46598,
+ "wider": 21263,
+ "widesp": 20598,
+ "widespread": 21258,
+ "widget": 43906,
+ "wido": 28068,
+ "widow": 19949,
+ "widows": 42129,
+ "width": 23571,
+ "wie": 21378,
+ "wie": 9131,
+ "wielding": 47272,
+ "wien": 38131,
+ "wiener": 40567,
+ "wies": 42788,
+ "wif": 37572,
+ "wife": 3607,
+ "wifey": 35282,
+ "wifi": 11026,
+ "wig": 23690,
+ "wig": 12216,
+ "wigan": 23130,
+ "wiggins": 32329,
+ "wiggle": 47812,
+ "wight": 41278,
+ "wight": 15545,
+ "wigs": 31207,
+ "wii": 8005,
+ "wiiu": 40980,
+ "wiki": 10373,
+ "wiki": 24265,
+ "wikileaks": 28731,
+ "wikipedia": 15176,
+ "wil": 1352,
+ "wil": 20581,
+ "wilbur": 43069,
+ "wilcox": 43231,
+ "wild": 2780,
+ "wild": 3220,
+ "wildatlantic": 35500,
+ "wildatlanticway": 35776,
+ "wildcard": 37360,
+ "wildcat": 49077,
+ "wildcat": 25870,
+ "wildcats": 15909,
+ "wilde": 23498,
+ "wilder": 14343,
+ "wilder": 23499,
+ "wilderness": 16506,
+ "wildest": 43028,
+ "wildfire": 22788,
+ "wildfires": 29184,
+ "wildflower": 27628,
+ "wildflower": 33181,
+ "wildflowerhour": 31302,
+ "wildflowers": 29136,
+ "wildlife": 13298,
+ "wildlife": 5250,
+ "wildlifephotography": 32307,
+ "wildlifewednesday": 48537,
+ "wildly": 35981,
+ "wildoz": 40113,
+ "wiley": 32747,
+ "wilhelm": 39696,
+ "wilkes": 39548,
+ "wilkins": 36986,
+ "wilkinson": 26797,
+ "will": 5062,
+ "will": 751,
+ "willam": 43276,
+ "willard": 44920,
+ "wille": 48739,
+ "willem": 38044,
+ "willi": 2256,
+ "william": 8420,
+ "william": 4705,
+ "williams": 38452,
+ "williams": 4075,
+ "williamsburg": 30683,
+ "williamson": 20793,
+ "willie": 13907,
+ "willing": 34160,
+ "willing": 11718,
+ "willingness": 40573,
+ "willis": 18491,
+ "willow": 33887,
+ "willow": 15665,
+ "wills": 26913,
+ "willy": 34502,
+ "willy": 19599,
+ "wilmington": 28052,
+ "wilms": 47879,
+ "wilshere": 48359,
+ "wilson": 23629,
+ "wilson": 5622,
+ "wilt": 23394,
+ "wilt": 47357,
+ "wilton": 46638,
+ "wiltshire": 28025,
+ "wim": 8662,
+ "wim": 27580,
+ "wimble": 11752,
+ "wimbledon": 12229,
+ "win": 831,
+ "win": 1225,
+ "winchester": 20647,
+ "wind": 6812,
+ "wind": 3630,
+ "winder": 44454,
+ "winder": 46245,
+ "winding": 22390,
+ "windmill": 34084,
+ "windo": 3110,
+ "window": 26675,
+ "window": 4879,
+ "windows": 5437,
+ "winds": 12668,
+ "winds": 7012,
+ "windshield": 33002,
+ "windsor": 44322,
+ "windsor": 12884,
+ "windy": 13446,
+ "wine": 7375,
+ "wine": 2604,
+ "winelover": 26357,
+ "winemaker": 41588,
+ "wineoclock": 43846,
+ "wineries": 49349,
+ "winery": 15500,
+ "wines": 8263,
+ "winetasting": 41288,
+ "winewednesday": 35447,
+ "wing": 8141,
+ "wing": 1340,
+ "winged": 24993,
+ "winger": 22727,
+ "winget": 44578,
+ "wings": 5178,
+ "wink": 34455,
+ "wink": 25859,
+ "winkle": 36430,
+ "winn": 38104,
+ "winne": 46273,
+ "winner": 32961,
+ "winner": 2520,
+ "winners": 4320,
+ "winni": 13018,
+ "winnie": 29022,
+ "winning": 42099,
+ "winning": 2577,
+ "winnings": 46490,
+ "winnipeg": 14369,
+ "winona": 49202,
+ "wins": 46839,
+ "wins": 2718,
+ "winslow": 39658,
+ "winston": 14848,
+ "winter": 7340,
+ "winter": 2541,
+ "winters": 21587,
+ "wintry": 39504,
+ "wip": 10447,
+ "wipe": 26761,
+ "wiped": 31822,
+ "wipes": 33463,
+ "wir": 16849,
+ "wir": 44838,
+ "wire": 7558,
+ "wire": 7794,
+ "wired": 18935,
+ "wireless": 9103,
+ "wires": 24311,
+ "wiring": 36434,
+ "wirral": 34675,
+ "wis": 3392,
+ "wis": 20405,
+ "wiscon": 9857,
+ "wisconsin": 10265,
+ "wisdom": 42474,
+ "wisdom": 5425,
+ "wise": 19116,
+ "wise": 5558,
+ "wisely": 26173,
+ "wiser": 44859,
+ "wish": 11328,
+ "wish": 2412,
+ "wished": 25883,
+ "wishes": 6045,
+ "wishing": 5307,
+ "wishlist": 31969,
+ "wit": 584,
+ "wit": 8531,
+ "witch": 20139,
+ "witch": 10083,
+ "witchcraft": 35065,
+ "witcher": 33684,
+ "witches": 21673,
+ "with": 1435,
+ "with": 593,
+ "withdra": 24696,
+ "withdraw": 31670,
+ "withdrawal": 25765,
+ "withdrawn": 46687,
+ "withdraws": 48637,
+ "wither": 39655,
+ "witherspoon": 45409,
+ "within": 4154,
+ "withme": 44670,
+ "without": 32836,
+ "without": 2193,
+ "withstand": 42236,
+ "withthe": 36872,
+ "withus": 30572,
+ "withyou": 30351,
+ "witne": 12096,
+ "witness": 8793,
+ "witnessed": 20187,
+ "witnesses": 22778,
+ "witnessing": 33618,
+ "wits": 30938,
+ "witt": 38194,
+ "witt": 17168,
+ "witter": 31597,
+ "witty": 29970,
+ "witz": 44186,
+ "witz": 13265,
+ "wiv": 48925,
+ "wives": 14378,
+ "wiwx": 44461,
+ "wiz": 7730,
+ "wiz": 23178,
+ "wizar": 49121,
+ "wizard": 30490,
+ "wizard": 14295,
+ "wizards": 19140,
+ "wizkid": 40146,
+ "wj": 19739,
+ "wj": 35453,
+ "wk": 11512,
+ "wk": 11528,
+ "wkend": 42336,
+ "wknd": 20851,
+ "wks": 25508,
+ "wku": 43377,
+ "wl": 13299,
+ "wl": 9613,
+ "wm": 20268,
+ "wm": 15790,
+ "wn": 1186,
+ "wn": 757,
+ "wnba": 32358,
+ "wned": 8628,
+ "wns": 12950,
+ "wnt": 22484,
+ "wny": 24833,
+ "wo": 1613,
+ "wo": 11132,
+ "woah": 17751,
+ "wob": 35984,
+ "woc": 39011,
+ "wod": 41522,
+ "woes": 27860,
+ "wof": 45671,
+ "woj": 48931,
+ "wok": 28912,
+ "woke": 9331,
+ "woken": 43697,
+ "woking": 43931,
+ "wol": 2798,
+ "wol": 48622,
+ "wold": 42399,
+ "wolf": 9453,
+ "wolf": 5916,
+ "wolfe": 24989,
+ "wolff": 34369,
+ "wolfgang": 34061,
+ "wolfpack": 30887,
+ "wolve": 45101,
+ "wolver": 14334,
+ "wolverhampton": 34518,
+ "wolverine": 23353,
+ "wolverines": 42003,
+ "wolves": 9372,
+ "wom": 1087,
+ "womack": 48980,
+ "woman": 15716,
+ "woman": 2308,
+ "womanc": 35630,
+ "womancrush": 37721,
+ "womancrushwednesday": 39714,
+ "womanin": 30562,
+ "womaninbiz": 36482,
+ "womb": 37023,
+ "women": 3648,
+ "women": 1507,
+ "womenin": 13062,
+ "womeninscience": 41343,
+ "womeninstem": 29380,
+ "womenintech": 31470,
+ "womenof": 48421,
+ "womens": 12822,
+ "womens": 14408,
+ "womensart": 38548,
+ "womensday": 13956,
+ "womenshi": 22887,
+ "womenshistorymonth": 24982,
+ "womensmarch": 30102,
+ "won": 1528,
+ "won": 1749,
+ "wonder": 2070,
+ "wonder": 3936,
+ "wondercon": 46944,
+ "wondered": 15550,
+ "wonderful": 2582,
+ "wonderfully": 23245,
+ "wondering": 8360,
+ "wonderland": 13874,
+ "wonders": 14048,
+ "wonderwoman": 31000,
+ "wondo": 38402,
+ "wondr": 46771,
+ "wong": 17876,
+ "wonka": 43463,
+ "wont": 43174,
+ "wont": 15952,
+ "woo": 1867,
+ "woo": 9322,
+ "wood": 3269,
+ "wood": 1704,
+ "woodbridge": 49074,
+ "wooden": 48226,
+ "wooden": 9057,
+ "woodland": 44314,
+ "woodland": 17447,
+ "woodlands": 32430,
+ "woodley": 40566,
+ "woodpecker": 32684,
+ "woods": 6267,
+ "woodson": 48967,
+ "woodstock": 29486,
+ "woodward": 27419,
+ "woodwork": 47386,
+ "woodworking": 29267,
+ "woody": 38627,
+ "woody": 17144,
+ "woof": 34234,
+ "woof": 24028,
+ "woohoo": 20172,
+ "wook": 29192,
+ "wool": 9967,
+ "wool": 13283,
+ "woolf": 43728,
+ "woolly": 47722,
+ "woon": 33126,
+ "wooo": 43217,
+ "woop": 31884,
+ "woot": 22466,
+ "wor": 641,
+ "worcester": 22172,
+ "worcester": 19580,
+ "worcestershire": 38440,
+ "worcestershirehour": 43644,
+ "word": 8272,
+ "word": 2653,
+ "wordof": 33500,
+ "wordoftheday": 43594,
+ "wordpress": 15193,
+ "words": 31007,
+ "words": 2709,
+ "wore": 8953,
+ "work": 1636,
+ "work": 951,
+ "workday": 29735,
+ "worked": 5410,
+ "worker": 8098,
+ "workers": 4795,
+ "workflow": 28502,
+ "workforce": 14672,
+ "workin": 31825,
+ "workin": 26323,
+ "working": 20806,
+ "working": 1699,
+ "workinprogress": 46086,
+ "workout": 6773,
+ "workouts": 22779,
+ "workplace": 11959,
+ "workplaces": 47383,
+ "works": 2322,
+ "workshop": 3832,
+ "workshops": 12262,
+ "workspace": 34470,
+ "worl": 5221,
+ "world": 2334,
+ "world": 1002,
+ "worlda": 46627,
+ "worldbank": 36759,
+ "worldbookday": 31191,
+ "worldcup": 42525,
+ "worldcup": 8650,
+ "worlden": 44668,
+ "worldenviron": 47115,
+ "worldenvironmentday": 47522,
+ "worldly": 36268,
+ "worldo": 41698,
+ "worldof": 22636,
+ "worldre": 33951,
+ "worlds": 7691,
+ "worldseries": 26695,
+ "worldtour": 23202,
+ "worldwater": 41176,
+ "worldwaterday": 44520,
+ "worldwide": 6214,
+ "worm": 33709,
+ "worm": 10945,
+ "worms": 20231,
+ "worn": 9037,
+ "worried": 11911,
+ "worries": 17684,
+ "worry": 7534,
+ "worrying": 24058,
+ "worse": 8236,
+ "worsen": 46344,
+ "worshi": 31840,
+ "worship": 46399,
+ "worship": 9023,
+ "worst": 5719,
+ "wort": 30209,
+ "worth": 10671,
+ "worth": 2450,
+ "worthing": 39929,
+ "worthit": 40830,
+ "worthless": 44736,
+ "worths": 44633,
+ "worthwhile": 36295,
+ "worthy": 8881,
+ "worx": 44973,
+ "wot": 24863,
+ "wou": 5279,
+ "would": 39873,
+ "would": 1311,
+ "wouldn": 5878,
+ "wouldnt": 41595,
+ "wound": 19231,
+ "wounded": 14859,
+ "wounds": 21290,
+ "woven": 19830,
+ "wow": 22191,
+ "wow": 2781,
+ "woz": 44558,
+ "wozni": 47782,
+ "wp": 15378,
+ "wp": 13302,
+ "wpg": 35048,
+ "wps": 33386,
+ "wq": 45195,
+ "wr": 1189,
+ "wr": 8028,
+ "wra": 3852,
+ "wra": 46004,
+ "wral": 49050,
+ "wrangler": 30923,
+ "wrap": 7094,
+ "wrapped": 9875,
+ "wrapping": 15223,
+ "wraps": 18236,
+ "wrath": 29783,
+ "wray": 48943,
+ "wrc": 16004,
+ "wre": 3168,
+ "wreath": 23091,
+ "wrec": 20879,
+ "wreck": 28775,
+ "wreck": 15017,
+ "wrecked": 32695,
+ "wreckem": 45676,
+ "wrecking": 36956,
+ "wrecks": 45545,
+ "wren": 20191,
+ "wren": 31970,
+ "wrench": 30980,
+ "wrest": 4177,
+ "wrestle": 17097,
+ "wrestle": 28086,
+ "wrestlemania": 18849,
+ "wrestler": 19790,
+ "wrestlers": 25902,
+ "wrestling": 31292,
+ "wrestling": 5904,
+ "wrexham": 34479,
+ "wri": 7667,
+ "wri": 42007,
+ "wright": 28616,
+ "wright": 6991,
+ "wrights": 43711,
+ "wrigley": 33538,
+ "wrink": 22201,
+ "wrinkle": 46642,
+ "wrinkles": 35525,
+ "wrist": 19243,
+ "wrist": 16139,
+ "wristband": 36890,
+ "wristbands": 44864,
+ "writ": 2902,
+ "write": 28874,
+ "write": 4946,
+ "writer": 27886,
+ "writer": 4422,
+ "writers": 18742,
+ "writers": 7307,
+ "writerslife": 25007,
+ "writes": 8023,
+ "writing": 16053,
+ "writing": 2979,
+ "writingcommunity": 39178,
+ "writings": 36259,
+ "written": 5231,
+ "wro": 5447,
+ "wrong": 18381,
+ "wrong": 3669,
+ "wrongly": 45642,
+ "wrote": 5796,
+ "wrought": 48125,
+ "wrs": 45280,
+ "ws": 6300,
+ "ws": 799,
+ "wsb": 30681,
+ "wsbtv": 38394,
+ "wsj": 19764,
+ "wski": 12548,
+ "wsl": 43706,
+ "wsoc": 40253,
+ "wson": 33954,
+ "wsop": 41231,
+ "wsu": 44674,
+ "wsu": 32913,
+ "wsw": 43285,
+ "wt": 15873,
+ "wt": 12255,
+ "wta": 25984,
+ "wtc": 39718,
+ "wtf": 6891,
+ "wth": 23021,
+ "wthr": 45269,
+ "wti": 47345,
+ "wto": 36406,
+ "wts": 32159,
+ "wu": 9710,
+ "wu": 9837,
+ "wud": 43870,
+ "wul": 35154,
+ "wunder": 36661,
+ "wur": 24040,
+ "wurst": 44409,
+ "wusa": 40021,
+ "wut": 28590,
+ "wv": 18920,
+ "wv": 14743,
+ "wvu": 44878,
+ "wvu": 25879,
+ "ww": 3181,
+ "ww": 4491,
+ "wwc": 26505,
+ "wwdc": 47441,
+ "wwe": 12112,
+ "wwe": 5290,
+ "wwen": 23308,
+ "wwenetwork": 37228,
+ "wwenxt": 39898,
+ "wwer": 32038,
+ "wwf": 23332,
+ "wwfc": 42681,
+ "wwg": 35322,
+ "wwi": 20194,
+ "wwii": 10261,
+ "www": 26074,
+ "www": 9667,
+ "wwwbigbaldhead": 30761,
+ "wwww": 34224,
+ "wwww": 25200,
+ "wwwww": 48268,
+ "wwx": 47431,
+ "wx": 18192,
+ "wx": 3561,
+ "wy": 4665,
+ "wy": 7625,
+ "wyatt": 21660,
+ "wyd": 33113,
+ "wye": 48436,
+ "wye": 43751,
+ "wylie": 49330,
+ "wyn": 11802,
+ "wyn": 17504,
+ "wynn": 36117,
+ "wynne": 35951,
+ "wynonna": 41456,
+ "wynonnaearp": 43755,
+ "wyoming": 18693,
+ "x": 87,
+ "x": 343,
+ "xa": 24831,
+ "xan": 45530,
+ "xander": 45601,
+ "xavi": 36342,
+ "xavier": 41044,
+ "xavier": 18567,
+ "xb": 33678,
+ "xbox": 18063,
+ "xbox": 7748,
+ "xboxone": 27410,
+ "xc": 12515,
+ "xchange": 49132,
+ "xd": 6380,
+ "xe": 42886,
+ "xe": 19183,
+ "xen": 15568,
+ "xer": 49005,
+ "xf": 35274,
+ "xfactor": 25211,
+ "xfinity": 35107,
+ "xford": 34732,
+ "xh": 45771,
+ "xham": 25284,
+ "xi": 2467,
+ "xi": 7376,
+ "xia": 19854,
+ "xia": 20724,
+ "xian": 42570,
+ "xiao": 49318,
+ "xiaomi": 27477,
+ "xico": 38469,
+ "xide": 17398,
+ "xie": 40122,
+ "xie": 15976,
+ "xii": 36525,
+ "xiii": 28199,
+ "xim": 11217,
+ "xin": 27053,
+ "xin": 41517,
+ "xing": 14383,
+ "xion": 24164,
+ "xis": 35793,
+ "xit": 5316,
+ "xiumin": 36563,
+ "xiv": 16125,
+ "xj": 42453,
+ "xl": 36529,
+ "xl": 8833,
+ "xley": 38223,
+ "xm": 18626,
+ "xma": 48805,
+ "xmas": 48848,
+ "xmas": 6425,
+ "xmen": 28708,
+ "xn": 25388,
+ "xo": 26936,
+ "xo": 9000,
+ "xon": 29186,
+ "xon": 8482,
+ "xox": 11531,
+ "xox": 34050,
+ "xoxo": 13313,
+ "xp": 15651,
+ "xper": 32200,
+ "xperia": 37615,
+ "xpo": 44377,
+ "xpress": 31809,
+ "xq": 40606,
+ "xr": 26276,
+ "xrp": 26965,
+ "xs": 16397,
+ "xt": 1052,
+ "xtina": 45520,
+ "xton": 32666,
+ "xton": 10597,
+ "xtra": 26969,
+ "xtre": 27025,
+ "xtreme": 33483,
+ "xu": 42063,
+ "xu": 37198,
+ "xv": 17768,
+ "xvi": 44031,
+ "xx": 5675,
+ "xx": 3553,
+ "xxl": 29777,
+ "xxx": 33923,
+ "xxx": 8352,
+ "xxxx": 32035,
+ "xxxx": 22819,
+ "xxxxx": 44195,
+ "xy": 20023,
+ "xy": 11443,
+ "y": 88,
+ "y": 344,
+ "ya": 5018,
+ "ya": 1430,
+ "yaa": 48847,
+ "yaa": 34498,
+ "yaan": 34680,
+ "yab": 27737,
+ "yach": 9039,
+ "yacht": 43806,
+ "yacht": 12859,
+ "yachts": 29260,
+ "yad": 13276,
+ "yad": 40047,
+ "yadav": 26650,
+ "yaf": 38019,
+ "yag": 35081,
+ "yah": 16170,
+ "yah": 12381,
+ "yaho": 37929,
+ "yahoo": 38152,
+ "yahoo": 16846,
+ "yak": 11014,
+ "yak": 29074,
+ "yaki": 44677,
+ "yaku": 29572,
+ "yakuza": 42628,
+ "yal": 16198,
+ "yal": 13418,
+ "yale": 39926,
+ "yale": 17157,
+ "yall": 9210,
+ "yam": 6666,
+ "yam": 19318,
+ "yama": 23512,
+ "yamaha": 18854,
+ "yan": 3949,
+ "yan": 4788,
+ "yana": 18698,
+ "yand": 38609,
+ "yang": 23818,
+ "yang": 12605,
+ "yani": 26439,
+ "yankee": 21554,
+ "yankees": 11889,
+ "yann": 40246,
+ "yann": 38657,
+ "yao": 45231,
+ "yap": 48700,
+ "yap": 34468,
+ "yar": 6786,
+ "yar": 23071,
+ "yard": 20234,
+ "yard": 4313,
+ "yards": 7550,
+ "yarmouth": 45941,
+ "yarn": 19702,
+ "yarra": 46824,
+ "yas": 8168,
+ "yas": 20570,
+ "yash": 30216,
+ "yash": 37836,
+ "yasi": 37700,
+ "yasss": 23873,
+ "yat": 29443,
+ "yat": 34965,
+ "yates": 27677,
+ "yatra": 38932,
+ "yav": 41275,
+ "yaw": 31989,
+ "yawn": 48643,
+ "yay": 20614,
+ "yay": 6712,
+ "yaya": 37608,
+ "yaz": 19348,
+ "yaz": 42252,
+ "yb": 41785,
+ "yb": 27615,
+ "yc": 11931,
+ "ycle": 38089,
+ "yd": 29896,
+ "yd": 9534,
+ "yday": 15899,
+ "yds": 24819,
+ "ye": 693,
+ "ye": 4582,
+ "yea": 13687,
+ "yeah": 29405,
+ "yeah": 3908,
+ "year": 5163,
+ "year": 935,
+ "yearbook": 21636,
+ "yearling": 48392,
+ "yearly": 24541,
+ "yearof": 31944,
+ "yearofthe": 47899,
+ "years": 30864,
+ "years": 1151,
+ "yearsof": 14932,
+ "yearswith": 45249,
+ "yeast": 25819,
+ "yeats": 44903,
+ "yed": 28137,
+ "yed": 3301,
+ "yee": 18114,
+ "yee": 23108,
+ "yeezy": 24901,
+ "yeg": 16854,
+ "yeg": 11976,
+ "yegfood": 48711,
+ "yeh": 21331,
+ "yel": 3323,
+ "yel": 48164,
+ "yell": 30824,
+ "yelled": 39199,
+ "yelling": 26581,
+ "yellow": 12059,
+ "yellow": 4481,
+ "yellowstone": 29241,
+ "yelp": 31674,
+ "yemen": 29276,
+ "yemen": 12513,
+ "yemeni": 44656,
+ "yemi": 42267,
+ "yen": 29602,
+ "yen": 17960,
+ "yeo": 32292,
+ "yeo": 43830,
+ "yeol": 15808,
+ "yeon": 16602,
+ "yep": 10964,
+ "yer": 15491,
+ "yer": 2371,
+ "yers": 3722,
+ "yes": 21620,
+ "yes": 1958,
+ "yess": 42778,
+ "yess": 40189,
+ "yesss": 36210,
+ "yessss": 45620,
+ "yester": 1905,
+ "yesterday": 1926,
+ "yesterdays": 36238,
+ "yesung": 38527,
+ "yet": 2296,
+ "yeti": 34228,
+ "yev": 39855,
+ "yew": 34660,
+ "yey": 45447,
+ "yg": 16396,
+ "ygk": 44758,
+ "ygo": 46166,
+ "yh": 41978,
+ "yi": 5826,
+ "yi": 14762,
+ "yield": 16825,
+ "yields": 24856,
+ "yikes": 25094,
+ "yin": 26476,
+ "yin": 23543,
+ "ying": 42933,
+ "ying": 910,
+ "yixing": 32120,
+ "yk": 30965,
+ "yl": 2656,
+ "yl": 4045,
+ "ylan": 41875,
+ "ylde": 42850,
+ "yle": 32305,
+ "yle": 10770,
+ "ylene": 34239,
+ "yler": 48081,
+ "yles": 42860,
+ "ylon": 22375,
+ "ylor": 48468,
+ "ym": 1786,
+ "ym": 19587,
+ "yman": 29077,
+ "ymc": 47101,
+ "ymca": 22369,
+ "yment": 8199,
+ "ymes": 39968,
+ "ymi": 5271,
+ "ymm": 37133,
+ "ymoun": 41426,
+ "ymouth": 36429,
+ "yn": 2823,
+ "yn": 4100,
+ "yne": 18238,
+ "ynes": 18020,
+ "ynn": 10499,
+ "ynna": 48292,
+ "ynwa": 27372,
+ "yo": 586,
+ "yo": 3497,
+ "yoda": 31922,
+ "yof": 5966,
+ "yofficial": 21818,
+ "yofthe": 43983,
+ "yog": 34985,
+ "yog": 36539,
+ "yoga": 25872,
+ "yoga": 5523,
+ "yogh": 32626,
+ "yoghurt": 33491,
+ "yogi": 22766,
+ "yogur": 16137,
+ "yogurt": 16819,
+ "yoh": 48880,
+ "yoke": 41969,
+ "yoko": 25929,
+ "yoko": 32256,
+ "yokohama": 42409,
+ "yol": 19387,
+ "yol": 35218,
+ "yolanda": 43845,
+ "yolo": 20905,
+ "yom": 34718,
+ "yom": 44527,
+ "yon": 10147,
+ "yon": 7604,
+ "yong": 27960,
+ "yong": 20887,
+ "yonge": 48592,
+ "yoo": 25842,
+ "yoo": 20775,
+ "yoon": 30863,
+ "yoon": 22113,
+ "yoona": 32736,
+ "yoongi": 24037,
+ "yor": 2028,
+ "yor": 21132,
+ "york": 5318,
+ "york": 2705,
+ "yorker": 23865,
+ "yorkers": 41041,
+ "yorks": 39093,
+ "yorkshi": 43367,
+ "yorkshire": 27007,
+ "yorkshire": 8633,
+ "yoruba": 46083,
+ "yos": 35607,
+ "yosemite": 25893,
+ "yoshi": 22920,
+ "yoshi": 25354,
+ "yot": 22875,
+ "yotes": 46157,
+ "yotpo": 26113,
+ "you": 1562,
+ "you": 592,
+ "youare": 33879,
+ "youcan": 32498,
+ "youknow": 47919,
+ "youknow": 41088,
+ "youn": 1596,
+ "young": 6939,
+ "young": 1888,
+ "younger": 10414,
+ "youngest": 12316,
+ "youngjae": 46426,
+ "youngster": 35881,
+ "youngsters": 28098,
+ "younow": 33831,
+ "your": 2130,
+ "your": 695,
+ "youre": 28344,
+ "youre": 19695,
+ "yourown": 28583,
+ "yours": 3834,
+ "yourself": 3053,
+ "yourselves": 19747,
+ "youth": 10743,
+ "youth": 3281,
+ "youthful": 37480,
+ "youths": 23614,
+ "youts": 22737,
+ "youtu": 13868,
+ "youtube": 31258,
+ "youtube": 3895,
+ "youtuber": 24720,
+ "youtubers": 36822,
+ "youu": 35055,
+ "youuu": 35324,
+ "youuuu": 47123,
+ "yoy": 41865,
+ "yp": 38370,
+ "yp": 34734,
+ "ypg": 37386,
+ "yql": 46122,
+ "yqr": 36881,
+ "yr": 18395,
+ "yr": 4333,
+ "yrs": 4822,
+ "ys": 1971,
+ "ys": 961,
+ "yser": 33121,
+ "ysis": 4843,
+ "ysl": 45681,
+ "ysm": 23842,
+ "yst": 40528,
+ "yt": 36777,
+ "yt": 14779,
+ "ytd": 47524,
+ "yte": 48172,
+ "yu": 3371,
+ "yu": 8887,
+ "yuan": 26236,
+ "yuck": 48282,
+ "yugo": 48231,
+ "yuh": 42547,
+ "yui": 47932,
+ "yuk": 17037,
+ "yuk": 24063,
+ "yuki": 34010,
+ "yukon": 27094,
+ "yul": 39832,
+ "yum": 6869,
+ "yum": 7259,
+ "yuma": 47566,
+ "yummy": 7687,
+ "yun": 14976,
+ "yun": 18288,
+ "yung": 44545,
+ "yung": 17676,
+ "yunho": 39748,
+ "yup": 13231,
+ "yur": 42533,
+ "yuri": 23823,
+ "yusuf": 33222,
+ "yuv": 36784,
+ "yves": 33698,
+ "yvon": 23327,
+ "yvonne": 32583,
+ "yvr": 29058,
+ "yw": 33741,
+ "yx": 35624,
+ "yxe": 34240,
+ "yy": 3433,
+ "yy": 8321,
+ "yya": 37444,
+ "yyc": 27542,
+ "yyc": 11741,
+ "yyj": 26203,
+ "yyy": 11514,
+ "yyyy": 38749,
+ "yyyy": 16955,
+ "yyyyy": 26089,
+ "yyyyyy": 47055,
+ "yz": 37579,
+ "yz": 46451,
+ "yü": 48232,
+ "z": 89,
+ "z": 345,
+ "za": 3710,
+ "za": 2186,
+ "zab": 22982,
+ "zable": 37002,
+ "zac": 25501,
+ "zac": 19159,
+ "zach": 13401,
+ "zach": 11815,
+ "zachary": 32401,
+ "zack": 30567,
+ "zack": 19120,
+ "zad": 47314,
+ "zad": 27838,
+ "zada": 34889,
+ "zaf": 21837,
+ "zafar": 46668,
+ "zag": 26091,
+ "zag": 29346,
+ "zagre": 34107,
+ "zagreb": 35355,
+ "zah": 23258,
+ "zah": 43297,
+ "zaha": 44408,
+ "zai": 44329,
+ "zai": 27065,
+ "zain": 34400,
+ "zain": 45366,
+ "zak": 13050,
+ "zak": 20738,
+ "zaki": 48091,
+ "zal": 20552,
+ "zal": 33298,
+ "zam": 7218,
+ "zam": 41578,
+ "zambia": 21671,
+ "zan": 7284,
+ "zan": 17835,
+ "zana": 39643,
+ "zand": 37712,
+ "zane": 34786,
+ "zani": 45373,
+ "zania": 15059,
+ "zano": 27637,
+ "zanzi": 47835,
+ "zap": 24134,
+ "zapp": 33504,
+ "zappa": 46592,
+ "zar": 5458,
+ "zar": 16392,
+ "zara": 24454,
+ "zardari": 20174,
+ "zas": 48261,
+ "zation": 3683,
+ "zawa": 49281,
+ "zay": 7102,
+ "zayed": 36726,
+ "zayn": 22292,
+ "zayn": 10308,
+ "zaynmalik": 25278,
+ "zazzle": 47857,
+ "ze": 2254,
+ "ze": 1298,
+ "zeal": 44951,
+ "zealand": 7618,
+ "zeb": 46518,
+ "zebra": 47394,
+ "zebra": 22548,
+ "zed": 21047,
+ "zed": 1993,
+ "zedd": 45608,
+ "zee": 25468,
+ "zee": 14080,
+ "zeiss": 47460,
+ "zeit": 37898,
+ "zeit": 37906,
+ "zek": 40829,
+ "zeke": 47065,
+ "zel": 10389,
+ "zel": 12027,
+ "zelda": 17138,
+ "zell": 39526,
+ "zen": 8518,
+ "zen": 3928,
+ "zend": 33478,
+ "zendaya": 35956,
+ "zenith": 44740,
+ "zens": 15298,
+ "zeph": 40726,
+ "zepp": 22977,
+ "zeppelin": 25408,
+ "zer": 6118,
+ "zer": 3716,
+ "zero": 14867,
+ "zero": 5848,
+ "zers": 9547,
+ "zes": 4073,
+ "zest": 37709,
+ "zet": 34098,
+ "zeta": 30954,
+ "zetta": 45993,
+ "zeus": 32800,
+ "zey": 46647,
+ "zh": 33389,
+ "zh": 41621,
+ "zhang": 21127,
+ "zhen": 37374,
+ "zhen": 33236,
+ "zhou": 17384,
+ "zhu": 42049,
+ "zi": 2651,
+ "zi": 5819,
+ "zia": 13764,
+ "zid": 30235,
+ "zidane": 34643,
+ "zie": 29316,
+ "zie": 8956,
+ "zieg": 40157,
+ "ziegler": 46812,
+ "ziel": 32151,
+ "zier": 15399,
+ "zies": 38001,
+ "ziest": 28159,
+ "zig": 15950,
+ "zig": 21345,
+ "ziggy": 39274,
+ "zik": 30125,
+ "zika": 28783,
+ "zil": 25039,
+ "zil": 33190,
+ "zilla": 17879,
+ "zim": 8112,
+ "zim": 22577,
+ "zimbab": 12373,
+ "zimbabwe": 45668,
+ "zimbabwe": 13583,
+ "zimmer": 27452,
+ "zimmer": 35211,
+ "zimmerman": 38231,
+ "zin": 14085,
+ "zin": 21278,
+ "zinc": 27458,
+ "zind": 26206,
+ "zindabad": 42208,
+ "zine": 16100,
+ "zing": 25062,
+ "zing": 3152,
+ "zinger": 42027,
+ "zio": 13906,
+ "zion": 31763,
+ "zion": 20963,
+ "zione": 36161,
+ "zionist": 33078,
+ "zip": 26479,
+ "zip": 16083,
+ "zipper": 33670,
+ "zir": 31892,
+ "zl": 39168,
+ "zlat": 32489,
+ "zlatan": 37877,
+ "zm": 43691,
+ "zman": 24248,
+ "zn": 18004,
+ "zo": 4397,
+ "zo": 5056,
+ "zodi": 22660,
+ "zodiac": 27753,
+ "zoe": 43114,
+ "zoe": 16662,
+ "zoey": 39871,
+ "zog": 40680,
+ "zol": 25939,
+ "zola": 46105,
+ "zom": 6623,
+ "zombi": 29452,
+ "zombie": 11819,
+ "zombies": 46702,
+ "zombies": 16517,
+ "zon": 15109,
+ "zon": 14618,
+ "zona": 42134,
+ "zone": 37197,
+ "zone": 4442,
+ "zones": 17247,
+ "zoning": 36790,
+ "zoo": 8182,
+ "zoo": 7147,
+ "zoom": 32671,
+ "zoom": 13909,
+ "zor": 17605,
+ "zou": 38072,
+ "zr": 39275,
+ "zs": 35248,
+ "zshq": 41442,
+ "zt": 42629,
+ "zu": 4091,
+ "zu": 14184,
+ "zucchini": 29873,
+ "zucker": 26890,
+ "zuckerberg": 30066,
+ "zul": 31146,
+ "zulu": 32821,
+ "zum": 35094,
+ "zuma": 23326,
+ "zumba": 32976,
+ "zun": 42440,
+ "zur": 17128,
+ "zurich": 21288,
+ "zw": 42188,
+ "zx": 31604,
+ "zy": 6615,
+ "zy": 2303,
+ "zyk": 39112,
+ "zyme": 36472,
+ "zyn": 45287,
+ "zz": 1544,
+ "zz": 4943,
+ "zza": 14642,
+ "zzi": 13974,
+ "zzie": 18635,
+ "zzle": 7873,
+ "zzled": 39075,
+ "zzo": 14036,
+ "zzy": 21275,
+ "zzy": 8353,
+ "zzz": 20055,
+ "zzzz": 35742,
+ "zzzz": 43103,
+ "{": 90,
+ "{": 346,
+ "{}": 39025,
+ "|": 91,
+ "|#": 31183,
+ "|": 347,
+ "|@": 41677,
+ "||": 7566,
+ "}": 92,
+ "}": 348,
+ "~": 93,
+ "~!": 31181,
+ "~\"": 48442,
+ "~": 349,
+ "~>": 43291,
+ "~@": 44247,
+ "~~": 11461,
+ "~~": 16671,
+ "~~~": 32472,
+ "~~~~": 28295,
+ "¡": 94,
+ "¡": 350,
+ "¡ï¸ı": 15113,
+ "¡ï¸ı": 4174,
+ "¡ľ": 43991,
+ "¢": 95,
+ "¢": 351,
+ "£": 96,
+ "£": 352,
+ "£ï¸ı": 18446,
+ "¤": 97,
+ "¤": 353,
+ "¥": 98,
+ "¥": 354,
+ "¦": 99,
+ "¦": 355,
+ "¦Ī": 47615,
+ "§": 100,
+ "§": 356,
+ "¨": 101,
+ "¨": 357,
+ "©": 102,
+ "©": 358,
+ "ª": 103,
+ "ª": 359,
+ "«": 104,
+ "«": 360,
+ "¬": 105,
+ "¬": 361,
+ "‘": 31736,
+ "®": 106,
+ "®": 362,
+ "¯": 107,
+ "¯": 363,
+ "°": 108,
+ "°:": 21787,
+ "°": 364,
+ "°ï¸ı": 34777,
+ "±": 109,
+ "±": 365,
+ "±ï¸ı": 41020,
+ "²": 110,
+ "²": 366,
+ "³": 111,
+ "³": 367,
+ "³ï¸ı": 22195,
+ "³ï¸ı": 24706,
+ "´": 112,
+ "´": 368,
+ "µ": 113,
+ "µ": 369,
+ "µï¸ı": 27605,
+ "¶": 114,
+ "¶": 370,
+ "·": 115,
+ "·": 371,
+ "¸": 116,
+ "¸": 372,
+ "¸ë": 19693,
+ "¹": 117,
+ "¹": 373,
+ "º": 118,
+ "º": 374,
+ "»": 119,
+ "»": 375,
+ "¼": 120,
+ "¼": 376,
+ "½": 121,
+ "½": 377,
+ "½ï¸ı": 31333,
+ "¾": 122,
+ "¾": 378,
+ "¿": 123,
+ "¿": 379,
+ "À": 124,
+ "À": 380,
+ "Á": 125,
+ "Á": 381,
+ "Â": 126,
+ "Â": 382,
+ "¡": 26868,
+ "¡": 10830,
+ "¡¡": 45505,
+ "¢": 41359,
+ "£": 31117,
+ "£": 1950,
+ "Â¥": 20199,
+ "¨": 19957,
+ "¨¨": 23089,
+ "¨¨¨¨": 41223,
+ "©": 31148,
+ "©": 5811,
+ "«": 14434,
+ "®": 30857,
+ "®": 8436,
+ "¯": 38682,
+ "¯": 43593,
+ "¯\\": 44096,
+ "¯\\_(": 45115,
+ "°": 21305,
+ "°": 6858,
+ "²": 41175,
+ "´": 30560,
+ "´": 12559,
+ "·": 14844,
+ "º": 28059,
+ "»": 31642,
+ "»": 7599,
+ "½": 33613,
+ "¿": 44559,
+ "¿": 17133,
+ "ÂŃ": 22618,
+ "Ã": 127,
+ "Ã": 383,
+ "á": 7261,
+ "á": 22229,
+ "án": 38340,
+ "án": 21385,
+ "â": 26170,
+ "ã": 19339,
+ "ão": 21141,
+ "ä": 10896,
+ "ä": 47276,
+ "än": 42787,
+ "Ã¥": 23176,
+ "æ": 42495,
+ "ç": 10067,
+ "ça": 22711,
+ "è": 12138,
+ "è": 37761,
+ "ère": 30272,
+ "ès": 41210,
+ "é": 3459,
+ "é": 4166,
+ "éal": 45251,
+ "ée": 13489,
+ "és": 20507,
+ "ê": 27515,
+ "ë": 29526,
+ "ë": 40520,
+ "î": 48704,
+ "ï": 35689,
+ "ñ": 6445,
+ "ña": 17753,
+ "ño": 16574,
+ "ños": 40104,
+ "ó": 8891,
+ "ó": 27733,
+ "ón": 13926,
+ "ô": 26815,
+ "ö": 7255,
+ "ö": 37423,
+ "ör": 31762,
+ "ø": 17483,
+ "ø": 45598,
+ "ú": 17963,
+ "ú": 36019,
+ "ü": 6522,
+ "ü": 47177,
+ "ür": 26132,
+ "ÃĹ": 16165,
+ "Ãł": 36149,
+ "Ãł": 21259,
+ "ÃŃ": 8366,
+ "ÃŃ": 23928,
+ "ÃŃa": 16609,
+ "ÃŃn": 33623,
+ "Ä": 128,
+ "Ä": 384,
+ "ı": 18562,
+ "ı": 41901,
+ "Äģ": 23134,
+ "Äĩ": 31719,
+ "Äį": 45414,
+ "ÄŁ": 26540,
+ "Å": 129,
+ "Å": 385,
+ "Å¡": 35621,
+ "ÅĤ": 40419,
+ "Åį": 41267,
+ "ÅŁ": 21254,
+ "ÅŁ": 40706,
+ "Æ": 130,
+ "Æ": 386,
+ "Ç": 131,
+ "Ç": 387,
+ "È": 132,
+ "È": 388,
+ "É": 133,
+ "É": 389,
+ "Ê": 134,
+ "Ê": 390,
+ "Ë": 135,
+ "Ë": 391,
+ "Ì": 136,
+ "Ì": 392,
+ "Ìĩ": 16384,
+ "Í": 137,
+ "Í": 393,
+ "Î": 138,
+ "Î": 394,
+ "Ï": 139,
+ "Ï": 395,
+ "Ïī": 38065,
+ "Ð": 140,
+ "Ð": 396,
+ "а": 16912,
+ "а": 27080,
+ "аÐ": 31090,
+ "в": 39813,
+ "е": 22176,
+ "и": 16701,
+ "иÐ": 29503,
+ "к": 27152,
+ "л": 47611,
+ "м": 38018,
+ "н": 22705,
+ "о": 13506,
+ "о": 29386,
+ "оÐ": 20978,
+ "од": 38416,
+ "оÑĤ": 28599,
+ "п": 26302,
+ "пÑĢи": 46321,
+ "пÑĢиÑĢода": 48150,
+ "Ñ": 141,
+ "Ñ": 397,
+ "ÑĢ": 16370,
+ "ÑĢи": 41092,
+ "ÑĢод": 47039,
+ "ÑĢода": 47929,
+ "Ñģ": 23669,
+ "ÑĤ": 17875,
+ "Ñĥ": 39729,
+ "ÑĦ": 27993,
+ "ÑĦоÑĤ": 35155,
+ "ÑĦоÑĤо": 38981,
+ "Ñĭ": 45001,
+ "Ò": 142,
+ "Ò": 398,
+ "Ó": 143,
+ "Ó": 399,
+ "Ô": 144,
+ "Ô": 400,
+ "Õ": 145,
+ "Õ": 401,
+ "Ö": 146,
+ "Ö": 402,
+ "×": 147,
+ "×": 403,
+ "Ø": 148,
+ "Ø": 404,
+ "ا": 6042,
+ "ا": 22625,
+ "اØ": 13189,
+ "ار": 40137,
+ "اÙ": 8453,
+ "اÙĦ": 12973,
+ "اÙħ": 47626,
+ "اÙĨ": 42773,
+ "اÙĨ": 33200,
+ "ب": 16378,
+ "ب": 35330,
+ "Ø©": 20915,
+ "ت": 18197,
+ "ت": 44333,
+ "ج": 26375,
+ "Ø®": 41495,
+ "د": 19872,
+ "د": 35566,
+ "ر": 10948,
+ "ر": 24933,
+ "رÙĬ": 43273,
+ "ز": 36169,
+ "س": 17856,
+ "Ø´": 28770,
+ "ص": 27271,
+ "Ø·": 32050,
+ "ع": 18843,
+ "غ": 48510,
+ "ØŃ": 25722,
+ "Ù": 149,
+ "Ù": 405,
+ "Ùģ": 24112,
+ "ÙĤ": 27585,
+ "Ùĥ": 33499,
+ "ÙĦ": 14251,
+ "ÙĦ": 37899,
+ "Ùħ": 12986,
+ "Ùħ": 29945,
+ "ÙĨ": 16655,
+ "ÙĨ": 25386,
+ "Ùĩ": 34274,
+ "Ùĩ": 31343,
+ "ÙĪ": 12203,
+ "ÙĪ": 38310,
+ "ÙĪØ±": 48242,
+ "ÙĬ": 12046,
+ "ÙĬ": 23853,
+ "Ú": 150,
+ "Ú": 406,
+ "Ú©": 26475,
+ "Û": 151,
+ "Û": 407,
+ "Ûģ": 40480,
+ "ÛĮ": 21452,
+ "ÛĮ": 32703,
+ "Ü": 152,
+ "Ü": 408,
+ "Ý": 153,
+ "Ý": 409,
+ "Þ": 154,
+ "Þ": 410,
+ "ß": 155,
+ "ß": 411,
+ "à": 156,
+ "à": 412,
+ "à¤": 3124,
+ "त": 27263,
+ "द": 29552,
+ "न": 26090,
+ "प": 44149,
+ "ब": 43599,
+ "म": 48254,
+ "म": 26774,
+ "य": 37299,
+ "र": 39136,
+ "र": 19052,
+ "ल": 30881,
+ "व": 39545,
+ "श": 43181,
+ "स": 28505,
+ "ह": 29446,
+ "ा": 37973,
+ "ा": 13343,
+ "ि": 26721,
+ "à¤Ĥ": 30833,
+ "à¤ķ": 22067,
+ "à¤Ĺ": 42598,
+ "à¤ľ": 39561,
+ "à¥": 7410,
+ "à¥Ģ": 45791,
+ "à¥Ģ": 25751,
+ "à¥ģ": 39653,
+ "à¥ĩ": 48612,
+ "à¥ĩ": 25130,
+ "à¥ĭ": 34452,
+ "à¥į": 19389,
+ "à¦": 11322,
+ "া": 41532,
+ "à§": 26339,
+ "à¨": 15741,
+ "à©": 32086,
+ "àª": 22990,
+ "à«": 48347,
+ "à¬": 32791,
+ "à®": 6022,
+ "த": 34691,
+ "ன": 43394,
+ "ப": 47388,
+ "à®®": 35463,
+ "à®°": 43270,
+ "ல": 47705,
+ "ா": 32831,
+ "ி": 27126,
+ "à®ķ": 36168,
+ "à®Ł": 45263,
+ "à¯": 11259,
+ "à¯ģ": 33115,
+ "à¯į": 16631,
+ "à°": 12100,
+ "à±": 23550,
+ "à±į": 46098,
+ "à²": 9992,
+ "ಿ": 47797,
+ "à³": 20745,
+ "à³į": 36148,
+ "à´": 15418,
+ "àµ": 27392,
+ "àµį": 45266,
+ "à¶": 29881,
+ "à·": 30766,
+ "à¸": 1777,
+ "ม": 26137,
+ "ม": 29570,
+ "ย": 27241,
+ "ย": 33091,
+ "ร": 32225,
+ "ร": 27331,
+ "ล": 34696,
+ "ล": 32746,
+ "ว": 26990,
+ "ว": 30245,
+ "ส": 37883,
+ "ส": 35737,
+ "ห": 33064,
+ "ะ": 43920,
+ "ะ": 49234,
+ "ั": 14978,
+ "า": 11529,
+ "า": 38476,
+ "าà¸": 12330,
+ "ิ": 17092,
+ "ี": 22421,
+ "ี": 20278,
+ "ีà¹Ī": 31511,
+ "ื": 47991,
+ "ุ": 30524,
+ "ู": 35273,
+ "à¸ģ": 30767,
+ "à¸ģà¸": 31474,
+ "à¸Ħ": 31757,
+ "à¸Ħà¸": 39628,
+ "à¸ĩ": 24603,
+ "à¸ĩ": 33382,
+ "à¸Ī": 47608,
+ "à¸Ĭ": 46324,
+ "à¸Ķ": 31107,
+ "à¸Ķ": 38825,
+ "à¸ķ": 40273,
+ "à¸ķ": 41108,
+ "à¸Ĺ": 36171,
+ "à¸Ļ": 17474,
+ "à¸Ļ": 17639,
+ "à¸Ļà¸": 23121,
+ "à¸ļ": 33859,
+ "à¸ļ": 39616,
+ "à¸ŀ": 48171,
+ "à¸Ń": 13398,
+ "à¸Ń": 32818,
+ "à¸Ńà¸": 14649,
+ "à¸Ńà¸ĩ": 46622,
+ "à¹": 4484,
+ "à¹Ģ": 13729,
+ "à¹Ģà¸": 14076,
+ "à¹ģà¸": 23916,
+ "à¹Ĥ": 33118,
+ "à¹ĥ": 40962,
+ "à¹Ħà¸": 31718,
+ "à¹ĩ": 38699,
+ "à¹Ī": 11722,
+ "à¹ī": 13123,
+ "à¹Į": 28353,
+ "à¼": 46186,
+ "à½": 39219,
+ "á": 157,
+ "á": 413,
+ "á´": 19036,
+ "áµ": 17330,
+ "áĢ": 45932,
+ "áĥ": 24829,
+ "áĥ¦": 32193,
+ "â": 158,
+ "â": 414,
+ "â¤": 25087,
+ "⤵ï¸ı": 36026,
+ "â¬": 7930,
+ "â¬ħï¸ı": 42111,
+ "â¬Ĩ": 27718,
+ "â¬Ĩï¸ı": 32798,
+ "â¬ĩ": 10917,
+ "â¬ĩ": 39370,
+ "â¬ĩï¸ı": 25621,
+ "â¬ĩï¸ı": 13984,
+ "â¬ĩï¸ıâ¬ĩï¸ı": 40159,
+ "âĢ": 728,
+ "âĢ¢": 9485,
+ "âĢ¢": 2701,
+ "âĢ¢âĢ¢": 15006,
+ "âĢ¢âĢ¢": 47575,
+ "âĢ¢âĢ¢âĢ¢âĢ¢": 27502,
+ "âĢ¢âĢ¢âĢ¢âĢ¢âĢ¢âĢ¢âĢ¢âĢ¢": 48630,
+ "â̦": 7095,
+ "â̦\"": 20215,
+ "â̦..": 47779,
+ "â̦.": 18615,
+ "â̦/": 29842,
+ "â̦": 959,
+ "â̦â̦": 40066,
+ "â̲": 32633,
+ "â̳": 25061,
+ "â̼": 6578,
+ "â̼ï¸ı": 15622,
+ "â̼ï¸ı": 8310,
+ "â̼ï¸ıâ̼ï¸ı": 33218,
+ "âĢĭ": 17086,
+ "âĢĭ": 9844,
+ "âĢį": 4244,
+ "âĢįâĻ": 5177,
+ "âĢįâĻĢï¸ı": 18897,
+ "âĢįâĻĢï¸ı": 9605,
+ "âĢįâĻĤ": 8832,
+ "âĢįâĻĤï¸ı": 21779,
+ "âĢįâĻĤï¸ı": 10613,
+ "âĢİ": 31001,
+ "âĢIJ": 34512,
+ "âĢĵ": 21070,
+ "âĢĵ": 1224,
+ "âĢĶ": 6718,
+ "âĢĶ": 2005,
+ "âĢĶ>": 26341,
+ "âĢĶ@": 28470,
+ "âĢĶâĢĶ": 10037,
+ "âĢĶâĢĶ": 44800,
+ "âĢĶâĢĶâĢĶâĢĶ": 17797,
+ "âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ": 34432,
+ "âĢķ": 14236,
+ "âģ": 1667,
+ "âģ£": 31089,
+ "âģ£": 16845,
+ "âģ¦": 2773,
+ "âģ¦": 34855,
+ "âģ¦@": 2859,
+ "âģ¦âģ¦@": 27783,
+ "âģ©": 20097,
+ "âģ©,": 48749,
+ "âģ©.": 35777,
+ "âģ©": 2918,
+ "âģīï¸ı": 46534,
+ "âģł": 23881,
+ "âģł": 13503,
+ "âģłâģł": 33488,
+ "âĤ": 5227,
+ "âĤ¬": 34919,
+ "âĤ¬": 6309,
+ "âĤ¹": 21777,
+ "âĥ": 2805,
+ "âĥ£": 11250,
+ "âĥ£": 3076,
+ "âĥ£@": 48291,
+ "âĦ": 8604,
+ "âĦ¢": 29438,
+ "âĦ¢": 11675,
+ "âĦ¹": 45462,
+ "âĨ": 6059,
+ "âĨĴ": 7481,
+ "âĨĵ": 41603,
+ "âĩ": 27228,
+ "âĪ": 17788,
+ "âī": 22684,
+ "âīĪ": 45451,
+ "âĮ": 17848,
+ "âĮļ": 31301,
+ "âĮļï¸ı": 35931,
+ "âı": 7960,
+ "âı©": 40847,
+ "âı°": 12714,
+ "âı±": 33149,
+ "âı³": 47617,
+ "âĵ": 27400,
+ "âĶ": 13389,
+ "âĶĢ": 45139,
+ "âĶģ": 42022,
+ "âķ": 17027,
+ "âķIJ": 48039,
+ "âĸ": 4168,
+ "âĸª": 21203,
+ "âĸª": 36628,
+ "âĸªï¸ı": 24974,
+ "âĸ«": 39478,
+ "âĸ¬": 33798,
+ "âĸ¬âĸ¬": 36975,
+ "âĸ¶": 12509,
+ "âĸ¶": 21126,
+ "âĸ¶ï¸ı": 14442,
+ "âĸº": 46061,
+ "âĸº": 12086,
+ "âĸ½": 45634,
+ "âĸł": 36791,
+ "âĹ": 9323,
+ "âĹĨ": 48961,
+ "âĹı": 26999,
+ "âĺ": 1741,
+ "âĺ®": 45851,
+ "âĺ¹": 28811,
+ "âĺ¹ï¸ı": 39605,
+ "âĺº": 5010,
+ "âĺº": 8703,
+ "âĺºâĺº": 46051,
+ "âĺºï¸ı": 11506,
+ "âĺºï¸ı": 7779,
+ "âĺºï¸ıâĺºï¸ı": 41315,
+ "âĺ¼": 38877,
+ "âĺĢ": 32146,
+ "âĺĢ": 22242,
+ "âĺĢï¸ı": 12817,
+ "âĺĢï¸ı": 8219,
+ "âĺĢï¸ıâĺĢï¸ı": 44550,
+ "âĺģ": 25195,
+ "âĺģï¸ı": 35197,
+ "âĺĥ": 38972,
+ "âĺħ": 9339,
+ "âĺħ": 10643,
+ "âĺħâĺħ": 12681,
+ "âĺħâĺħ": 36644,
+ "âĺħâĺħâĺħâĺħ": 34431,
+ "âĺħâĺħâĺħâĺħ": 44034,
+ "âĺħâĺħâĺħâĺħâĺħ": 45984,
+ "âĺĨ": 23941,
+ "âĺĨ": 13439,
+ "âĺİ": 24045,
+ "âĺİ": 45493,
+ "âĺİï¸ı": 27219,
+ "âĺij": 20983,
+ "âĺij": 42300,
+ "âĺijï¸ı": 22291,
+ "âĺĶï¸ı": 31238,
+ "âĺķ": 11454,
+ "âĺķ": 26561,
+ "âĺķï¸ı": 25839,
+ "âĺķï¸ı": 15499,
+ "âĺĺ": 23483,
+ "âĺĺï¸ı": 31454,
+ "âĺĿ": 21982,
+ "âĺĿï¸ı": 38891,
+ "âĺŀ": 31255,
+ "âĺłï¸ı": 34672,
+ "âĻ": 1548,
+ "âĻ¡": 11091,
+ "âĻ¡": 6251,
+ "âĻ¡âĻ¡": 22360,
+ "âĻ¡âĻ¡": 34267,
+ "âĻ¡âĻ¡âĻ¡": 36611,
+ "âϤ": 47435,
+ "âĻ¥": 4622,
+ "âĻ¥": 3405,
+ "âĻ¥âĻ¥": 12975,
+ "âĻ¥âĻ¥": 19604,
+ "âĻ¥âĻ¥âĻ¥": 23255,
+ "âĻ¥âĻ¥âĻ¥âĻ¥": 49020,
+ "âĻ¥ï¸ı": 17774,
+ "âĻ¥ï¸ı": 10561,
+ "âĻ¥ï¸ıâĻ¥ï¸ı": 40309,
+ "âϦ": 32376,
+ "âϦ": 47547,
+ "âĻ©": 30339,
+ "âĻ©âĻ«": 31636,
+ "âĻª": 27364,
+ "âĻª": 12382,
+ "âĻ«": 39217,
+ "âĻ«": 10814,
+ "âϬ": 24753,
+ "âĻ»": 39611,
+ "âĻ»ï¸ı": 46075,
+ "âļ": 2234,
+ "âļ¡": 40098,
+ "âļ¡": 20712,
+ "âļ¡ï¸ı": 19500,
+ "âļ¡ï¸ı": 11605,
+ "âļ¡ï¸ıâļ¡ï¸ı": 45922,
+ "âļª": 11922,
+ "âļª": 36373,
+ "âļªï¸ı": 22251,
+ "âļªï¸ı": 17885,
+ "âļ«": 15374,
+ "âļ«ï¸ı": 26529,
+ "âļ«ï¸ı": 24649,
+ "âļ½": 4867,
+ "âļ½": 13173,
+ "âļ½âļ½": 43259,
+ "âļ½ï¸ı": 11342,
+ "âļ½ï¸ı": 6768,
+ "âļ½ï¸ıâļ½ï¸ı": 30358,
+ "âļ½ï¸ıâļ½ï¸ı": 44148,
+ "âļ¾": 11314,
+ "âļ¾": 34717,
+ "âļ¾ï¸ı": 24727,
+ "âļ¾ï¸ı": 14858,
+ "âļĵ": 23522,
+ "âļĵï¸ı": 35299,
+ "âļĶï¸ı": 29361,
+ "âļľ": 47491,
+ "âļł": 39203,
+ "âļłï¸ı": 40966,
+ "âļłï¸ı": 15596,
+ "âĽ": 7956,
+ "âĽ³ï¸ı": 29204,
+ "âĽĦ": 30668,
+ "âĽĦï¸ı": 45465,
+ "âľ": 1508,
+ "⾨": 7181,
+ "⾨": 3531,
+ "⾨⾨": 35174,
+ "⾨⾨": 21985,
+ "⾨⾨⾨": 39424,
+ "âľĤ": 38602,
+ "âľħ": 29544,
+ "âľħ": 5564,
+ "âľĪ": 10682,
+ "âľĪ": 30712,
+ "âľĪï¸ı": 26176,
+ "âľĪï¸ı": 13413,
+ "âľĬ": 12392,
+ "âľĬ": 17819,
+ "âľĬðŁı½": 48547,
+ "âľĬðŁı¾": 41185,
+ "âľĭ": 39383,
+ "âľĭ": 30239,
+ "âľĮ": 6419,
+ "âľĮ": 12656,
+ "âľĮï¸ı": 21906,
+ "âľĮï¸ı": 12239,
+ "âľĮðŁı»": 30538,
+ "âľĮðŁı¼": 30588,
+ "âľį": 20872,
+ "âľįï¸ı": 30888,
+ "âľı": 32574,
+ "âľıï¸ı": 40724,
+ "âľĵ": 36700,
+ "âľĶ": 47200,
+ "âľĶ": 13749,
+ "âľĶï¸ı": 40544,
+ "âľĶï¸ı": 9191,
+ "âľĸï¸ı": 44133,
+ "âľĿ": 42220,
+ "âĿ": 1045,
+ "âĿ£": 37007,
+ "âĿ£": 25623,
+ "âĿ£ï¸ı": 25240,
+ "âĿ¤": 1266,
+ "âĿ¤": 2720,
+ "âĿ¤âĿ¤": 9033,
+ "âĿ¤âĿ¤": 14058,
+ "âĿ¤âĿ¤âĿ¤": 16708,
+ "âĿ¤âĿ¤âĿ¤âĿ¤": 37918,
+ "âĿ¤âĿ¤âĿ¤âĿ¤": 43970,
+ "âĿ¤ï¸ı": 2626,
+ "âĿ¤ï¸ı#": 30281,
+ "âĿ¤ï¸ı.": 45326,
+ "âĿ¤ï¸ı": 1752,
+ "âĿ¤ï¸ı@": 31187,
+ "âĿ¤ï¸ıâĿ¤ï¸ı": 6713,
+ "âĿ¤ï¸ıâĿ¤ï¸ı": 10363,
+ "âĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ı": 12282,
+ "âĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ı": 39167,
+ "âĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ı": 29880,
+ "âĿ¤ï¸ıðŁĴĻ": 37380,
+ "âĿ¤ï¸ıðŁĺį": 37272,
+ "âĿ¤ï¸ıðŁĺĺ": 41800,
+ "âĿ¤ðŁĺį": 49120,
+ "âĿ¥": 36914,
+ "âĿĦ": 8501,
+ "âĿĦ": 30494,
+ "âĿĦï¸ı": 16834,
+ "âĿĦï¸ı": 12402,
+ "âĿĦï¸ıâĿĦï¸ı": 41626,
+ "âĿĮ": 44485,
+ "âĿĮ": 17975,
+ "âĿĵ": 29791,
+ "âĿĹ": 12868,
+ "âĿĹ": 29079,
+ "âĿĹï¸ı": 28642,
+ "âĿĹï¸ı": 17391,
+ "âĿĿ": 46951,
+ "âŀ": 3257,
+ "âŀ¡": 12854,
+ "âŀ¡ï¸ı": 31860,
+ "âŀ¡ï¸ı": 4956,
+ "âŀ¤": 18651,
+ "âŀķ": 46526,
+ "âŀĸ": 21327,
+ "âŀĸ": 34902,
+ "âŀĸâŀĸ": 23316,
+ "âŀĸâŀĸâŀĸâŀĸ": 40401,
+ "âŀľ": 23775,
+ "âł": 5689,
+ "âłĢ": 9691,
+ "âłĢ": 8621,
+ "âłĢâłĢ": 11466,
+ "âłĢâłĢ": 39092,
+ "âłĢâłĢâłĢâłĢ": 20976,
+ "âłĢâłĢâłĢâłĢâłĢâłĢâłĢâłĢ": 46063,
+ "âŃ": 5527,
+ "âŃIJ": 6410,
+ "âŃIJ": 19012,
+ "âŃIJâŃIJ": 32663,
+ "âŃIJï¸ı": 12427,
+ "âŃIJï¸ı": 10251,
+ "âŃIJï¸ıâŃIJï¸ı": 18640,
+ "âŃIJï¸ıâŃIJï¸ıâŃIJï¸ı": 40746,
+ "ã": 159,
+ "ã": 415,
+ "ãĢ": 4092,
+ "ãĢģ": 45262,
+ "ãĢĤ": 38060,
+ "ãĢĤ": 38000,
+ "ãĢĬ": 39920,
+ "ãĢĭ": 32898,
+ "ãĢĮ": 18116,
+ "ãĢį": 19149,
+ "ãĢİ": 26947,
+ "ãĢı": 30293,
+ "ãĢIJ": 12534,
+ "ãĢij": 12990,
+ "ãĢľ": 39581,
+ "ãģ": 4813,
+ "ãģ¦": 48029,
+ "ãģ¨": 34671,
+ "ãģ¨ç¹ĭãģ": 47310,
+ "ãģ¨ç¹ĭãģĮãĤĬãģŁãģĦ": 48290,
+ "ãģª": 29104,
+ "ãģ®": 21575,
+ "ãģ·": 44130,
+ "ãģĦ": 33523,
+ "ãģĦ": 38850,
+ "ãģĨ": 44235,
+ "ãģį": 42184,
+ "ãĤ": 3909,
+ "ãĤ¢": 26560,
+ "ãĤ¤": 19319,
+ "ãĤ¤ãĥ": 36294,
+ "ãĤ«": 37367,
+ "ãĤ¯": 31574,
+ "ãĤ·": 37665,
+ "ãĤ¸": 32234,
+ "ãĤ¸ãĥ": 43491,
+ "ãĤ¹": 22694,
+ "ãĤ¹": 39220,
+ "ãĤ¹ãĥ": 32421,
+ "ãĤ¿": 34941,
+ "ãĤĬãģ": 40500,
+ "ãĤĮ": 45211,
+ "ãĤŃ": 47121,
+ "ãĥ": 2429,
+ "ãĥ©": 23007,
+ "ãĥª": 32115,
+ "ãĥ«": 33257,
+ "ãĥ¬": 32965,
+ "ãĥ³": 17671,
+ "ãĥ³": 26875,
+ "ãĥ³ãĤ": 45105,
+ "ãĥ³ãĥ": 25914,
+ "ãĥ»": 8415,
+ "ãĥ»": 11158,
+ "ãĥ»ãĥ»": 13949,
+ "ãĥ»ãĥ»ãĥ»": 14234,
+ "ãĥ¼": 13457,
+ "ãĥ¼": 30391,
+ "ãĥ¼ãĥ": 18584,
+ "ãĥĥ": 28902,
+ "ãĥĦ": 32173,
+ "ãĥĪ": 42384,
+ "ãĥİ": 39967,
+ "ãĥķãĤ": 33371,
+ "ãĥŀ": 48924,
+ "ãĥŃ": 35827,
+ "ãħ": 5947,
+ "ãħ¤": 21096,
+ "ãħ¤ãħ¤": 22583,
+ "ãħ¤ãħ¤ãħ¤ãħ¤": 39329,
+ "ãħĭ": 13052,
+ "ãħĭ": 25108,
+ "ãħĭãħĭ": 16604,
+ "ãħĭãħĭ": 42581,
+ "ãħĭãħĭãħĭ": 46407,
+ "ãħĭãħĭãħĭãħĭ": 39362,
+ "ãħł": 16089,
+ "ãħł": 25781,
+ "ãħłãħł": 22021,
+ "ãħłãħł": 34398,
+ "ãħłãħłãħłãħł": 47028,
+ "ä": 160,
+ "ä": 416,
+ "ä¸": 19759,
+ "ä¹": 41854,
+ "äº": 21078,
+ "人": 36839,
+ "ä»": 37743,
+ "ä½": 47466,
+ "å": 161,
+ "å": 417,
+ "å¤": 23170,
+ "å¥": 29290,
+ "å®": 27047,
+ "å°": 34720,
+ "å±": 46096,
+ "å¸": 42021,
+ "å¹": 38780,
+ "åħ": 34314,
+ "åĨ": 27972,
+ "åĨĻ": 44653,
+ "åĪ": 42748,
+ "åĭ": 47505,
+ "åı": 34517,
+ "åIJ": 41673,
+ "åĽ": 39027,
+ "åľ": 37746,
+ "åŃ": 35751,
+ "æ": 162,
+ "æ": 418,
+ "æĸ": 29032,
+ "æĹ": 22265,
+ "æĹ¥": 39121,
+ "æĹ¥": 37156,
+ "æĺ": 42891,
+ "æĻ": 48132,
+ "æľ": 19277,
+ "æľ¬": 44353,
+ "æĿ": 27667,
+ "æĿ±": 48338,
+ "ç": 163,
+ "ç": 419,
+ "ç¥": 26369,
+ "ç¥Ń": 42557,
+ "çµ": 37810,
+ "ç¹": 43431,
+ "ç¹ĭãģ": 45930,
+ "çĶ": 20211,
+ "çĶŁ": 33375,
+ "çľ": 33440,
+ "羣": 41570,
+ "è": 164,
+ "è": 420,
+ "èª": 34002,
+ "èªķ": 41293,
+ "é": 165,
+ "é": 421,
+ "éģ": 44854,
+ "éĩ": 38283,
+ "ê": 166,
+ "ê": 422,
+ "ê°": 21122,
+ "ê°ĵ": 41076,
+ "ê°ĵìĦ¸ë¸IJ": 41689,
+ "ê°ķ": 45758,
+ "ê²": 35555,
+ "ê³": 36216,
+ "êµ": 31871,
+ "ê·": 42680,
+ "ê¸": 32495,
+ "ê¹": 24531,
+ "ê¹Ģ": 25203,
+ "ë": 167,
+ "ë": 423,
+ "ë¦": 24621,
+ "리": 47649,
+ "ë§": 28024,
+ "ë§Ī": 40027,
+ "ëª": 36311,
+ "ë¯": 19528,
+ "민": 34442,
+ "민": 44632,
+ "ë°": 15810,
+ "ë°©": 23273,
+ "ë°©íĥ": 25081,
+ "ë°©íĥĦ": 25641,
+ "ë°©íĥĦìĨĮëħĦëĭ": 26068,
+ "ë°©íĥĦìĨĮëħĦëĭ¨": 27129,
+ "ë°ķ": 40988,
+ "ë²": 48267,
+ "ë³": 44693,
+ "ë¹": 24193,
+ "ëĤ": 27252,
+ "ëĤĺ": 48484,
+ "ëĭ": 13094,
+ "ëĭ¤": 46680,
+ "ëĭĪ": 33708,
+ "ëį": 45543,
+ "ëı": 31972,
+ "ëĵ": 30850,
+ "ëĿ": 44317,
+ "ì": 168,
+ "ì": 424,
+ "ì£": 39856,
+ "주": 45161,
+ "ì¤": 31153,
+ "ì§": 16279,
+ "ì§Ģ": 28836,
+ "ì§Ħ": 38890,
+ "ì°": 40742,
+ "ì¶": 42476,
+ "ì¶ķ": 46403,
+ "ì¶ķíķĺ": 47866,
+ "ì¹": 45088,
+ "ìĤ": 31061,
+ "ìĥ": 30587,
+ "ìĥĿ": 47858,
+ "ìĦ": 15074,
+ "ìĦ¸ë": 29254,
+ "ìĦ¸ë¸": 29658,
+ "ìĦ¸ë¸IJ": 41415,
+ "ìĨ": 15115,
+ "ìĨĮë": 20515,
+ "ìĨĮëħ": 21391,
+ "ìĨĮëħĦëĭ": 25887,
+ "ìĪ": 32757,
+ "ìĬ": 12125,
+ "ìĬ¤": 20305,
+ "ìĬ¤": 23829,
+ "ìĭ": 23924,
+ "ìķ": 16071,
+ "ìķĦ": 23233,
+ "ìĸ": 31625,
+ "ìĹ": 13252,
+ "ìĹIJ": 37622,
+ "ìĹij": 31036,
+ "ìĹijìĨ": 42763,
+ "ìĹijìĨĮ": 45606,
+ "ìĺ": 21144,
+ "ìĻ": 39405,
+ "ìļ": 18541,
+ "ìļ°": 38415,
+ "ìļ°": 49344,
+ "ìĽ": 22543,
+ "ìĽIJ": 36495,
+ "ìľ": 20909,
+ "ìľł": 42890,
+ "ìĿ": 8276,
+ "ìĿ´": 12286,
+ "ìĿ´": 34746,
+ "ìĿ´ì": 37590,
+ "ìĿ¼": 43406,
+ "ìŀ": 20849,
+ "ìł": 20580,
+ "ìłķ": 34725,
+ "í": 169,
+ "í": 425,
+ "íģ": 35641,
+ "íģ¬": 45832,
+ "íĤ": 43565,
+ "íĥ": 15012,
+ "íĥĢ": 41126,
+ "íĥľ": 37663,
+ "íĬ": 23215,
+ "íĬ¸": 48974,
+ "íĬ¸": 39820,
+ "íĭ": 34350,
+ "íĶ": 29450,
+ "íķ": 15197,
+ "íķ´": 35286,
+ "íķĺ": 33992,
+ "íĺ": 15962,
+ "íĺ¸": 39657,
+ "íĺĦ": 34645,
+ "íĻ": 31882,
+ "î": 170,
+ "î": 426,
+ "îĢ": 36288,
+ "îĦ": 35368,
+ "îĮ": 41006,
+ "îIJ": 16929,
+ "îIJĴ": 40100,
+ "ï": 171,
+ "ï": 427,
+ "ï¸": 842,
+ "ï¸İ": 24029,
+ "ï¸ı": 1392,
+ "ï¸ı#": 46997,
+ "ï¸ı:": 32604,
+ "ï¸ı": 1001,
+ "ï¸ı@": 34600,
+ "ï¸ıâĥ£": 17394,
+ "ï¸ıâĥ£-": 40376,
+ "ï¸ıâĥ£": 4603,
+ "ï¿": 27850,
+ "�": 47356,
+ "�": 39802,
+ "ð": 172,
+ "ð": 428,
+ "ðĿ": 6874,
+ "ðĿIJ": 15889,
+ "ðĿij": 43794,
+ "ðĿĴ": 43387,
+ "ðĿĵ": 47110,
+ "ðĿĹ": 18865,
+ "ðĿĺ": 26109,
+ "ðĿĻ": 29415,
+ "ðŁ": 558,
+ "ð٤": 1793,
+ "ðŁ¤£": 9665,
+ "ðŁ¤£": 9909,
+ "ðŁ¤£ðŁ¤£": 16430,
+ "ðŁ¤£ðŁ¤£": 31009,
+ "ðŁ¤£ðŁ¤£ðŁ¤£": 32262,
+ "ðŁ¤¤": 39550,
+ "ðŁ¤¤": 26759,
+ "ðŁ¤¦": 17186,
+ "ðŁ¤§": 40983,
+ "ðŁ¤©": 27351,
+ "ðŁ¤©": 16074,
+ "ðŁ¤ª": 44230,
+ "ðŁ¤ª": 24920,
+ "ðŁ¤«": 47671,
+ "ðŁ¤¯": 37595,
+ "ðŁ¤·": 13185,
+ "ðŁ¤·ðŁı»âĢįâĻĢï¸ı": 46770,
+ "ð٤ij": 34801,
+ "ð٤ĵ": 36580,
+ "ð٤ĵ": 18928,
+ "ð٤Ķ": 12706,
+ "ð٤Ķ": 6497,
+ "ð٤Ķð٤Ķ": 28490,
+ "ð٤Ķð٤Ķð٤Ķ": 43361,
+ "ð٤ĸ": 46146,
+ "ð٤Ĺ": 16646,
+ "ð٤Ĺ": 10465,
+ "ð٤Ĺð٤Ĺ": 44321,
+ "ð٤ĺ": 10623,
+ "ð٤ĺ": 17288,
+ "ð٤ĺðŁı»": 46449,
+ "ð٤ĺðŁı»": 30891,
+ "ð٤ĺðŁı¼": 31458,
+ "ð٤ĺðŁı½": 49362,
+ "ð٤Ļ": 23800,
+ "ð٤Ļ": 39101,
+ "ð٤Ŀ": 35242,
+ "ð٤ŀ": 29463,
+ "ð٤ŀ": 38597,
+ "ðŁ¤Ł": 48509,
+ "ðŁ¤ł": 36737,
+ "ð٤Ń": 47289,
+ "ðŁ¥": 4156,
+ "ðŁ¥°": 29246,
+ "ðŁ¥°": 17597,
+ "ðŁ¥³": 45823,
+ "ðŁ¥³": 28055,
+ "ðŁ¥º": 43380,
+ "ðŁ¥º": 36858,
+ "ðŁ¥Ĥ": 43805,
+ "ðŁ¥Ĥ": 25212,
+ "ðŁ¥ĥ": 47790,
+ "ðŁ¥ĩ": 34372,
+ "ðŁ¥ĩ": 20069,
+ "ðŁ¥Ī": 35858,
+ "ðŁ¥ī": 36782,
+ "ðŁ¥Ĭ": 29275,
+ "ð٦": 6040,
+ "ð٦ģ": 36367,
+ "ð٦ģ": 26056,
+ "ð٦ĥ": 40184,
+ "ð٦Ħ": 37659,
+ "ð٦ħ": 28800,
+ "ð٦Ī": 48984,
+ "ð٦ĭ": 49325,
+ "ð٦ĭ": 28985,
+ "ð٧": 8792,
+ "ðŁ§¡": 30996,
+ "ðŁ§¡": 24578,
+ "ð٧IJ": 33549,
+ "ðŁħ": 22010,
+ "ðŁĨ": 9536,
+ "ðŁĨķ": 34956,
+ "ðŁĨĺ": 39868,
+ "ðŁĨļ": 16325,
+ "ðŁĩ": 1173,
+ "ðŁĩ¦": 12469,
+ "ðŁĩ¦": 28565,
+ "ðŁĩ¦ðŁĩ": 33196,
+ "ðŁĩ¦ðŁĩ·": 41629,
+ "ðŁĩ¦ðŁĩº": 25192,
+ "ðŁĩ§": 14660,
+ "ðŁĩ§ðŁĩ": 37342,
+ "ðŁĩ§ðŁĩª": 38794,
+ "ðŁĩ§ðŁĩ·": 28182,
+ "ðŁĩ¨": 8889,
+ "ðŁĩ¨ðŁĩ": 8989,
+ "ðŁĩ¨ðŁĩ¦": 34324,
+ "ðŁĩ¨ðŁĩ¦": 16364,
+ "ðŁĩ¨ðŁĩ³": 36819,
+ "ðŁĩ¨ðŁĩŃ": 41119,
+ "ðŁĩ©": 15222,
+ "ðŁĩ©ðŁĩ": 36350,
+ "ðŁĩ©ðŁĩª": 21531,
+ "ðŁĩª": 11428,
+ "ðŁĩª": 12331,
+ "ðŁĩªðŁĩ": 13917,
+ "ðŁĩªðŁĩ¸": 22177,
+ "ðŁĩªðŁĩº": 34655,
+ "ðŁĩ«": 12977,
+ "ðŁĩ«ðŁĩ·": 39109,
+ "ðŁĩ«ðŁĩ·": 16223,
+ "ðŁĩ¬": 8129,
+ "ðŁĩ¬ðŁĩ": 8354,
+ "ðŁĩ¬ðŁĩ§": 23762,
+ "ðŁĩ¬ðŁĩ§": 11559,
+ "ðŁĩ®": 8268,
+ "ðŁĩ®ðŁĩ": 8347,
+ "ðŁĩ®ðŁĩª": 34148,
+ "ðŁĩ®ðŁĩ³": 47299,
+ "ðŁĩ®ðŁĩ³": 23602,
+ "ðŁĩ®ðŁĩ¹": 42034,
+ "ðŁĩ®ðŁĩ¹": 17070,
+ "ðŁĩ¯": 20090,
+ "ðŁĩ¯ðŁĩ": 22924,
+ "ðŁĩ¯ðŁĩµ": 26527,
+ "ðŁĩ°": 28232,
+ "ðŁĩ±": 29533,
+ "ðŁĩ±ðŁĩ": 40941,
+ "ðŁĩ²": 16411,
+ "ðŁĩ²ðŁĩ": 17562,
+ "ðŁĩ²ðŁĩ½": 32073,
+ "ðŁĩ³": 16645,
+ "ðŁĩ³ðŁĩ": 17747,
+ "ðŁĩ³ðŁĩ±": 36747,
+ "ðŁĩµ": 12127,
+ "ðŁĩµðŁĩ": 13608,
+ "ðŁĩµðŁĩ°": 37764,
+ "ðŁĩµðŁĩ¹": 42621,
+ "ðŁĩµðŁĩŃ": 42777,
+ "ðŁĩ·": 16026,
+ "ðŁĩ·": 9869,
+ "ðŁĩ·ðŁĩº": 37902,
+ "ðŁĩ¸": 19447,
+ "ðŁĩ¸ðŁĩ": 33325,
+ "ðŁĩ¸ðŁĩª": 39260,
+ "ðŁĩ¹": 21810,
+ "ðŁĩ¹ðŁĩ": 36250,
+ "ðŁĩº": 4054,
+ "ðŁĩº": 17467,
+ "ðŁĩºðŁĩ": 4131,
+ "ðŁĩºðŁĩ¸": 8907,
+ "ðŁĩºðŁĩ¸": 5688,
+ "ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸": 18739,
+ "ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸": 41411,
+ "ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸": 43357,
+ "ðŁĩ¿": 25520,
+ "ðŁĩ¿ðŁĩ¦": 36982,
+ "ðŁĩŃ": 30370,
+ "ðŁĮ": 1576,
+ "ðŁĮ±": 35318,
+ "ðŁĮ±": 20665,
+ "ðŁĮ²": 34071,
+ "ðŁĮ²": 28154,
+ "ðŁĮ³": 44265,
+ "ðŁĮ³": 28543,
+ "ðŁĮ´": 20643,
+ "ðŁĮ´": 15968,
+ "ðŁĮµ": 40871,
+ "ðŁĮ·": 32328,
+ "ðŁĮ·": 24259,
+ "ðŁĮ¸": 16314,
+ "ðŁĮ¸": 10980,
+ "ðŁĮ¸ðŁĮ¸": 46210,
+ "ðŁĮ¹": 14990,
+ "ðŁĮ¹": 10662,
+ "ðŁĮ¹ðŁĮ¹": 37933,
+ "ðŁĮº": 27608,
+ "ðŁĮº": 19829,
+ "ðŁĮ»": 27196,
+ "ðŁĮ»": 19772,
+ "ðŁĮ¼": 36484,
+ "ðŁĮ¼": 26312,
+ "ðŁĮ¾": 39796,
+ "ðŁĮ¿": 27736,
+ "ðŁĮ¿": 18588,
+ "ðŁĮĢ": 34348,
+ "ðŁĮħ": 27547,
+ "ðŁĮĪ": 23038,
+ "ðŁĮĪ": 13042,
+ "ðŁĮĬ": 20465,
+ "ðŁĮĬ": 14302,
+ "ðŁĮĮ": 43393,
+ "ðŁĮį": 34931,
+ "ðŁĮį": 18641,
+ "ðŁĮİ": 31125,
+ "ðŁĮİ": 16969,
+ "ðŁĮı": 31527,
+ "ðŁĮIJ": 33071,
+ "ðŁĮĻ": 42330,
+ "ðŁĮĻ": 23283,
+ "ðŁĮļ": 49004,
+ "ðŁĮļ": 27877,
+ "ðŁĮŀ": 21152,
+ "ðŁĮŀ": 12980,
+ "ðŁĮŁ": 13196,
+ "ðŁĮŁ": 8542,
+ "ðŁĮŁðŁĮŁ": 26014,
+ "ðŁį": 2011,
+ "ðŁį¦": 47375,
+ "ðŁį¦": 32032,
+ "ðŁį©": 38379,
+ "ðŁįª": 38958,
+ "ðŁį«": 47994,
+ "ðŁį«": 33401,
+ "ðŁį°": 43732,
+ "ðŁį°": 30051,
+ "ðŁį³": 37441,
+ "ðŁį´": 41531,
+ "ðŁį´": 25338,
+ "ðŁį·": 24445,
+ "ðŁį·": 18072,
+ "ðŁį¸": 43058,
+ "ðŁį¸": 31217,
+ "ðŁį¹": 35598,
+ "ðŁįº": 31081,
+ "ðŁįº": 21590,
+ "ðŁį»": 22793,
+ "ðŁį»": 13167,
+ "ðŁį¾": 27294,
+ "ðŁį¾": 21656,
+ "ðŁįĢ": 22865,
+ "ðŁįĢ": 15764,
+ "ðŁįģ": 29837,
+ "ðŁįģ": 23075,
+ "ðŁįĤ": 35015,
+ "ðŁįĤ": 25721,
+ "ðŁįĥ": 27157,
+ "ðŁįĥ": 20147,
+ "ðŁįĩ": 48697,
+ "ðŁįĬ": 35001,
+ "ðŁįĬ": 28036,
+ "ðŁįĭ": 39543,
+ "ðŁįĮ": 44987,
+ "ðŁįį": 48946,
+ "ðŁįİ": 32069,
+ "ðŁįij": 32889,
+ "ðŁįĴ": 33160,
+ "ðŁįĵ": 44739,
+ "ðŁįĵ": 33456,
+ "ðŁįĶ": 46415,
+ "ðŁįĶ": 36031,
+ "ðŁįķ": 31469,
+ "ðŁįķ": 23904,
+ "ðŁįŃ": 42100,
+ "ðŁİ": 1165,
+ "ðŁİ£": 43158,
+ "ðŁİ¤": 23490,
+ "ðŁİ¤": 15690,
+ "ðŁİ¥": 22186,
+ "ðŁİ¥:": 43640,
+ "ðŁİ¥": 13233,
+ "ðŁİ§": 31254,
+ "ðŁİ§": 14266,
+ "ðŁİ¨": 31953,
+ "ðŁİ¨": 13461,
+ "ðŁİ©": 37701,
+ "ðŁİ«": 30331,
+ "ðŁİ¬": 36020,
+ "ðŁİ¬": 18150,
+ "ðŁİ®": 29312,
+ "ðŁİ¯": 23114,
+ "ðŁİµ": 27435,
+ "ðŁİµ": 14946,
+ "ðŁİ¶": 11755,
+ "ðŁİ¶": 6011,
+ "ðŁİ¶ðŁİ¶": 36283,
+ "ðŁİ¸": 29135,
+ "ðŁİ¸": 22122,
+ "ðŁİ¹": 43493,
+ "ðŁİ¼": 34949,
+ "ðŁİ¼": 23757,
+ "ðŁİ¾": 41982,
+ "ðŁİ¾": 24222,
+ "ðŁİĢ": 34347,
+ "ðŁİĢ": 20151,
+ "ðŁİģ": 18368,
+ "ðŁİģ": 13462,
+ "ðŁİĤ": 13026,
+ "ðŁİĤ": 10392,
+ "ðŁİĤðŁİĤ": 39338,
+ "ðŁİĥ": 22622,
+ "ðŁİĥ": 16780,
+ "ðŁİĦ": 12942,
+ "ðŁİĦ": 11267,
+ "ðŁİħ": 17685,
+ "ðŁİħ": 24276,
+ "ðŁİĨ": 39222,
+ "ðŁİĪ": 16142,
+ "ðŁİĪ": 14448,
+ "ðŁİĪðŁİī": 48049,
+ "ðŁİī": 4310,
+ "ðŁİī:": 17310,
+ "ðŁİī": 3986,
+ "ðŁİīðŁİ": 11473,
+ "ðŁİīðŁİĪ": 40499,
+ "ðŁİīðŁİĪ": 34008,
+ "ðŁİīðŁİī": 25159,
+ "ðŁİīðŁİī": 13450,
+ "ðŁİīðŁİīðŁİī": 20828,
+ "ðŁİīðŁİĬ": 31662,
+ "ðŁİīðŁİĬ": 30781,
+ "ðŁİĬ": 22763,
+ "ðŁİĬ": 22425,
+ "ðŁİĬðŁİī": 48801,
+ "ðŁİĵ": 28916,
+ "ðŁİĵ": 18744,
+ "ðŁİĻ": 29001,
+ "ðŁİĻ": 29753,
+ "ðŁİĻï¸ı": 44205,
+ "ðŁİŁ": 19248,
+ "ðŁİŁ": 21107,
+ "ðŁİŁï¸ı": 30243,
+ "ðŁİŃ": 28856,
+ "ðŁı": 1109,
+ "ðŁı¡": 27318,
+ "ðŁı³ï¸ı": 26844,
+ "ðŁı³ï¸ıâĢį": 27093,
+ "ðŁı³ï¸ıâĢįðŁĮĪ": 32610,
+ "ðŁı´": 39690,
+ "ðŁı´": 19704,
+ "ðŁı»": 5042,
+ "ðŁı»": 3702,
+ "ðŁı»âĢį": 46250,
+ "ðŁı»âĢįâĻĢï¸ı": 48391,
+ "ðŁı»âĢįâĻĢï¸ı": 23595,
+ "ðŁı»âĢįâĻĤï¸ı": 30984,
+ "ðŁı¼": 6193,
+ "ðŁı¼": 4027,
+ "ðŁı¼âĢįâĻĢï¸ı": 28955,
+ "ðŁı½": 8514,
+ "ðŁı½": 6114,
+ "ðŁı½âĢįâĻĢï¸ı": 37036,
+ "ðŁı½âĢįâĻĤï¸ı": 43157,
+ "ðŁı¾": 10230,
+ "ðŁı¾": 7778,
+ "ðŁı¾âĢįâĻĤï¸ı": 47189,
+ "ðŁı¿": 29854,
+ "ðŁı¿": 21094,
+ "ðŁıĢ": 13708,
+ "ðŁıĢ": 8813,
+ "ðŁıĢðŁıĢ": 43169,
+ "ðŁıģ": 29423,
+ "ðŁıģ": 17473,
+ "ðŁıĥ": 16820,
+ "ðŁıĥ": 32751,
+ "ðŁıħ": 25500,
+ "ðŁıĨ": 9585,
+ "ðŁıĨ": 5596,
+ "ðŁıĨðŁıĨ": 18946,
+ "ðŁıĨðŁıĨ": 38269,
+ "ðŁıĨðŁıĨðŁıĨ": 44484,
+ "ðŁıĩ": 45789,
+ "ðŁıĩ": 40288,
+ "ðŁıĪ": 16144,
+ "ðŁıĪ": 10477,
+ "ðŁıī": 26020,
+ "ðŁıĬ": 33061,
+ "ðŁıĬ": 47830,
+ "ðŁıĮ": 41116,
+ "ðŁıı": 32460,
+ "ðŁıIJ": 46334,
+ "ðŁıIJ": 29433,
+ "ðŁıĴ": 37756,
+ "ðŁıŁ": 35914,
+ "ðŁıŁ": 26472,
+ "ðŁıŁï¸ı": 42627,
+ "ðŁıł": 33727,
+ "ðŁIJ": 2074,
+ "ðŁIJ¢": 37049,
+ "ðŁIJ£": 39597,
+ "ðŁIJ¥": 42981,
+ "ðŁIJ¦": 37260,
+ "ðŁIJ¬": 44238,
+ "ðŁIJ¯": 34825,
+ "ðŁIJ¯": 26111,
+ "ðŁIJ°": 35378,
+ "ðŁIJ°": 25050,
+ "ðŁIJ±": 35710,
+ "ðŁIJ±": 22979,
+ "ðŁIJ´": 33509,
+ "ðŁIJ¶": 14466,
+ "ðŁIJ¶": 10631,
+ "ðŁIJ·": 38408,
+ "ðŁIJ¸": 45597,
+ "ðŁIJ¸": 40298,
+ "ðŁIJº": 44281,
+ "ðŁIJº": 31445,
+ "ðŁIJ»": 30750,
+ "ðŁIJ»": 25322,
+ "ðŁIJ¼": 46234,
+ "ðŁIJ¾": 16057,
+ "ðŁIJ¾": 11317,
+ "ðŁIJ¾ðŁIJ¾": 42202,
+ "ðŁIJī": 46908,
+ "ðŁIJĬ": 43974,
+ "ðŁIJį": 48903,
+ "ðŁIJį": 30177,
+ "ðŁIJİ": 48281,
+ "ðŁIJİ": 32726,
+ "ðŁIJIJ": 47735,
+ "ðŁIJIJ": 27954,
+ "ðŁIJij": 49389,
+ "ðŁIJķ": 41069,
+ "ðŁIJĺ": 38733,
+ "ðŁIJĿ": 30619,
+ "ðŁIJĿ": 20111,
+ "ðŁIJŁ": 42084,
+ "ðŁIJŁ": 29989,
+ "ðŁIJł": 42725,
+ "ðŁij": 964,
+ "ðŁij£": 39755,
+ "ðŁij§": 48938,
+ "ðŁij¨": 18966,
+ "ðŁij¨âĢį": 25023,
+ "ðŁij©": 18800,
+ "ðŁij©âĢį": 26304,
+ "ðŁij«": 47106,
+ "ðŁij«": 35457,
+ "ðŁij®": 42686,
+ "ðŁij¯": 25910,
+ "ðŁij¯": 20582,
+ "ðŁij¶": 26187,
+ "ðŁij¶": 33189,
+ "ðŁij¸": 26268,
+ "ðŁij¸": 36645,
+ "ðŁij¹": 46766,
+ "ðŁij»": 24625,
+ "ðŁij»": 16243,
+ "ðŁij¼": 25270,
+ "ðŁij¼": 31083,
+ "ðŁij½": 42677,
+ "ðŁij½": 26257,
+ "ðŁijĢ": 11524,
+ "ðŁijĢ": 5908,
+ "ðŁijĢðŁijĢ": 31561,
+ "ðŁijģ": 47796,
+ "ðŁijģ": 45705,
+ "ðŁijĦ": 47445,
+ "ðŁijħ": 31833,
+ "ðŁijħ": 24672,
+ "ðŁijĨ": 42975,
+ "ðŁijĨ": 45194,
+ "ðŁijĩ": 7662,
+ "ðŁijĩ": 7475,
+ "ðŁijĩðŁı»": 45811,
+ "ðŁijĩðŁı»": 32813,
+ "ðŁijĩðŁı¼": 37504,
+ "ðŁijĩðŁijĩ": 17915,
+ "ðŁijĩðŁijĩ": 31891,
+ "ðŁijĩðŁijĩðŁijĩ": 35627,
+ "ðŁijĪ": 32794,
+ "ðŁijĪ": 20832,
+ "ðŁijī": 9477,
+ "ðŁijī": 3988,
+ "ðŁijīðŁı»": 23481,
+ "ðŁijīðŁı¼": 27534,
+ "ðŁijīðŁı½": 38059,
+ "ðŁijīðŁijī": 41480,
+ "ðŁijĬ": 8897,
+ "ðŁijĬ": 9704,
+ "ðŁijĬðŁı»": 47393,
+ "ðŁijĬðŁı»": 29152,
+ "ðŁijĬðŁı¼": 49000,
+ "ðŁijĬðŁı¼": 30115,
+ "ðŁijĬðŁijĬ": 46521,
+ "ðŁijĭ": 19351,
+ "ðŁijĭ": 17686,
+ "ðŁijĮ": 4890,
+ "ðŁijĮ": 4494,
+ "ðŁijĮðŁı»": 31818,
+ "ðŁijĮðŁı»": 18606,
+ "ðŁijĮðŁı¼": 37655,
+ "ðŁijĮðŁı¼": 20031,
+ "ðŁijĮðŁı½": 35834,
+ "ðŁijĮðŁijĮ": 36139,
+ "ðŁijĮðŁijĮ": 21435,
+ "ðŁijĮðŁijĮðŁijĮ": 40876,
+ "ðŁijį": 4686,
+ "ðŁijį": 4201,
+ "ðŁijįðŁı»": 25803,
+ "ðŁijįðŁı»": 15129,
+ "ðŁijįðŁı¼": 37285,
+ "ðŁijįðŁı¼": 19689,
+ "ðŁijįðŁı½": 43722,
+ "ðŁijįðŁijį": 33012,
+ "ðŁijįðŁijį": 18997,
+ "ðŁijįðŁijįðŁijį": 37284,
+ "ðŁijİ": 39702,
+ "ðŁijİ": 32568,
+ "ðŁijı": 3802,
+ "ðŁijı": 4829,
+ "ðŁijıðŁı»": 19236,
+ "ðŁijıðŁı»": 17029,
+ "ðŁijıðŁı»ðŁijıðŁı»": 35254,
+ "ðŁijıðŁı¼": 24496,
+ "ðŁijıðŁı¼": 19979,
+ "ðŁijıðŁı¼ðŁijıðŁı¼": 46712,
+ "ðŁijıðŁı½": 40796,
+ "ðŁijıðŁı½": 33978,
+ "ðŁijıðŁı¾": 45450,
+ "ðŁijıðŁijı": 10356,
+ "ðŁijıðŁijı": 16706,
+ "ðŁijıðŁijıðŁijı": 17254,
+ "ðŁijIJ": 40877,
+ "ðŁijij": 14955,
+ "ðŁijij": 8717,
+ "ðŁijijðŁijij": 48532,
+ "ðŁijķ": 47865,
+ "ðŁijŁ": 41183,
+ "ðŁijł": 41264,
+ "ðŁijŃ": 34175,
+ "ðŁijŃ": 27943,
+ "ðŁĴ": 837,
+ "ðŁĴ¡": 24081,
+ "ðŁĴ£": 36862,
+ "ðŁĴ£": 29006,
+ "ðŁĴ¤": 34706,
+ "ðŁĴ¤": 25632,
+ "ðŁĴ¥": 12209,
+ "ðŁĴ¥": 7347,
+ "ðŁĴ¥ðŁĴ¥": 27396,
+ "ðŁĴ¥ðŁĴ¥": 39246,
+ "ðŁĴ¥ðŁĴ¥ðŁĴ¥": 48890,
+ "ðŁĴ¦": 21180,
+ "ðŁĴ¦": 14060,
+ "ðŁĴ¦ðŁĴ¦": 44469,
+ "ðŁĴ§": 34095,
+ "ðŁĴ¨": 27408,
+ "ðŁĴ¨": 17891,
+ "ðŁĴ©": 48621,
+ "ðŁĴ©": 28847,
+ "ðŁĴª": 5475,
+ "ðŁĴª": 6440,
+ "ðŁĴªðŁı»": 31669,
+ "ðŁĴªðŁı»": 21903,
+ "ðŁĴªðŁı¼": 32041,
+ "ðŁĴªðŁı¼": 20759,
+ "ðŁĴªðŁı½": 46380,
+ "ðŁĴªðŁı½": 31111,
+ "ðŁĴªðŁı¾": 39398,
+ "ðŁĴªðŁĴª": 24747,
+ "ðŁĴªðŁĴªðŁĴª": 39913,
+ "ðŁĴ«": 25770,
+ "ðŁĴ«": 12526,
+ "ðŁĴ¬": 30947,
+ "ðŁĴ¯": 10611,
+ "ðŁĴ¯": 7018,
+ "ðŁĴ¯ðŁĴ¯": 30234,
+ "ðŁĴ¯ðŁĴ¯": 44070,
+ "ðŁĴ°": 20454,
+ "ðŁĴ°": 14078,
+ "ðŁĴ°ðŁĴ°": 41747,
+ "ðŁĴµ": 47412,
+ "ðŁĴµ": 38041,
+ "ðŁĴ¸": 37696,
+ "ðŁĴ¸": 25957,
+ "ðŁĴ»": 33433,
+ "ðŁĴ»": 18135,
+ "ðŁĴ¿": 39541,
+ "ðŁĴĢ": 14888,
+ "ðŁĴĢ": 12158,
+ "ðŁĴĢðŁĴĢ": 30884,
+ "ðŁĴģ": 13997,
+ "ðŁĴģ": 14392,
+ "ðŁĴĥ": 9947,
+ "ðŁĴĥ": 14333,
+ "ðŁĴĥðŁı»": 38624,
+ "ðŁĴĥðŁĴĥ": 28041,
+ "ðŁĴĦ": 46116,
+ "ðŁĴĦ": 34571,
+ "ðŁĴħ": 27457,
+ "ðŁĴħ": 32414,
+ "ðŁĴī": 44316,
+ "ðŁĴī": 30503,
+ "ðŁĴĭ": 12217,
+ "ðŁĴĭ": 7417,
+ "ðŁĴĭðŁĴĭ": 29214,
+ "ðŁĴĮ": 40817,
+ "ðŁĴį": 35850,
+ "ðŁĴį": 24898,
+ "ðŁĴİ": 25938,
+ "ðŁĴİ": 15874,
+ "ðŁĴIJ": 27375,
+ "ðŁĴIJ": 20554,
+ "ðŁĴij": 49404,
+ "ðŁĴĵ": 20628,
+ "ðŁĴĵ": 12568,
+ "ðŁĴĵðŁĴĵ": 43505,
+ "ðŁĴĶ": 18880,
+ "ðŁĴĶ": 10704,
+ "ðŁĴĶðŁĴĶ": 44673,
+ "ðŁĴķ": 5412,
+ "ðŁĴķ": 3082,
+ "ðŁĴķðŁĴķ": 23106,
+ "ðŁĴķðŁĴķ": 14117,
+ "ðŁĴķðŁĴķðŁĴķ": 26772,
+ "ðŁĴĸ": 8466,
+ "ðŁĴĸ": 5582,
+ "ðŁĴĸðŁĴĸ": 19562,
+ "ðŁĴĸðŁĴĸ": 30595,
+ "ðŁĴĸðŁĴĸðŁĴĸ": 33915,
+ "ðŁĴĹ": 10148,
+ "ðŁĴĹ": 6690,
+ "ðŁĴĹðŁĴĹ": 47158,
+ "ðŁĴĹðŁĴĹ": 24064,
+ "ðŁĴĹðŁĴĹðŁĴĹ": 36990,
+ "ðŁĴĺ": 18223,
+ "ðŁĴĺ": 10816,
+ "ðŁĴĺðŁĴĺ": 40464,
+ "ðŁĴĻ": 5305,
+ "ðŁĴĻ": 4074,
+ "ðŁĴĻðŁĴĻ": 17833,
+ "ðŁĴĻðŁĴĻ": 27101,
+ "ðŁĴĻðŁĴĻðŁĴĻ": 30698,
+ "ðŁĴĻðŁĴĽ": 46804,
+ "ðŁĴĻðŁĴĽ": 26230,
+ "ðŁĴĻðŁĴľ": 47931,
+ "ðŁĴĻðŁĴľ": 42541,
+ "ðŁĴļ": 8102,
+ "ðŁĴļ": 6521,
+ "ðŁĴļðŁĴļ": 27497,
+ "ðŁĴļðŁĴļ": 46209,
+ "ðŁĴļðŁĴļðŁĴļ": 46182,
+ "ðŁĴļðŁĴĽ": 41232,
+ "ðŁĴĽ": 8221,
+ "ðŁĴĽ": 6233,
+ "ðŁĴĽðŁĴĻ": 36337,
+ "ðŁĴĽðŁĴļ": 37994,
+ "ðŁĴĽðŁĴĽ": 32420,
+ "ðŁĴľ": 6832,
+ "ðŁĴľ": 4882,
+ "ðŁĴľðŁĴľ": 17280,
+ "ðŁĴľðŁĴľ": 28211,
+ "ðŁĴľðŁĴľðŁĴľ": 31004,
+ "ðŁĴĿ": 36761,
+ "ðŁĴĿ": 22002,
+ "ðŁĴŀ": 14862,
+ "ðŁĴŀ": 8988,
+ "ðŁĴŀðŁĴŀ": 36448,
+ "ðŁĴŁ": 49394,
+ "ðŁĴŁ": 28828,
+ "ðŁĴŃ": 33848,
+ "ðŁĵ": 1497,
+ "ðŁĵ¢": 46560,
+ "ðŁĵ¢": 20901,
+ "ðŁĵ£": 48841,
+ "ðŁĵ£": 21282,
+ "ðŁĵ°:": 28952,
+ "ðŁĵ°": 14985,
+ "ðŁĵ±": 36104,
+ "ðŁĵ±": 20824,
+ "ðŁĵ²": 19363,
+ "ðŁĵ·": 6966,
+ "ðŁĵ·:": 8294,
+ "ðŁĵ·": 5551,
+ "ðŁĵ·@": 40032,
+ "ðŁĵ¸": 8401,
+ "ðŁĵ¸:": 10379,
+ "ðŁĵ¸": 6074,
+ "ðŁĵ¸@": 39660,
+ "ðŁĵ¹": 49251,
+ "ðŁĵº": 21792,
+ "ðŁĵº:": 29728,
+ "ðŁĵº": 10450,
+ "ðŁĵ»": 32711,
+ "ðŁĵ»": 15882,
+ "ðŁĵ½": 45361,
+ "ðŁĵħ": 21277,
+ "ðŁĵĨ": 23471,
+ "ðŁĵĪ": 23359,
+ "ðŁĵĬ": 22244,
+ "ðŁĵĭ": 46351,
+ "ðŁĵĮ": 22289,
+ "ðŁĵį": 25043,
+ "ðŁĵį:": 36845,
+ "ðŁĵį": 8903,
+ "ðŁĵĸ": 49003,
+ "ðŁĵĸ": 23043,
+ "ðŁĵļ": 25433,
+ "ðŁĵļ": 15566,
+ "ðŁĵĿ": 31888,
+ "ðŁĵĿ:": 48398,
+ "ðŁĵĿ": 15853,
+ "ðŁĵŀ": 24022,
+ "ðŁĶ": 1428,
+ "ðŁĶ¥": 3191,
+ "ðŁĶ¥#": 44354,
+ "ðŁĶ¥": 3016,
+ "ðŁĶ¥ðŁĶ¥": 5692,
+ "ðŁĶ¥ðŁĶ¥": 11771,
+ "ðŁĶ¥ðŁĶ¥ðŁĶ¥": 11004,
+ "ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥": 23408,
+ "ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥": 30989,
+ "ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥": 48401,
+ "ðŁĶ¥ðŁĶĹ": 35130,
+ "ðŁĶª": 47078,
+ "ðŁĶª": 34545,
+ "ðŁĶ«": 38116,
+ "ðŁĶ«": 20583,
+ "ðŁĶ¬": 44227,
+ "ðŁĶ®": 38077,
+ "ðŁĶ´": 12408,
+ "ðŁĶ´": 10854,
+ "ðŁĶ´âļªï¸ı": 46879,
+ "ðŁĶ´âļªï¸ı": 40055,
+ "ðŁĶµ": 17531,
+ "ðŁĶµ": 17193,
+ "ðŁĶµâļªï¸ı": 42412,
+ "ðŁĶ¶": 42880,
+ "ðŁĶ¶": 36222,
+ "ðŁĶ·": 37740,
+ "ðŁĶ¸": 24200,
+ "ðŁĶ¹": 19995,
+ "ðŁĶº": 45561,
+ "ðŁĶģ": 41299,
+ "ðŁĶĬ": 32580,
+ "ðŁĶĬ": 20502,
+ "ðŁĶİ": 44935,
+ "ðŁĶij": 35127,
+ "ðŁĶĴ": 44972,
+ "ðŁĶĶ": 45753,
+ "ðŁĶĹ": 47475,
+ "ðŁĶĹ": 14561,
+ "ðŁĶĺ": 38995,
+ "ðŁĶľ": 36011,
+ "ðŁĶĿ": 44387,
+ "ðŁĶĿ": 29506,
+ "ðŁķ": 7692,
+ "ðŁķº": 33958,
+ "ðŁķĬ": 42624,
+ "ðŁķĬ": 37760,
+ "ðŁĸ": 6269,
+ "ðŁĸ¤": 17603,
+ "ðŁĸ¤": 10860,
+ "ðŁĸ¥": 47990,
+ "ðŁĹ": 7045,
+ "ðŁĹ£": 33232,
+ "ðŁĹ£": 18583,
+ "ðŁĹ£ï¸ı": 37476,
+ "ðŁĹĵ": 34335,
+ "ðŁĹĵ": 28773,
+ "ðŁĹĵï¸ı": 39847,
+ "ðŁĺ": 668,
+ "ðŁĺ¡": 21968,
+ "ðŁĺ¡": 17452,
+ "ðŁĺ¡ðŁĺ¡": 37223,
+ "ðŁĺ¢": 14308,
+ "ðŁĺ¢": 9925,
+ "ðŁĺ¢ðŁĺ¢": 32923,
+ "ðŁĺ¢ðŁĺ¢": 47921,
+ "ðŁĺ£": 32718,
+ "ðŁĺ¤": 26872,
+ "ðŁĺ¤": 20740,
+ "ðŁĺ¥": 38383,
+ "ðŁĺ¥": 23951,
+ "ðŁĺ¨": 38080,
+ "ðŁĺ©": 9051,
+ "ðŁĺ©": 9494,
+ "ðŁĺ©ðŁĺ©": 22820,
+ "ðŁĺ©ðŁĺ©": 38031,
+ "ðŁĺ©ðŁĺ©ðŁĺ©": 49063,
+ "ðŁĺª": 38181,
+ "ðŁĺª": 22243,
+ "ðŁĺ«": 25141,
+ "ðŁĺ«": 22340,
+ "ðŁĺ¬": 23704,
+ "ðŁĺ¬": 14549,
+ "ðŁĺ®": 40163,
+ "ðŁĺ®": 21616,
+ "ðŁĺ¯": 37858,
+ "ðŁĺ°": 34728,
+ "ðŁĺ±": 10938,
+ "ðŁĺ±": 9055,
+ "ðŁĺ±ðŁĺ±": 22061,
+ "ðŁĺ±ðŁĺ±": 40767,
+ "ðŁĺ±ðŁĺ±ðŁĺ±": 40909,
+ "ðŁĺ²": 40460,
+ "ðŁĺ²": 24620,
+ "ðŁĺ³": 12047,
+ "ðŁĺ³": 8223,
+ "ðŁĺ³ðŁĺ³": 32592,
+ "ðŁĺ´": 23527,
+ "ðŁĺ´": 16415,
+ "ðŁĺ´ðŁĺ´": 49307,
+ "ðŁĺµ": 39368,
+ "ðŁĺ¶": 35207,
+ "ðŁĺ·": 37943,
+ "ðŁĺ·": 25759,
+ "ðŁĺ¸": 36912,
+ "ðŁĺ¹": 26477,
+ "ðŁĺ¹": 26573,
+ "ðŁĺ¹ðŁĺ¹": 46287,
+ "ðŁĺº": 40613,
+ "ðŁĺ»": 15453,
+ "ðŁĺ»": 12911,
+ "ðŁĺ»ðŁĺ»": 34414,
+ "ðŁĺ¼": 44245,
+ "ðŁĺ½": 45156,
+ "ðŁĺĢ": 12832,
+ "ðŁĺĢ": 7334,
+ "ðŁĺĢðŁĺĢ": 34503,
+ "ðŁĺģ": 6967,
+ "ðŁĺģ": 4821,
+ "ðŁĺģðŁĺģ": 37900,
+ "ðŁĺģðŁĺģ": 19213,
+ "ðŁĺģðŁĺģðŁĺģ": 29083,
+ "ðŁĺĤ": 1424,
+ "ðŁĺĤ)": 42643,
+ "ðŁĺĤ.": 42550,
+ "ðŁĺĤ": 1558,
+ "ðŁĺĤâĿ¤ï¸ı": 36412,
+ "ðŁĺĤðŁijĮ": 42000,
+ "ðŁĺĤðŁĺĤ": 2286,
+ "ðŁĺĤðŁĺĤ": 4112,
+ "ðŁĺĤðŁĺĤðŁĺĤ": 22233,
+ "ðŁĺĤðŁĺĤðŁĺĤ": 4887,
+ "ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ": 9936,
+ "ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ": 11522,
+ "ðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤ": 19295,
+ "ðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤ": 33415,
+ "ðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤ": 48973,
+ "ðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤ": 28504,
+ "ðŁĺĤðŁĺį": 43128,
+ "ðŁĺĤðŁĺŃ": 28965,
+ "ðŁĺĤðŁĺŃ": 25802,
+ "ðŁĺĥ": 14079,
+ "ðŁĺĥ": 8520,
+ "ðŁĺĥðŁĺĥ": 38358,
+ "ðŁĺĦ": 12141,
+ "ðŁĺĦ": 7624,
+ "ðŁĺĦðŁĺĦ": 32312,
+ "ðŁĺħ": 15245,
+ "ðŁĺħ": 9188,
+ "ðŁĺħðŁĺħ": 39078,
+ "ðŁĺĨ": 16541,
+ "ðŁĺĨ": 10943,
+ "ðŁĺĨðŁĺĨ": 39503,
+ "ðŁĺĩ": 21694,
+ "ðŁĺĩ": 13091,
+ "ðŁĺĪ": 14377,
+ "ðŁĺĪ": 9756,
+ "ðŁĺĪðŁĺĪ": 44473,
+ "ðŁĺī": 9740,
+ "ðŁĺī": 4955,
+ "ðŁĺīðŁĺī": 40430,
+ "ðŁĺĬ": 4692,
+ "ðŁĺĬ": 3020,
+ "ðŁĺĬâĿ¤ï¸ı": 43606,
+ "ðŁĺĬðŁĺĬ": 12838,
+ "ðŁĺĬðŁĺĬ": 20842,
+ "ðŁĺĬðŁĺĬðŁĺĬ": 28685,
+ "ðŁĺĬðŁĺĬðŁĺĬðŁĺĬ": 35519,
+ "ðŁĺĭ": 12391,
+ "ðŁĺĭ": 7203,
+ "ðŁĺĭðŁĺĭ": 33304,
+ "ðŁĺĮ": 19221,
+ "ðŁĺĮ": 12163,
+ "ðŁĺį": 1796,
+ "ðŁĺį#": 42357,
+ "ðŁĺį.": 48579,
+ "ðŁĺį": 1754,
+ "ðŁĺįâĿ¤": 29122,
+ "ðŁĺįâĿ¤ï¸ı": 21945,
+ "ðŁĺįðŁijĮ": 41005,
+ "ðŁĺįðŁĴķ": 35946,
+ "ðŁĺįðŁĶ¥": 46648,
+ "ðŁĺįðŁĺĤ": 48715,
+ "ðŁĺįðŁĺį": 3663,
+ "ðŁĺįðŁĺį": 6471,
+ "ðŁĺįðŁĺįðŁĺį": 30614,
+ "ðŁĺįðŁĺįðŁĺį": 7703,
+ "ðŁĺįðŁĺįðŁĺįðŁĺį": 16603,
+ "ðŁĺįðŁĺįðŁĺįðŁĺį": 18925,
+ "ðŁĺįðŁĺįðŁĺįðŁĺįðŁĺį": 32078,
+ "ðŁĺįðŁĺįðŁĺįðŁĺįðŁĺįðŁĺįðŁĺįðŁĺį": 48683,
+ "ðŁĺįðŁĺĺ": 29646,
+ "ðŁĺįðŁĺĺ": 19849,
+ "ðŁĺįðŁĺŃ": 39555,
+ "ðŁĺİ": 7426,
+ "ðŁĺİ": 4345,
+ "ðŁĺİðŁĺİ": 24048,
+ "ðŁĺİðŁĺİðŁĺİ": 39742,
+ "ðŁĺı": 11624,
+ "ðŁĺı": 6909,
+ "ðŁĺıðŁĺı": 38151,
+ "ðŁĺIJ": 38586,
+ "ðŁĺIJ": 19618,
+ "ðŁĺij": 32469,
+ "ðŁĺij": 18937,
+ "ðŁĺĴ": 20792,
+ "ðŁĺĴ": 11702,
+ "ðŁĺĵ": 28733,
+ "ðŁĺĶ": 19532,
+ "ðŁĺĶ": 11432,
+ "ðŁĺķ": 45741,
+ "ðŁĺķ": 20602,
+ "ðŁĺĸ": 35006,
+ "ðŁĺĺ": 4240,
+ "ðŁĺĺ": 3352,
+ "ðŁĺĺâĿ¤": 48409,
+ "ðŁĺĺâĿ¤ï¸ı": 39150,
+ "ðŁĺĺðŁĺį": 38176,
+ "ðŁĺĺðŁĺĺ": 15663,
+ "ðŁĺĺðŁĺĺ": 10507,
+ "ðŁĺĺðŁĺĺðŁĺĺ": 20208,
+ "ðŁĺĺðŁĺĺðŁĺĺðŁĺĺ": 44892,
+ "ðŁĺĻ": 36201,
+ "ðŁĺĻ": 29209,
+ "ðŁĺļ": 24897,
+ "ðŁĺļ": 19102,
+ "ðŁĺĽ": 24550,
+ "ðŁĺĽ": 15745,
+ "ðŁĺľ": 13226,
+ "ðŁĺľ": 7830,
+ "ðŁĺľðŁĺľ": 43065,
+ "ðŁĺĿ": 20064,
+ "ðŁĺĿ": 12970,
+ "ðŁĺŀ": 40458,
+ "ðŁĺŀ": 21103,
+ "ðŁĺŁ": 46947,
+ "ðŁĺł": 34094,
+ "ðŁĺŃ": 2962,
+ "ðŁĺŃ": 3915,
+ "ðŁĺŃâĿ¤ï¸ı": 29567,
+ "ðŁĺŃðŁĴķ": 46306,
+ "ðŁĺŃðŁĺĤ": 38505,
+ "ðŁĺŃðŁĺį": 36893,
+ "ðŁĺŃðŁĺŃ": 5300,
+ "ðŁĺŃðŁĺŃ": 11834,
+ "ðŁĺŃðŁĺŃðŁĺŃ": 44089,
+ "ðŁĺŃðŁĺŃðŁĺŃ": 13116,
+ "ðŁĺŃðŁĺŃðŁĺŃðŁĺŃ": 19793,
+ "ðŁĺŃðŁĺŃðŁĺŃðŁĺŃ": 27322,
+ "ðŁĺŃðŁĺŃðŁĺŃðŁĺŃðŁĺŃ": 43366,
+ "ðŁĻ": 1478,
+ "ðŁĻĢ": 43092,
+ "ðŁĻĤ": 32006,
+ "ðŁĻĤ": 14860,
+ "ðŁĻĥ": 27222,
+ "ðŁĻĥ": 15652,
+ "ðŁĻĦ": 20648,
+ "ðŁĻĦ": 13049,
+ "ðŁĻħ": 42702,
+ "ðŁĻĨ": 30050,
+ "ðŁĻĨ": 35730,
+ "ðŁĻĪ": 12661,
+ "ðŁĻĪ": 9516,
+ "ðŁĻĪðŁĻĪ": 41796,
+ "ðŁĻĬ": 23684,
+ "ðŁĻĬ": 16636,
+ "ðŁĻĭ": 19193,
+ "ðŁĻĭ": 30274,
+ "ðŁĻĮ": 4366,
+ "ðŁĻĮ": 4855,
+ "ðŁĻĮðŁı»": 26756,
+ "ðŁĻĮðŁı»": 15799,
+ "ðŁĻĮðŁı¼": 26584,
+ "ðŁĻĮðŁı¼": 15364,
+ "ðŁĻĮðŁı½": 36660,
+ "ðŁĻĮðŁı½": 22962,
+ "ðŁĻĮðŁı¾": 38023,
+ "ðŁĻĮðŁı¾": 26466,
+ "ðŁĻĮðŁĻĮ": 21202,
+ "ðŁĻĮðŁĻĮ": 30430,
+ "ðŁĻĮðŁĻĮðŁĻĮ": 37127,
+ "ðŁĻı": 4260,
+ "ðŁĻı": 5503,
+ "ðŁĻıðŁı»": 25100,
+ "ðŁĻıðŁı»": 16650,
+ "ðŁĻıðŁı¼": 31163,
+ "ðŁĻıðŁı¼": 18952,
+ "ðŁĻıðŁı½": 34103,
+ "ðŁĻıðŁı½": 21540,
+ "ðŁĻıðŁı¾": 34277,
+ "ðŁĻıðŁı¾": 21979,
+ "ðŁĻıðŁĻı": 18227,
+ "ðŁĻıðŁĻı": 26510,
+ "ðŁĻıðŁĻıðŁĻı": 31702,
+ "ðŁļ": 2730,
+ "ðŁļ¨": 12198,
+ "ðŁļ¨": 6056,
+ "ðŁļ¨ðŁļ¨": 36487,
+ "ðŁļ¨ðŁļ¨": 21440,
+ "ðŁļ¨ðŁļ¨ðŁļ¨": 41515,
+ "ðŁļ©": 44514,
+ "ðŁļ«": 35291,
+ "ðŁļ²": 37085,
+ "ðŁļ´": 30825,
+ "ðŁļ¶": 46060,
+ "ðŁļĢ": 22400,
+ "ðŁļĢ": 13542,
+ "ðŁļĢðŁļĢ": 49033,
+ "ðŁļĤ": 38949,
+ "ðŁļĮ": 46891,
+ "ðŁļĹ": 33054,
+ "ðŁļĹ": 22783,
+ "ðŁļĺ": 35825,
+ "ðŁļĻ": 48487,
+ "ðŁĽ": 11306,
+ "ñ": 173,
+ "ñ": 429,
+ "ò": 174,
+ "ò": 430,
+ "ó": 175,
+ "ó": 431,
+ "ô": 176,
+ "ô": 432,
+ "õ": 177,
+ "õ": 433,
+ "ö": 178,
+ "ö": 434,
+ "÷": 179,
+ "÷": 435,
+ "ø": 180,
+ "ø": 436,
+ "ù": 181,
+ "ù": 437,
+ "ú": 182,
+ "ú": 438,
+ "û": 183,
+ "û": 439,
+ "ü": 184,
+ "ü": 440,
+ "ý": 185,
+ "ý": 441,
+ "þ": 186,
+ "þ": 442,
+ "ÿ": 187,
+ "ÿ": 443,
+ "Ā": 188,
+ "Ā": 444,
+ "ā": 189,
+ "ā": 445,
+ "Ă": 190,
+ "Ă": 446,
+ "ă": 191,
+ "ă": 447,
+ "Ą": 192,
+ "Ą": 448,
+ "ą": 193,
+ "ą": 449,
+ "Ć": 194,
+ "Ć": 450,
+ "ć": 195,
+ "ć": 451,
+ "Ĉ": 196,
+ "Ĉ": 452,
+ "ĉ": 197,
+ "ĉ": 453,
+ "Ċ": 198,
+ "Ċ": 454,
+ "ċ": 199,
+ "ċ": 455,
+ "Č": 200,
+ "Č": 456,
+ "č": 201,
+ "č": 457,
+ "Ď": 202,
+ "Ď": 458,
+ "ď": 203,
+ "ď": 459,
+ "Đ": 204,
+ "Đ": 460,
+ "đ": 205,
+ "đ": 461,
+ "Ē": 206,
+ "Ē": 462,
+ "ē": 207,
+ "ē": 463,
+ "Ĕ": 208,
+ "Ĕ": 464,
+ "ĕ": 209,
+ "ĕ": 465,
+ "Ė": 210,
+ "Ė": 466,
+ "ė": 211,
+ "ė": 467,
+ "Ę": 212,
+ "Ę": 468,
+ "ę": 213,
+ "ę": 469,
+ "Ě": 214,
+ "Ě": 470,
+ "ě": 215,
+ "ě": 471,
+ "Ĝ": 216,
+ "Ĝ": 472,
+ "ĝ": 217,
+ "ĝ": 473,
+ "Ğ": 218,
+ "Ğ": 474,
+ "ğ": 219,
+ "ğ": 475,
+ "Ġ": 220,
+ "Ġ": 476,
+ "ġ": 221,
+ "ġ": 477,
+ "Ģ": 222,
+ "Ģ": 478,
+ "Ģï¸ı": 9668,
+ "Ģï¸ı": 5511,
+ "ģ": 223,
+ "ģ": 479,
+ "ģà¸": 15016,
+ "Ĥ": 224,
+ "Ĥ": 480,
+ "Ĥâĸ": 29036,
+ "ĤâĸĤâĸ": 30832,
+ "ĥ": 225,
+ "ĥ": 481,
+ "Ħ": 226,
+ "Ħ": 482,
+ "Ħà¸": 20537,
+ "Ħë": 34462,
+ "Ħëĭ": 25170,
+ "ħ": 227,
+ "ħ": 483,
+ "ħï¸ı": 33950,
+ "Ĩ": 228,
+ "Ĩ": 484,
+ "ĩ": 229,
+ "ĩ": 485,
+ "Ī": 230,
+ "Ī": 486,
+ "ī": 231,
+ "ī": 487,
+ "īï¸ı": 37463,
+ "Ĭ": 232,
+ "Ĭ": 488,
+ "Ĭãģ": 30294,
+ "ĭ": 233,
+ "ĭ": 489,
+ "ĭãģ": 36218,
+ "ĭãĤ": 45737,
+ "Į": 234,
+ "Į": 490,
+ "ĮãĤĬãģ": 45969,
+ "ĮãĤĬãģŁãģĦ": 47021,
+ "Įë": 17003,
+ "į": 235,
+ "į": 491,
+ "İ": 236,
+ "İ": 492,
+ "ı": 237,
+ "ı": 493,
+ "IJ": 238,
+ "IJ": 494,
+ "ij": 239,
+ "ij": 495,
+ "Ĵ": 240,
+ "Ĵ": 496,
+ "ĵ": 241,
+ "ĵ": 497,
+ "Ķ": 242,
+ "Ķ": 498,
+ "Ķë": 37978,
+ "Ķï¸ı": 24395,
+ "Ķï¸ı": 7443,
+ "ķ": 243,
+ "ķ": 499,
+ "ķãĤ": 26609,
+ "ķï¸ı": 44853,
+ "ĸ": 244,
+ "ĸ": 500,
+ "ĸï¸ı": 28877,
+ "Ĺ": 245,
+ "Ĺ": 501,
+ "ĺ": 246,
+ "ĺ": 502,
+ "Ļ": 247,
+ "Ļ": 503,
+ "ļ": 248,
+ "ļ": 504,
+ "Ľ": 249,
+ "Ľ": 505,
+ "ľ": 250,
+ "ľ": 506,
+ "ľë": 39810,
+ "Ŀ": 251,
+ "Ŀ": 507,
+ "ŀ": 252,
+ "ŀ": 508,
+ "Ł": 253,
+ "Ł": 509,
+ "ŁãģĦ": 46023,
+ "ł": 254,
+ "ł": 510,
+ "łï¸ı": 27899,
+ "łï¸ı": 12715,
+ "łĪ": 43364,
+ "Ń": 255,
+ "Ń": 511
+}
diff --git a/ SDPose-Wholebody/unet/config.json b/ SDPose-Wholebody/unet/config.json
new file mode 100644
index 0000000000000000000000000000000000000000..466532dc49c3a8bc2fe21ed4e640ca124278b00b
--- /dev/null
+++ b/ SDPose-Wholebody/unet/config.json
@@ -0,0 +1,73 @@
+{
+ "_class_name": "UNet2DConditionModel",
+ "_diffusers_version": "0.28.0",
+ "_name_or_path": "/data/coding/model",
+ "act_fn": "silu",
+ "addition_embed_type": null,
+ "addition_embed_type_num_heads": 64,
+ "addition_time_embed_dim": null,
+ "attention_head_dim": [
+ 5,
+ 10,
+ 20,
+ 20
+ ],
+ "attention_type": "default",
+ "block_out_channels": [
+ 320,
+ 640,
+ 1280,
+ 1280
+ ],
+ "center_input_sample": false,
+ "class_embed_type": "projection",
+ "class_embeddings_concat": false,
+ "conv_in_kernel": 3,
+ "conv_out_kernel": 3,
+ "cross_attention_dim": 1024,
+ "cross_attention_norm": null,
+ "down_block_types": [
+ "CrossAttnDownBlock2D",
+ "CrossAttnDownBlock2D",
+ "CrossAttnDownBlock2D",
+ "DownBlock2D"
+ ],
+ "downsample_padding": 1,
+ "dropout": 0.0,
+ "dual_cross_attention": false,
+ "encoder_hid_dim": null,
+ "encoder_hid_dim_type": null,
+ "flip_sin_to_cos": true,
+ "freq_shift": 0,
+ "in_channels": 4,
+ "layers_per_block": 2,
+ "mid_block_only_cross_attention": null,
+ "mid_block_scale_factor": 1,
+ "mid_block_type": "UNetMidBlock2DCrossAttn",
+ "norm_eps": 1e-05,
+ "norm_num_groups": 32,
+ "num_attention_heads": null,
+ "num_class_embeds": null,
+ "only_cross_attention": false,
+ "out_channels": 4,
+ "projection_class_embeddings_input_dim": 4,
+ "resnet_out_scale_factor": 1.0,
+ "resnet_skip_time_act": false,
+ "resnet_time_scale_shift": "default",
+ "reverse_transformer_layers_per_block": null,
+ "sample_size": 96,
+ "time_cond_proj_dim": null,
+ "time_embedding_act_fn": null,
+ "time_embedding_dim": null,
+ "time_embedding_type": "positional",
+ "timestep_post_act": null,
+ "transformer_layers_per_block": 1,
+ "up_block_types": [
+ "UpBlock2D",
+ "CrossAttnUpBlock2D",
+ "CrossAttnUpBlock2D",
+ "CrossAttnUpBlock2D"
+ ],
+ "upcast_attention": false,
+ "use_linear_projection": true
+}
diff --git a/ SDPose-Wholebody/unet/diffusion_pytorch_model.safetensors b/ SDPose-Wholebody/unet/diffusion_pytorch_model.safetensors
new file mode 100644
index 0000000000000000000000000000000000000000..2cf27cc26d3f9d4ee52b68b7c3d795290552bd03
--- /dev/null
+++ b/ SDPose-Wholebody/unet/diffusion_pytorch_model.safetensors
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e951ac1802f004243bbbea6f0d86abfa08360776424f2d228c62ed63c5b1ab66
+size 3470311272
diff --git a/ SDPose-Wholebody/vae/config.json b/ SDPose-Wholebody/vae/config.json
new file mode 100644
index 0000000000000000000000000000000000000000..f97af6a6a8235236b1346312f328569ce2d70f81
--- /dev/null
+++ b/ SDPose-Wholebody/vae/config.json
@@ -0,0 +1,30 @@
+{
+ "_class_name": "AutoencoderKL",
+ "_diffusers_version": "0.8.0",
+ "_name_or_path": "hf-models/stable-diffusion-v2-768x768/vae",
+ "act_fn": "silu",
+ "block_out_channels": [
+ 128,
+ 256,
+ 512,
+ 512
+ ],
+ "down_block_types": [
+ "DownEncoderBlock2D",
+ "DownEncoderBlock2D",
+ "DownEncoderBlock2D",
+ "DownEncoderBlock2D"
+ ],
+ "in_channels": 3,
+ "latent_channels": 4,
+ "layers_per_block": 2,
+ "norm_num_groups": 32,
+ "out_channels": 3,
+ "sample_size": 768,
+ "up_block_types": [
+ "UpDecoderBlock2D",
+ "UpDecoderBlock2D",
+ "UpDecoderBlock2D",
+ "UpDecoderBlock2D"
+ ]
+}
diff --git a/ SDPose-Wholebody/vae/diffusion_pytorch_model.safetensors b/ SDPose-Wholebody/vae/diffusion_pytorch_model.safetensors
new file mode 100644
index 0000000000000000000000000000000000000000..90464d67ac7303d0ee4696334df13da130a948ea
--- /dev/null
+++ b/ SDPose-Wholebody/vae/diffusion_pytorch_model.safetensors
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a1d993488569e928462932c8c38a0760b874d166399b14414135bd9c42df5815
+size 334643276
diff --git a/ SDPose-Wholebody/yolo11x.pt b/ SDPose-Wholebody/yolo11x.pt
new file mode 100644
index 0000000000000000000000000000000000000000..45d62a101c581e824243b80091905278b49f7c00
--- /dev/null
+++ b/ SDPose-Wholebody/yolo11x.pt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7bc158aa95c0ebfdd87f70f01653c1131b93e92522dbe15c228bcd742e773a24
+size 114636239
diff --git a/.gitattributes b/.gitattributes
index a6344aac8c09253b3b630fb776ae94478aa0275b..b9c39474eff5bd5955af47a2eb36f16b04437cce 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -33,3 +33,12 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text
*tfevents* filter=lfs diff=lfs merge=lfs -text
+[[:space:]]SDPose-Wholebody/assets/wholebody_anno.png filter=lfs diff=lfs merge=lfs -text
+[[:space:]]SDPose-Wholebody/SDPose-OOD-main/assets/examples/Anime.png filter=lfs diff=lfs merge=lfs -text
+[[:space:]]SDPose-Wholebody/SDPose-OOD-main/assets/examples/COCOOOD_Dataset.png filter=lfs diff=lfs merge=lfs -text
+[[:space:]]SDPose-Wholebody/SDPose-OOD-main/assets/examples/Teaser.png filter=lfs diff=lfs merge=lfs -text
+[[:space:]]SDPose-Wholebody/SDPose-OOD-main/assets/logo/logo.png filter=lfs diff=lfs merge=lfs -text
+[[:space:]]SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/hongxia.gif filter=lfs diff=lfs merge=lfs -text
+[[:space:]]SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/laoba.gif filter=lfs diff=lfs merge=lfs -text
+[[:space:]]SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/nina.gif filter=lfs diff=lfs merge=lfs -text
+[[:space:]]SDPose-Wholebody/SDPose-OOD-main/assets/video_demos/xiduo.gif filter=lfs diff=lfs merge=lfs -text